분류 Nodejs

NodeJS 애플리케이션 또는 보안 API를 작성하는 방법

컨텐츠 정보

  • 조회 309 (작성일 )

본문

백엔드 또는 전체 스택 (웹) 개발자인 경우 DOS 공격, XSS, SQL / NoSQL 주입 공격 등의 용어를 들었을 수 있습니다.


이러한 공격이 매우 위험하다는 사실을 이미 알고 있을 수 있으므로 최대한 응용 프로그램 (또는 API)을 안전하게 만들어야 합니다. 그러나 정확히 어떻게?

1*BNXNr9rzY_C8aqcjo5HDQw.png 


https://itnext.io/make-security-on-your-nodejs-api-the-priority-50da8dc71d68 



이 기사에서는 자신의 프로젝트에 적용 / 구현하고 앱 또는 API를 안전하게 만들 수 있는 모범 사례를 보여줍니다. 그러나 먼저 이러한 공격에 익숙하지 않은 경우 하나씩 공격 해 봅시다!


서비스 거부 (DOS) 공격 


DOS 공격은 네트워크 또는 시스템을 충돌 / 종료하여 액세스 할 수 없게 합니다. 예를 들어 사용자는 애플리케이션에 액세스 할 수 없습니다. 공격자는 지속적으로 요청을 전송하고 트래픽을 생성하며 모든 종류의 정보를 많이 전송하여 이를 수행합니다. DOS 공격을 통해 공격자는 서비스를 느리게 만들거나 완전히 중단 시킬 수 있습니다.


사이트 간 스크립팅 (XSS) 공격 


XSS 공격은 일종의 주입입니다. 공격자는 악성 스크립트를 브라우저 쪽 스크립트 형태로 주입합니다. 일반적으로 해당 양식의 유효성이 확인되거나 인코딩되지 않은 경우 입력 양식에서 발생합니다.

XSS 공격을 통해 공격자는 쿠키, 세션 토큰 또는 기타 민감한 데이터에 액세스 할 수 있습니다. 또한 이 스크립트는 페이지의 HTML 내용을 다시 작성할 수 있습니다.


무차별 대입 공격 


무차별 대입 공격은 사용자 암호 또는 PIN (개인 식별 번호)과 같은 중요한 데이터를 얻는 데 사용되는 방법입니다. 이러한 공격에서 공격자는 대부분 자동화 된 소프트웨어를 사용하여 원하는 데이터의 가치에 대해 많은 추측을 합니다. 무차별 대입 공격을 통해 공격자는 암호화 된 데이터 (암호, PIN)를 해독 할 수 있습니다.


SQL / NoSQL 주입 공격 


SQL / NoSQL 주입 (SQLi) 공격은 일종의 주입 공격입니다. SQL / NoSQL 주입은 공격자가 악의적 인 SQL / NoSQL 문을 실행할 수 있게 합니다. 공격자는 데이터베이스에 연결된 응용 프로그램의 특정 필드에 SQL / NoSQL 명령 (쿼리)을 삽입하기 만하면 SQL / NoSQL 주입 공격을 수행 할 수 있습니다 (예 : 로그인을 위한 POST 요청).


SQL / NoSQL 주입 공격을 통해 공격자는 인증, 권한 부여를 우회하고 전체 SQL / NoSQL 데이터베이스의 내용을 검색하고 데이터베이스의 데이터를 추가, 수정, 삭제할 수 있습니다.


자신의 프로젝트에서 이러한 공격이 발생하는 것을 방지하는 방법은 무엇입니까? 


맞습니다. 이러한 공격에 대해 조금 배운 후 문제는 실제로 자신의 응용 프로그램 / API에서 공격이 발생하지 않도록 하는 방법입니다. 다시 한 번, 이러한 공격을 방지하는 방법에 대한 모범 사례를 하나씩 보여 드리겠습니다.


DOS 공격 방지 


1. DOS 공격 방지를 다룰 때 가장 먼저 고려해야 할 것은 사용자가 앱 / API / 서비스에 제출할 수 있는 실제 페이 로드를 제한하는 것입니다. 본문 파서를 사용하여 본문 페이 로드를 제한 할 수 있습니다. ExpressJS를 백엔드 프레임 워크로 사용하는 경우 황금색입니다. ExpressJS에는 사용할 수 있는 바디 파서가 내장되어 있습니다.

const express = require('express');
const app = express();
app.use(express.json({ limit: '10kb' })); // Body limit is 10


2. 또 다른 유용한 표현 기능은 표현 속도 제한 종속성입니다. 이 종속성을 통해 사용자의 속도 제한을 설정할 수 있습니다. 따라서 기본적으로 각 사용자에 대해 최대 요청 수를 설정할 수 있습니다. 사용자가 모든 요청을 사용한 후 특정 시간 동안 그를 잠글 수 있습니다.


Express-rate-limit를 구성하는 방법은 다음과 같습니다. — npm install express-rate-limit-NPM을 사용하여 설치


const limit = rateLimit({
max: 100,// max requests
windowMs: 60 * 60 * 1000, // 1 Hour
message: 'Too many requests' // message to send
});
app.use('/routeName', limit); // Setting limiter on specific route 


XSS 공격 방지 


1. 우선, 입력시 사용자 데이터를 삭제할 수 있습니다. 이것은 구현하기가 매우 쉽고 xss-clean이라는 또 다른 유용한 종속성을 사용할 수 있습니다. 이러한 의존성으로 인해 사용자가 입력시 HTML 및 스크립트를 삽입 할 수 없습니다.


xss-clean을 구성하는 방법은 다음과 같습니다. — npm install xss-clean-NPM을 사용하여 설치


