정보실

웹학교

정보실

Nodejs Node.js 및 Express.js 프레임 워크 사용 초보자 안내서

본문

목 차

  1. Introduction
  2. Creating a hello world Node.js / Express.js application
  3. Declaring API endpoints using Express.js
  4. Requests and responses
  5. Environment variables and ports
  6. Status codes and HTTP redirects
  7. Error handling
  8. HTTP headers
  9. Structuring a Node.js and Express.js application
  10. Serving static files
  11. CORS
  12. Handling and combining JSON objects using Express.js
  13. Middleware
  14. API security using Express

https://zeroequalsfalse.com/posts/beginners-guide-to-using-express-js-and-node-js-framework/ 


소개 


참고 :이 기사에서 Node, Node.js는 서로 바꿔 사용할 수 있습니다. 이것은 Express 및 Express.js에도 적용되며 일반적으로 정확히 동일한 프레임 워크를 나타내는 데 사용됩니다. 이 프레임 워크는 서버 측에서 Javascript 코드를 실행하는 데 사용되며 빠르고 확장 가능한 서버 응용 프로그램을 구축하는 데 사용됩니다.


https://nodejs.org/en/download/ 목록에서 운영 체제 (Windows, Linux 등)를 선택하여 Node.js를 다운로드하여 설치하십시오.


Node.js를 다운로드하면 Express.js 프레임 워크를 사용할 준비가 되었습니다. Express.js를 설정하려면 시작하기 위해 Node.js 프로젝트를 작성해야 합니다.


다음 명령을 실행하십시오.


mkdir my-node-express-app

cd my-node-express-app

npm init


필수 필드 (이름 및 버전)와 기본 필드에 대한 응답을 제공하십시오. 

name : Node.js 프로젝트의 이름. 버전 : 초기 프로젝트 버전. 시맨틱 버전 관리 지침을 따르고 1.0.0부터 시작하는 것이 좋습니다. 

main : 다른 응용 프로그램에 모듈이 필요할 때 로드 될 파일의 ​​이름입니다. 

기본 이름은 index.js입니다. Express.js를 사용하고 있으므로 app.js 파일을 응용 프로그램의 시작점으로 지정합니다. Express 애플리케이션을 빌드 할 때의 표준입니다.


Express.js 설치 


Node.js 프로젝트를 설정하고 시작할 준비가 되었으므로 Express.js를 설치할 준비가 되었습니다. 

터미널 내부에서 아래 명령을 실행하여 Express를 설치하십시오.

npm install --save express 


짜잔! 그렇게 쉬운. 이제 Express.js 프레임 워크를 사용하여 최신의 REST 웹 서비스를 구축 할 수 있습니다.


REST란 무엇입니까? 

REST (Representational State Transfer)는 웹 서비스를 구현하는 방법입니다. 

모든 것이 자원이라는 것이 이념입니다. 

모든 자원은 고유 한 URI (Uniform Resource Indicator)로 식별됩니다. 

REST에서 주목해야 할 중요한 점은 상태 비 저장이라는 것입니다. 

이는 REST 웹 서비스와 상호 작용하여 데이터를 검색 할 때 최신 상태의 자원 만 수신한다는 의미입니다. 

예를 들어, 다른 요청을 보내면 수신 된 데이터가 첫 번째 요청과 다를 수 있습니다. 

REST API는 주로 HTTP를 사용하여 구현되지만 다른 프로토콜과 함께 사용할 수도 있습니다. 

REST의 장점은 무엇입니까?

  • Flexibility - 데이터는 자원이나 방법에 묶여 있지 않습니다
  • Scalable - 많은 수의 요청 지원
  • Reliable - 단일 실패 지점 없음
  • Handles Common Data Formats - JSON과 같은

{"apple":5,"pear":5,"grapes":25,"strawberries":40} 


위의 데이터는 재고 품목과 관련 가격입니다. 

이 데이터는 다른 시스템에서 구문 분석하여 사용할 수 있습니다. 

사람이 읽을 수 있는 텍스트를 사용하는 개방형 표준 파일 형식 인 JSON 형식 (Javascript-Object-Notation)입니다.


