배워서 남주는 개발자 :)

Web

[Library] Helmet - header에 사용함으로써 express 보안 강화

핏짜보이 2022. 5. 4. 09:02
반응형

[헤더에 씌운다고 해서 헬멧이라는데... 귀엽다...ㅎ]

1.사용법

npm install helmet;  //app.js에 추가하기 const helmet = require("helmet"); const express = require("express"); const app = express();  app.use(helmet());

 

2.무엇을 보호할까?

 

[헬멧의 미들웨어 함수]

1) csp

csp는 Content-Security-Policy이다.

브라우저에서 사용하는 컨텐츠 기반의 보안정책으로 XSS나 Data Injection, Click Jacking 등 웹페이지 악성 스크립트를 삽입하는 공격기법들을 막기 위해 사용

 

2) hidePoweredBy

헤더에서 X-Powered-By를 제거한다.

이는 서버에 대한 정보를 제공해주는 역할로 나는 이 영역에 Express라고 표기되어 있었다.

해당 정보는 악의적으로 활용될 가능성이 높기 때문에 헬멧을 통해서 제거해 주는 것이 좋다.

 

3) HPKP

Public Key Pinning 헤더를 추가하여, 위조된 인증서를 이용한 중간자 공격을 방지한다.

 

4) HSTS

HTTP Strict Transport Security의 약자로 웹사이트에 접속할때

강제적으로 HTTPS로 접속하게 강제하는 기능이다.

사용자가 특정 사이트에 접속할 때 해당 사이트가 HTTPS를 지원하는지, 하지않는지

미리 모르는 경우가 대부분이다.

 

그래서 브라우저는 디폴트로 HTTP로 먼저 접속을 시도한다.

이때 HTTPS로 지원되는 사이트였다면 301 Redirect 또는 302 Redirect를 응답하여

HTTPS로 다시 접속하도록 한다.

 

5) IeNoOPen

IE8 이상에 대해 X-Download-Options를 설정한다.

이 옵션은 8버전 이상의 인터넷 익스플로러에서 다운로드 된것들을 바로 여는 것 대신에

저장부터 하는 옵션이다.

사용자는 저장부터 하고, 다른 응용프로그램에서 열어야 한다.

 

6) noCache

클라이언트 측에서 캐싱을 사용하지 않도록 하는 설정이다.

 

7) noSniff

X-Content-Type-Options를 설정하여 선언된 콘텐츠 유형으로부터 벗어난 응답에 대한 브라우저의 MIME 스니핑을 방지한다.

MIME이란 Multipurpose Internet Main Extensions의 약자로 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 포맷이다.

브라우저는 리소스를 내려받을때, MIME 타입을 보고 동작하기 때문에 정확한 설정이 중요하다.

 

*MIME 스니핑이란 브라우저가 특정 파일을 읽을 때, 파일의 실제 내용과 Content-Type에 설정된 내용이 다르면 파일로부터 형식을 추측하여 실행하는 것인데, 편리함을 위한 기능이지만 공격자에게 악용될 가능성이 있다.

 

8) frameguard

X-Frame-Options 헤더를 설정하여 클릭재킹에 대한 보호를 제공한다.

 

*클릭재킹이란 사용자가 자신이 클릭하고 있다고 인지하는 것과 다른 것을 클릭하도록 하여 속이는 해킹 기법이다.

속이기 위해 보이지 않는 레이어에 보이지 않는 버튼을 만드는 방법이 있다.

 

9) xssFilter

X-Xss-Protextion을 설정하여 대부분의 최신 웹브라우저에서 XSS(Cross-site scripting)필터를 사용하도록 한다.

 

3.Helmet을 사용하지 않았을 때의 최소한의 보안

Express 에서는 별도의 설정이 없을 경우 X-Powered-By 헤더를 사용하도록 기본 설정이 되어있습니다.

이 X-Powered-By 헤더속에는 사용중인 서버관련 소프트웨어의 정보가 포함되어 있기 때문에

해커가 우리의 서버를 공격하기 쉬워집니다.

 

따라서 우리는 반드시 X-Powered-By 헤더를 사용해제 해줘야 합니다.

const helmet = reuire("helmet"); const express = require("express"); const app = express();  app.disable('x-powered-by');

 

 

4.Helmet 을 사용했을 때의 전/후 비교

[Before] ⇒ X-Powered-By 와 Server 항목이 그대로 노출됩니다.

 

[After] ⇒ X-Powered-By 와 Server 항목이 사라지면서 해커에게 제공될 수 있었던 서버에 대한 주요 정보가 대부분 사라졌습니다.

728x90