helmet 모듈
공식 문서 정의
Helmet helps you secure your Express apps by setting various HTTP headers.
It’s not a silver bullet, but it can help!
helmet 모듈은 Express와 함꼐 사용되는 보안 강화 모듈입니다.
HTTP 헤더 설정을 통하여 자주 발생하는 보안과 관련된 이슈 & 웹 취약점으로부터 서버를 보호해줍니다.
Express의 여러 미들웨어 모듈을 합쳐 놓은 미들웨어 패키지 모듈입니다.
정확히 말하자면, Express 기반 어플리케이션에서 HTTP response header를 설정하는 여러개의 작은 미들웨어 함수 유형 모음인 것이다.
설치
1
npm i helmet
사용방법
기본적으로 helmet은 세부적인 여러 미들웨어 함수를 포함하고 있습니다.
기본값으로 설정된 모듈들
- dnsPrefetchControl
- frameguard
- hidePoweredBy
- hsts
- ieNoOpen
- noSniff
- xssFilter
보통 기본 설정 기능을 사용하거나 세부 기능을 설정해서 사용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const express = require("express");
const helmet = require("helmet");
const app = express();
// 기본 설정 기능 사용
app.use(helmet());
// or
// 기본 설정에서 옵션 제어
app.use(
helmet({
frameguard: {
action: "deny",
},
})
);
// or
// 특정 세부 기능 하나하나 설정할때 사용
app.use(helmet.contentSecurityPolicy());
app.use(helmet.hidePoweredBy());
app.use(helmet.hsts());
app.use(helmet.noSniff());
app.use(helmet.frameguard());
app.use(helmet.xssFilter());
helmet에 포함된 미들웨어
contentSecurityPolicy (CSP)
콘텐츠 보안 정책 설정 및 구성을 통해 의도하지 않은 내용이 페이지에 삽입되는 것을 방지합니다.
XSS나 Data Injection, Click Jacking 등 웹 페이지에 악성 스크립트를 삽입하는 공격기법들을 막기 위해 사용됩니다.
hidePoweredBy
X-Powerd-By를 제거합니다.
서버 소프트웨어 정보로 악의적으로 활용될 가능성이 높아 제거해 주는 것이 좋습니다.
HTTP Strict Transport Security (HSTS)
웹 사이트에 접속할 때 HTTPS로 접속하게 강제하는 기능으로 SSL Stripping 공격을 방지합니다.
noCache
Client 측에서 캐싱을 사용하지 않도록 하는 설정입니다.
noSniff
X-Content-Type-Options를 설정하여 선언된 콘텐츠 유형으로부터 벗어난 응답에 대한 브라우저의 MIME 스니핑을 방지합니다.
MIME이란?
Multipurpose Internet Mail Extensions의 약자로 Client에게 전송된 문서의 다양성을 알려주기 위한 포맷입니다.frameguard
X-Frame-Options 헤더를 설정하여 클릭재킹에 대한 보호를 제공합니다.
xssFilter
X-XSS-Protection을 설정하여 대부분의 최신 웹 브라우저에서 XSS 필터를 사용하도록 합니다.
생소 개념 정리
SSL (Secure Socket Layer) 보안 소켓 계층
웹 사이트와 브라우저 ( 혹은 두 서버 ) 사이에 전송된 데이터를 암호화하여 인터넷 연결을 유지하는 표준 기술입니다.
이는 해커가 정보 및 금융 정보를 포함한 전송되는 모든 정보를 열람하거나 훔치는 것을 방지한다.
SSL Stripping 공격
사용자가 특정 사이트에 접속할 때 해당 사이트가 HTTPS를 지원하는지, 하지 않는지를 모르는 경우 HTTP로 먼저 접속을 시도합니다.
HTTPS로 지원되는 사이트였다면 301 Redirect나 302 Redirect를 응답하여 HTTPS로 다시 접속하도록 합니다.
이 때, 해커가 중간에 프록시 서버를 두고 나 <-> 해커 사이에서는 HTTP 통신을 하고 해커 <-> 웹 사이트 사이에선 HTTPS 통신을 한다면, 우리의 개인정보가 HTTP 프로토콜을 통해 해커에게로 전해지는 참사가 일어납니다.
이러한 공격을 SSL Stripping이라고 합니다.
Strict-Transport-Security
웹 사이트를 접속할 때 강제적으로 https 프로토콜로만 접속하게 하는 기능을 말합니다.
MIME 스니핑
브라우저가 특정 파일을 읽을 때 파일의 실제 내용과 Content-Type에 설정된 내용이 다르면 파일로 부터 형식을 추측하여 실행하는 것인데, 편리함을 위한 기능이지만 공격자에게 악용 될 가능성이 있습니다.
실제 활용
CSP (contentSecurityPolicy)
HTTP 응답에 JS, CSS 또는 plubins 등의 주입을 막는 Content-Security-Policy 헤더를 설정합니다.
CSP의 목적은 관리자가 의도하지 않는 그 어떤 것도 웹 페이지에 올라갈 수 없게 하는 것입니다.
CSP 헤더가 존재하면, 브라우저는 CSP 헤더에 언급되지 않은 리소스들을 로드하지 않습니다.
- 외부 사이트의 소스를 이용할 경우
- 다른 웹사이트에서 이미지 로드하는 경우
- 인라인 스크립트로 자바스크립트 코드를 작성한 경우
모두 에러가 발생합니다.
보통 페이지에 악의적인 Javascript를 올리는 XSS 공격을 통한 인증 쿠키나 사용자 로그를 훔치는 등의 행위를 막습니다.
1 2 3 4 5 6 7 8 9 10 11 12
const cspOptions = { directives: { ...helmet.contentSecurityPolicy.getDefaultDirectives(), "script-src": ["https://cdn.amcharts.com"], }, }; app.use( helmet({ contentSecurityPolicy: cspOptions, }) );
hidePoweredBy
Server와 X-Powered-By 헤더를 제거합니다.
1
app.use(helmet.hidePoweredBy());
의도적으로 잘못된 정보를 표기할 수도 있습니다.
1
app.use(helmet.hidePoweredBy({ setTo: "PHP 4.2.0" }));
HSTS (HTTP Strict Transport Security)
SSL Stripping 공격 등의 프로토콜 다운그레이드 공격과 쿠키 하이재킹로부터 웹사이트를 보호하기 위해 Strict-Transport-Security 헤더를 설정합니다.
HTTP 헤더는 브라우저에게 HTTPS를 고수하고 블안전한 HTTP 버전을 절대 방문하지 말라고 지시합니다.
즉, HTTP 사용자에게 HTTPS로 전환하라고 말하지 않고, HTTPS 사용자에게 계속 남아 있으라고만 말합니다.
1 2 3 4 5 6
// app.use( helmet.hsts({ maxAge: 90 * 24 * 60 * 60, // 90일동안 https 사용하도록 }) );
xssFilter
XSS 공격을 방어하기 위해 X-XSS-Protection 헤더를 설정합니다.
1
app.use(helmet.xssFilter()); // X-XSS-Protection 보안헤더 작성.
추가로, XSS 공격을 완벽히 방어하기 위해선 sanitze-html 모듈도 같이 써주어야 합니다.
helmet : src나 href, 인라인 자바스크립트 XSS 공격을 막는 용도
sanitize-html :
<script>
태그 작성 공격을 막는 용도