Node.js 모듈 


모듈이 JavaScript 라이브러리와 동일하다고 생각할 수 있습니다. 

그것들은 단순히 응용 프로그램에 포함 시키고 자하는 일련의 기능입니다. 

Express.js 자체는 모듈이며 Express 응용 프로그램에서 사용하는 미들웨어 및 데이터베이스 라이브러리도 Node.js 모듈입니다. 명심하십시오!


나중에 자신의 Node.js 모듈을 작성하는 방법을 배울 수 있습니다. 


Hello World Node.js / Express.js 애플리케이션 작성 


빌드 할 수 있는 가장 간단한 Node Express 응용 프로그램은 전 세계의 사례입니다.


이를 통해 필수 사항을 제공하고 REST API를 구축 할 수 있습니다.


const express = require('express') const app = express() const port = 3000 app.get('/', (req, res) => res.send('Hello World!')) app.listen(port, () => console.log(`Example app listening on port ${port}!`)) 


참조-문서에서 직접 


일반적으로 이 크기의 프로그램을 한 줄씩 분석하는 것이 가장 좋습니다. 

시작점을 이해하는 데 도움이 되며 더 나은 기초에서 건축을 시작할 수 있습니다.

  • Line #1 - 여기에 명시 적 종속성을 로드 하는 위치가 있으므로 프레임 워크 자체를 사용하기 위한 참조 점이 있습니다.
  • Line #2 - 여기에 우리는 우리의 표현 응용 프로그램을 설치합니다
  • Line #3 - 예를 들어 급행 서버가 실행될 포트 번호를 선언합니다. 로컬 호스트 : 3000
  • Line #4 - 여기서 첫 번째 Express.js 경로 또는“API 엔드 포인트”를 선언합니다.
  • Line #5 - 서버를 시작하고 지정된 포트 (이 경우 3000)에서 실행을 시작합니다.


Express.js를 사용하여 API 엔드 포인트 선언 


Express 애플리케이션에서 API 엔드 포인트 선언은 애플리케이션 요구 사항에 따라 다릅니다. 

사용자 세부 사항 만 처리하여 POST 요청을 수신하고 해당 세부 사항을 일부 유형의 데이터베이스에 저장해야 할 수도 있습니다. 

지원되는 HTTP 메소드는 GET, POST, PUT, DELETE입니다. 

전체 목록은 app.METHOD를 참조하십시오. Express 애플리케이션의 아키텍처에 대해 생각할 때 라우트가 주기 내에 미들웨어 기능이 필요한 경우에는 캡슐화를 시도하십시오. 

경로는 종종 Express의 미들웨어와 함께 사용되며 가장 일반적으로 오류 처리입니다. 

미들웨어는 Express에서 지원되며 일반적으로 App.use() 기능을 사용하여 미들웨어 루틴을 정의하여 구현할 수 있습니다.

Express 응용 프로그램을 설계 할 때 고려해야 할 또 다른 개념은 Router를 사용하는 것입니다. 

라우터가 독립형 미니 응용 프로그램의 역할을 하므로 Express 응용 프로그램을 더 작은 구성 요소로 분할 할 수 있습니다. 

그런 다음 각 구성 요소를 app.js 파일로 가져 와서 사용할 수 있습니다. 

경로 자체는 단순히 콜백 함수이며 경로 경로로 창의성을 발휘할 수 있습니다.


route 경로 전체 목록 


참고 : 경로로 수행 할 수 있는 멋진 패턴 일치가 있습니다.


요청 및 응답 


Express.js에는 클라이언트-서버 통신을 처리 할 때 두 가지 주요 객체가 있습니다. 

하나는 HTTP 헤더, 본문 및 쿼리 매개 변수와 같이 HTTP와 관련된 정보를 포함하는“요청 개체”입니다. 

예를 들어, 클라이언트가 서버에 요청을 보내는 경우 "예 : apples = 5”인 경우 이 정보는 요청 (또는 명시 적 호출이라고 하는 req) 오브젝트에서 추출한 다음 경로 선언 내부에서 사용할 수 있습니다.