// Data Sanitization against XSS
app.use(xss()); 


2. 헬멧 의존성을 사용하여 프로젝트에 특별한 HTTP 헤더를 제공하십시오. 헬멧은 미들웨어 기능의 모음입니다. 기본적으로 모든 미들웨어 기능이 포함되어 있지는 않지만 나머지 미들웨어 기능을 수동으로 활성화 할 수 있습니다. 이 링크를 확인하여 다른 미들웨어 기능을 볼 수 있습니다.


헬멧을 구성하는 방법은 다음과 같습니다. 코드 상단에 선언해야 합니다.

— npm install helmet-NPM을 사용하여 설치


app.use(helmet()); 


3. 예를 들어 익스프레스 세션 대신 JWT (JSON Web Tokens)를 사용하는 경우 JWT를 쿠키에 저장하는 것을 고려해야 합니다. 또한 JWT 저장을 위한 쿠키가 HTTP 전용인지 확인하십시오!


무차별 대입 공격 방지 


1. 무차별 대입 공격을 처리 할 수 있는 가장 효율적인 방법 중 하나는 로그인 시도 또는 사용자가 암호, 특수 코드 또는 PIN을 삽입해야 하는 인증 관련 제한을 설정하는 것입니다.


2. 다음으로 ExpressJS를 사용하는 경우 Express-rate-limit 종속성을 구현할 수 있습니다. 실제로 우리는 DOS 공격 방지에서 구현했습니다. 그러나 이 종속성은 Brute Force 공격과 DOS 공격 모두에 적용됩니다.


3. 민감한 데이터 (암호, PIN)를 추측 할 때 공격자의 속도를 늦추고 삶을 조금 더 어렵게 만들기 위해 bcrypt 의존성을 구현할 수 있습니다. Bcrypt는 비밀번호와 같은 민감한 데이터를 암호화하여 추측하기 어렵게 합니다. Bcrypt는 약간 복잡한 종속성이지만 자세한 내용을 알고 싶다면 이 링크를 확인하십시오.


4. 무차별 대입 공격 가능성을 낮추는 또 다른 방법은 2 단계 인증 프로세스 또는 2 단계 인증을 구현하는 것입니다. 이를 구현하려면 몇 줄의 코드가 필요하므로 여기에 도움이 되는 링가 있습니다!


SQL / NoSQL 주입 공격 방지 


1. SQL 또는 NoSQL 데이터베이스를 사용하는 경우 데이터를 삭제해야 합니다.

SQL 데이터베이스를 사용하는 경우 node-mysql 종속성 사용을 고려해야 합니다. 여기서 node-mysql에 대해 자세히 알아보십시오. NoSQL 데이터베이스 (MongoDB) 및 ExpressJS로 작업하는 경우 express-mongo-sanitize 종속성 사용을 고려하십시오.


mongo-sanitize를 구성하는 방법은 다음과 같습니다. — npm install express-mongo-sanitize-NPM을 사용하여 설치


app.use(mongoSanitize()); 


2. MongoDB로 작업하는 경우 오브젝트 데이터 모델링 도구 (ODM) Mongoose를 사용하십시오. Mongoose를 사용하면 각 문서마다 스키마 및 스키마 유형을 정의하여 처음부터 안전하게 만들 수 있습니다. 몽구스는 자체적으로 매우 복잡하지만, 깊이 들어가고 싶다면 이 링크를 확인하거나 충돌 과정을 밟아 이동 중에 배우는 것이 좋습니다!


이러한 종속성을 구현 한 후 기본 앱 파일은 다음과 같습니다.


// Importing Dependencies
const express = require('express');
const rateLimit = require('express-rate-limit');
const helmet = require('helmet');
const mongoSanitize = require('express-mongo-sanitize');
const xss = require('xss-clean');
const app = express();// Helmet
app.use(helmet());
// Rate Limiting
const limit = rateLimit({
max: 100,// max requests
windowMs: 60 * 60 * 1000, // 1 Hour of 'ban' / lockout
message: 'Too many requests' // message to send
});
app.use('/routeName', limit); // Setting limiter on specific route
// Body Parser
app.use(express.json({ limit: '10kb' })); // Body limit is 10
// Data Sanitization against NoSQL Injection Attacks
app.use(mongoSanitize());
// Data Sanitization against XSS attacks
app.use(xss());


요약 


이것들은 응용 프로그램이나 API를 안전하게 만들기 위해 자신의 프로젝트에서 사용할 수 있는 몇 가지 방법, 사례입니다. 내가 포함 한 참고 문헌에 따라 더 자세히 살펴 보거나 직접 독자적으로 더 자세히 조사 할 수 있습니다.


개인 프로젝트에서 이 수준 이상의 보안을 구현할 것을 적극 권장합니다. 백엔드 애플리케이션의 보안을 유지하는 것은 실제로 가치가 있으며 실제로 훌륭한 기술입니다. 내 제안은 포트폴리오 / 이력서에 표시하는 프로젝트의 규모에 관계없이 항상 보안을 포함한다는 것입니다. 보안이 얼마나 중요한지 이해하고 있다는 것을 고용주가 알고 싶어합니다. 또한 데이터를 개인 및 보안으로 만드는 데 익숙하다는 것을 보여 주려고 합니다.


이 모든 작업을 수행 한 후에는 앱 / API를 최대로 테스트하여 보안 취약점을 발견하고 패치를 적용하거나 항상 다음 단계로 끌어 올려 다음과 같은 보안을 강화할 수 있습니다. 이메일 확인, csurf 추가, 암호화 된 비밀번호 강화 등