Home helmet 모듈
Post
X

helmet 모듈

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)

    콘텐츠 보안 정책 설정 및 구성을 통해 의도하지 않은 내용이 페이지에 삽입되는 것을 방지합니다.

    XSSData 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

    ServerX-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> 태그 작성 공격을 막는 용도

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.