요청 오브젝트에서 데이터를 추출하는 일반적인 예로는 req.cookies, req.hostname, req.body, req.params, req.secure 등이 있습니다.


요청 객체의 전체 메소드 목록은 여기에서 찾을 수 있습니다.


다른 주 개체는 "응답 개체"이며 이는 Request 개체와 반대입니다. Express에서 요청자에게 전송되는 발신 오브젝트입니다. 

응답 오브젝트에는 클라이언트 측으로 전송되는 정보가 포함됩니다. 

이것은 hello world !, 200의 상태 코드, 쿠키 정보 등을 보여주는 브라우저로 다시 전송되는 텍스트 문자열 일 수 있습니다. 

여기에는 애플리케이션에 적합한 응답을 공식화하는 데 사용되는 메소드가 포함됩니다.


일반적으로 사용되는 응답 방법 


– 성공 상태 코드 보내기


HTTP 200 상태 코드는 SUCCESS를 나타냅니다. 서버와의 통신이 성공적으로 이루어졌으며 서버에서 다시 확인을 보냅니다.


res.send(200) 


– 리디렉션 보내기


res.redirect('\to-another-page') 


일부 데이터 작업 또는 처리를 수행 한 후 다른 페이지로 리디렉션 할 수 있습니다. 리디렉션 방법은 응답 객체에서 다른 경로로 리디렉션 하는 데 사용됩니다.


– 404 리디렉션 보내기


res.status(404).send('woops! Page does not exist!') 


빠른 응답 경로는 우리가 친숙한 것 일 수도 있습니다. 오래된 멍청한 페이지는 존재하지 않습니다! 404 리디렉션 이 특정 정보는 응답 객체와 함께 전송됩니다.


상태와 메시지를 한 줄로 보내면 매우 만족스러울 수 있습니다.


– JSON 데이터 전송


res.send({ user: ‘bob’}) 


Express를 사용하여 서버에서 JSON 데이터를 보내는 훌륭하고 간단한 방법입니다.


– 응답에 쿠키 설정


res.cookie('name', 'john', { domain: '.example.com', path: '/admin', secure: true }) 


– 응답 프로세스 종료


res.end() 


– 자원 또는 파일 다운로드 시작


res.download(‘/my-report.pdf)` 


일반적으로 브라우저는 API 엔드 포인트에 도달 할 때 파일을 다운로드하기 전에 사용자에게 프롬프트합니다.


데이터를 보내지 않고 응답 프로세스를 정상적으로 처리하는 데 사용됩니다.


상태 코드 및 리디렉션 


HTTP 상태 코드는 서버가 클라이언트에 대한 기본 응답을 발행 할 수 있는 메커니즘을 제공하므로 프로덕션 등급 Express 응용 프로그램에서 광범위하게 사용됩니다. 

상태 코드는 특히 네트워크 전송 계층에서 사용됩니다. 

예를 들어, 상태 코드 200은 "모든 것이 정상"으로 해석 될 수 있습니다. 

상태 코드 클래스가 있으며 특정 범위 내에서 분할됩니다. 기억하기 쉬운 목록으로 분류했습니다.


상태 코드 범위 : 

  • 100s 정보
  • 200s 성공.
  • 300s 리디렉션
  • 400s 클라이언트 오류
  • 500s 서버 오류

상태 코드는 종종 시나리오에 가장 적합한 것으로 선택됩니다. 

예를 들어 요청이 성공적으로 수신되면 200 상태 코드를 보낼 수 있습니다. 

그렇지 않으면 경로에 문제가 있는 경우 Express 서버에 오류가 있음을 나타내는 500 상태를 다시 보낼 수 있습니다.


리디렉션은 종종 3xx 대역의 상태 코드와 함께 사용됩니다. 

예를 들어, 301 리디렉션 상태 코드를 사용하여 다른 위치로 이동 한 웹 페이지를 리디렉션 하는 데 사용됩니다.


res.redirect(301, 'http://example.com') 


Express 리디렉션 방법은 브라우저를 다른 사이트로 리디렉션하여 정규화 된 URL을 처리 할 수도 있습니다.


res.redirect('http://zeroequalsfalse.com') 


Express.js의 오류 처리 


Express에는 즉시 오류 처리기가 포함되어있어 대부분의 무거운 작업을 수행하지 않고도 시작할 수 있습니다. 

Express의 내장 오류 처리기는 라우팅 및 미들웨어 프로세스를 처리합니다.


– 기본 오류 처리


app.get('/', function (req, res) { throw new Error('There has been an error') }) 


동기 코드를 작성할 때 오류를 발생 시키는 방법의 예입니다. Express는 이를 포착하여 필요한 조치를 수행합니다.


또는 비동기 코드의 경우 다음 함수를 사용하면 오류가 Express로 전달됩니다.


app.get('/', function (req, res, next) { fs.readFile('/file-not-there', function (err, data) { if (err) { next(err) } else { res.send(data) } }) }) 


오류 처리에 대한 자세한 내용은 여기를 참조하십시오.


환경 변수 및 포트 


포트 및 환경 변수는 일반적으로 프로덕션 급 익스프레스 애플리케이션에서 사용됩니다.


Express 응용 프로그램이 청취하도록 PORT 변수를 구체적으로 설정할 수 있습니다. 

기본 포트 번호는 3000이지만 일부 시스템에서는 특정 앱이 특정 포트 범위 내에서 수신 대기 할 수 있으므로 주의하여 서버 포트 충돌을 피하십시오.


다음과 같은 방법으로 포트를 수동으로 설정할 수 있습니다.


app.set('port', process.env.PORT || 3000) 


이는 환경 변수 PORT에서 포트 번호를 사용하도록 Express 환경에 지시합니다. 터미널을 사용하여 설정할 수 있습니다.


PORT=8080 


또는 포트 번호를 Node / Express 응용 프로그램으로 전달하여 :


PORT=8080 node app.js


그러면 Express 응용 프로그램의 포트 번호가 기본 3000 (위 코드에서) 대신 8080으로 설정됩니다.


HTTP 헤더 


Express 프레임 워크를 사용하여 HTTP 헤더를 설정할 수 있습니다. 

Express 응용 프로그램에서 데이터를 다시 전송하여 데이터 형식을 변경하려는 경우 정말 좋습니다.


이 작업을 수행하는 방법은 간단합니다.


res.set(‘Content-Type', 'application/json') 


set 메소드를 사용하여 응답 오브젝트에 대한 HTTP 헤더의 특정 값을 설정할 수 있습니다. Express 애플리케이션에서 클라이언트 측으로 보내는 응답입니다. Content-Type 외에 더 많은 값을 설정할 수 있으며 다음과 같습니다.


res.set('Content-Length', '127') 


이것은 HTTP 헤더 Content-Length를 설정하여 응답이 127이 되도록 지정합니다. 이는 본문의 메시지가 나타내는 옥텟 수입니다.


res.set('Keep-Alive', 'true') 


신뢰 프록시를 설정하면 예를 들어 HTTP 헤더 값이 설정됩니다. 

X-forwarded-For : 127.0.0.1은 신뢰할 수 있습니다. 이것은 원격 클라이언트 IP 주소를 명시 적으로 제공합니다.


res.set('trust proxy', '127.0.0.1') 


맞춤 헤더 설정 중…


res.set('X-Hello', 'World') 


Express 애플리케이션 내부의 응답 오브젝트에서 HTTP 헤더를 수정할 수 있는 다양한 방법이 있습니다. 

Wireshark와 같은 도구를 사용하여 직접 설정하고 응답 코드를 분석하여 작동 방식에 대한 느낌을 얻는 데 도움이 됩니다.


Node.js 및 Express.js 애플리케이션 구조화 


Node Express 응용 프로그램의 구조화는 개발자가 유지 보수가 용이하고 확장하기 쉬운 방법으로 응용 프로그램을 빌드 할  방법을 제공하므로 중요합니다.


다음은 간단한 MVC (Model-View-Controller) Node Express 앱의 구조입니다. 

간단한 CRUD (Create-Retrieve-Update-Delete) 응용 프로그램입니다.


project/ controllers/ users.js util/ plugin.js middlewares/ auth.js models/ user.js routes/ user.js router.js public/ js/ css/ img/ views/ users/ index.pug tests/ users/ create-user-test.js update-user-test.js get-user-test.js .gitignore app.js package.json 


models : 모델은 컨트롤러와 데이터베이스 사이에 있습니다. 데이터베이스에 연결하기 전에 모델 스키마를 빌드 할 수 있습니다. Mongoose와 같은 훌륭한 ORM 도구를 사용하면 스키마를 작성하는 데 도움이 됩니다.


routes : 지금까지 기본 hello world 앱만 살펴 봤지만 프로덕션 급 Node Express 애플리케이션의 경우 노선을 분할하여 노선 폴더 안에 모두 보관합니다. 예를 들어, user.js 파일에서 사용자 조작 및 애플리케이션의 서브 루트를 포함하여 사용자와 관련된 모든 것을 정의 할 수 있습니다.


router.post('/users/create', controller.create)

router.put('/users/:userName', controller.update)

router.get('/users', controller.getAll)


controllers : 여기에서 route 처리기를 지정하고 경로가 진행되는 위치와 이스케이프 처리 된 비즈니스 논리를 지정합니다.


util : 여기에는 모든 컨트롤러에서 사용할 수 있는 유틸리티 / 헬퍼 기능이 포함되어 있습니다. 예를 들어 calculateEuclideanDistance (a, b)와 같은 함수를 작성할 수 있습니다.


middlewares : 요청을 라우트 핸들러로 보내기 전에 모든 수신 요청을 방해하는 미들웨어를 작성할 수 있습니다. 예를 들어, router.post ( '/ login', auth, controller.login) 여기서 auth는 인증 프로세스를 처리하기 위해 middlewares / auth.js에 정의 된 미들웨어 함수입니다.


public : 공용 폴더는 정적 파일을 저장하는 데 사용됩니다. 일반적으로 index.html, / img의 이미지, / js의 javascript 파일 및 CSS 파일 / css입니다.


views : 서버에서 렌더링 할 템플릿이 포함되어 있습니다. pug, jade 등과 같은 많은 템플릿 엔진이 있습니다. 여기에서 모델의 데이터로 프런트 엔드를 업데이트하는 데 사용되는 템플릿을 정의 할 수 있습니다.


tests : tests 폴더는 모든 응용 프로그램 테스트 파일을 포함합니다.


app.js : Express 응용 프로그램의 기본 파일이며 전체 Express 응용 프로그램을 통합합니다.


package.json :이 파일에는 프로젝트 종속성, 스크립트 및 테스트, 버전 관리에 대한 정보가 포함되어 있습니다.


정적 파일 제공 


Express.js를 사용하여 정적 파일을 제공하는 것은 간단합니다.


app.use(express.static('public')) 


대부분의 Express 응용 프로그램은 공용 폴더를 사용하여 정적 파일을 저장합니다. 

다시 말하지만, 이들은 일반적으로 index.html, / img의 이미지, / js의 javascript 파일 및 CSS 파일 / css입니다. 그러나 Express 응용 프로그램에서 공개하려는 다른 파일을 저장할 수 있습니다. 

예를 들어 https://my-developer-profile.com/my-report.pdf에서 액세스 할 수있는 my-report.pdf 일 수 있습니다.


Express.js 프레임 워크를 사용하여 별도의 정적 파일을 제공하기 위해 공통 npm 라이브러리, serve-index 및 serve-favicon을 활용할 수 있습니다. 

이 라이브러리는 Express에서 정적 파일을 제공하는 부트 스트랩에 도움이 됩니다.


npm install --save serve-index

npm install --save serve-favicon


CORS 


브라우저에서 실행되는 Javascript 응용 프로그램은 동일한 도메인 내의 리소스에만 액세스 할 수 있습니다. 

기본적으로 브라우저는 원본 간 HTTP 요청을 제한합니다. 

js 스크립트, 이미지 및 스타일을 로드하는 것은 완벽합니다. 

그러나 다른 도메인 / 서버에 대한 XHR 및 Fetch 호출은 거의 확실하게 실패하고 브라우저에 의해 차단됩니다.


리소스를 액세스하려는 도메인이 연결을 허용하는 방법을 구체적으로 구현하지 않는 한.


이것은 드럼 롤입니다, CORS 🎉


CORS 또는 Cross-Origin 리소스 공유는 브라우저에서 한 출처에서 실행 중인 웹 응용 프로그램에 다른 출처에서 선택한 리소스에 액세스하도록 지시하는 메커니즘입니다. 

추가 HTTP 헤더를 사용하여 이를 수행합니다. 

예를 들어 https://blog.app.com/은 XMLHttpRequest를 사용하여 https://shop.app.com/data.json을 요청합니다.


CORS를 구현하는 서버는 HTTP 응답 헤더를 수정하여 이를 수행합니다. Express 프레임 워크에서 이를 수행하기 위해 다음을 수행합니다.


npm install --save cors 


….


app.use(cors())


Express.js를 사용하여 JSON 객체 처리 및 결합 


사람이 읽을 수 있는 텍스트를 사용하는 개방형 표준 파일 형식 인 JSON 형식 (Javascript-Object-Notation). 

JSON은 Javascript 객체로 변환하여 Express 응용 프로그램에서 사용할 수 있습니다. 

그 후 Express 응용 프로그램은 오브젝트 내부의 데이터를 사용하여 데이터 처리를 수행하고 데이터베이스에 저장하는 등의 작업을 수행 할 수 있습니다.


Express 애플리케이션에서 HTTP 헤더 요청 및 응답을 지정하여 Express가 JSON을 처리 할 수 ​​있도록 Content-type : application / json을 허용하도록 지정할 수 있습니다.


유용하다고 생각되는 일반적인 방법은 JSON 객체 내부의 데이터에 액세스하는 것입니다. 

이는 일반적으로 본문 파서 라이브러리를 설치하고 Request 객체를 통해 JSON 객체에서 데이터를 추출하여 수행됩니다. 이것은 다음과 같습니다.


npm install --save body-parser 


var bodyparser = require('body-parser')

// create application/json parser

var jsonParser = bodyParser.json()

app.post('/api/users', jsonParser, function (req, res) {

  // create user in req.body

})


사용자 정보가 저장되어 req.body를 통해 액세스 할 수 있으며 jsonParser가 요청 내 미들웨어로 사용됩니다. 

이제 본문 필드에 액세스 할 수 있으며 여기에는 사용자에 대한 정보가 포함될 수 있습니다. 

이것은 req.body.userName 또는 req.body.userID처럼 보일 수 있습니다.


어떤 단계에서는 여러 데이터 소스의 데이터를 결합하고 단일 JSON 오브젝트를 리턴해야 합니다. 

Node.js / Express에서 쉽게 수행 할 수 있습니다.


app.get('/combined', (_, res) => {

  const json1 = { name: 'John', age: 31, city: 'New York' };

  const json2 = { relative: 'Ann', age: 50, city: 'San Francisco' };

  const json3 = {

    ...json1,

    ...json2

  };

  res.send(json3);

  res.end();

});


JSON 데이터를 결합하는 다른 방법은 요청에서 특정 데이터 필드를 추출한 다음 사용자 정의 JSON 오브젝트를 빌드하는 것입니다. 예를 들어, 버스 / 라우트 애플리케이션 :


var name = req.body.name  

var busDriverName = driverName  //a global variable 


var text = `{ passengers:  { “passenger”:` + name + `}, { “driverName”:` + busDriverName + `} }`  

var obj = JSON.parse(text)


미들웨어 


Alt Text! 


미들웨어는 요청 및 응답 오브젝트 모두에 액세스하여 Node / Express 애플리케이션에 액세스 할 수 있습니다. 

Express는 또한 요청 및 응답주기에서 다음 미들웨어 함수를 호출하는 next() 함수를 제공합니다. 

이를 통해 요청 오브젝트 또는 응답이 일련의 위생 처리 또는 데이터 처리 단계를 거쳐 최종적으로 경로를 종료 할 수 있습니다.


다음은 Express.js에서 미들웨어를 사용하는 예입니다. 

문자 'A'로 시작하는 항목 이름 만 저장하는 응용 프로그램입니다. 단일 급행 경로에 대한 단일 미들웨어 단계.


var express = require('express')

var app = express()


var storeItemStartingA = function (req, res, next) {


   // Data insertion step 

   // if req.body.itemName starts with A, insert to DB 

   // ...


  console.log('DATA SAVED')

  next()

}


app.use(storeItemStartingA)


app.post('/items/:itemName', function (req, res) {

  res.send('Thank you! We will be back in touch with you soon')

})


app.listen(3000)


storeItemStartingA는 요청 오브젝트 내부의 / items / 엔드 포인트에 게시 된 모든 항목에 적용되는 미들웨어 기능입니다.


Express를 사용한 API 보안 


웹과 HTTP를 사용하여 악용 될 수 있는 몇 가지 일반적인 취약점이 있기 때문에 프로덕션 급 Express 응용 프로그램의 보안이 필수적입니다. 

이 섹션에서는 일반적인 공격과 npm 라이브러리를 사용하여 무거운 물건을 들지 않고 훨씬 빠르게 설정하는 데 도움이 되는 방법을 살펴 보겠습니다.


DOS 공격 방지 


DOS 또는 서비스 거부 공격은 일반적인 공격으로, 공격자가 빠른 속도로 신적인 양의 데이터를 요청하여 http 서버를 오버로드합니다. 

서버가 처리하기에는 너무 많아 져 강제로 종료되거나 오프라인 상태가 됩니다.


다음과 같은 간단한 단계를 수행하여 DOS 공격을 방지 할 수 있습니다.

  • 요청 속도 제한

npm install --save express-rate-limit 


const rateLimit = require("express-rate-limit");

 const limiter = rateLimit({

  windowMs: 15 * 60 * 1000, // 15 minutes

  max: 100 // limit each IP to 100 requests per windowMs

});

app.use(limiter);


위의 코드는 속도 제한 라이브러리를 사용하여 각 IP 주소의 요청 양을 제한합니다. 

이것은 우리의 Express 앱에 웹 서버의 플러딩 요청을 막을 수 있는 좋은 기본 보호 방법을 제공합니다.

  • 알려진 IP 주소 차단

DOS 공격을 완화하는 또 다른 방법은 알려진 공격자 또는 알려진 IP 주소를 차단하는 것입니다. 의심스러운 요청을 하는  요청자의 IP 주소가 있는 경우 이를 달성 할 수 있습니다.


const ipBlock = require('express-ip-block');

const ips = ['216.27.61.137'];

const options = { allowForwarded: true };

 

app.get('/', ipBlock(ips, options), (request, response, next) => response.render('index'));

  • HTTP 헤더 주입으로부터 보호

HTTP 헤더는 공격자가 웹 서버를 가로 채기 위해 데이터를 주입하고 조작하는 데 매우 취약합니다. 

예를 들어 XSS (Cross-Site Scripting)는 웹에서 일반적으로 사용되는 방법으로 악의적 인 코드를 Referer 헤더 또는 쿠키 페이로드에 삽입합니다. 

공격은 요청 객체에 코드를 포함 시키고 웹 서버는 무의식적으로 악성 코드를 응답 객체에 포함 시킵니다.


Request:

http://example.com/redirect.asp?origin=bob

Response:

HTTP/1.1 302 Object moved

Date: Tues, 13 Mar 2020 15:32:13 CST

Location: account.asp?origin=bob

Connection: close

Content-Length: 140


이러한 유형의 공격을 완화하고 HTTP 헤더를 안전하게 유지하려면 헬멧을 사용하십시오. 

Express.js는 일련의 소프트웨어 라이브러리를 사용하여 유효성 검사를 제공하며 커뮤니티에서 신뢰하므로 권장합니다.


npm install --save helmet 


const helmet = require('helmet')

const app = express() 

app.use(helmet())



페이지 정보

조회 51회 ]  작성일20-02-13 10:52

웹학교