Skip to content

Express Helmet

Lee Dogyeong edited this page Dec 20, 2020 · 4 revisions

Helmet.js 란?

Express.js 사용시 Http 헤더 설정을 자동으로 바꾸어주어 잘 알려진 몇가지 앱의 취약성으로 부터 앱을 보호 할 수 있는 패키지이다.

여러 보안 헤더에 관한 정보

CSP 보안설정

Helmet는 다음과 같은 미들웨어로 이루어 져 있다.

csp

  • Content-Security-Policy 헤더 설정. XSS(Cross-site scripting) 공격 및 기타 교차 사이트 인젝션 예방.

hpkp

  • Public Key Pinning 헤더 추가. 위조된 인증서를 이용한 중간자 공격 방지. (삭제됨)

hsts

  • SSL/TLS를 통한 HTTP 연결을 적용하는 Strict-Transport-Security 헤더 설정.

noCache

  • Cache-Control 및 Pragma 헤더를 설정하여 클라이언트 측에서 캐싱을 사용하지 않도록 함. (삭제됨)

frameguard

  • X-Frame-Options 헤더 설정하여 클릭재킹(clickjacking)에 대한 보호 제공
    • 클릭재킹 공격: 가짜UI로 사용자의 의도와 다르게 동작하게 하는 것 (가짜버튼 등)
  • 브라우저에게 프레임 내부의 컨텐츠가 어떻게 렌더링될 지 알려준다
  • 기본값은 SAMEORIGIN으로 origin이 다르면 렌더링하지 않는다
  • X-Frame-Options 헤더는 CSP의 frame-ancestors 지시문으로 대체되었지만, 구형 브라우저에서는 유용하다

ieNoOpen

  • X-Download-Options 헤더를 noopen으로 설정 (IE8 에서만 적용)
  • 위험한 파일을 다운로드할 때 바로 실행되는 것을 막기 위해 '열기'버튼이 비활성화된다

xssFilter

  • X-XSS-Protection헤더를 0으로 설정하여 브라우저에서 해당 기능을 비활성화
  • X-XSS-Protection헤더를 구형 브라우저 사용자들을 위해 활성화할 수 있지만, 보안적인 이점을 주기 보다는 여러가지 이슈가 발견되는 등의 문제점으로 사용하지 않는 것이 기본값
  • 최신 웹 브라우저들은 대신 Content-Security-Policy 헤더로 XSS를 방어함

noSniff

  • X-Content-Type-Optionsnosniff로 설정한다
  • 선언된 콘텐츠 유형으로부터 벗어난 응답에 대한 브라우저의 MIME 가로채기를 방지
  • 브라우저가 요청에 명시된 MIME Type과 실제 파일의 타입이 다르면 다운로드하지 않게 한다

dnsPrefetchControl

  • X-DNS-Prefetch-Control 헤더를 설정
  • 기본값은 off로, DNS prefetching을 비활성화한다

permittedCrossDomainPolicies

  • X-Permitted-Cross-Domain-Policies 헤더를 설정
  • 주로 어도비 플래시, 어도비 아크로뱃(PDF)에서 크로스 도메인 컨텐츠 접근 권한을 지정한다
  • 기본값은 none으로 모든 요청을 차단한다

hidePoweredBy

  • 프레임워크에서 기본적으로 설정되는 X-Powered-By 헤더를 숨기는 기능
  • 보안적으로 큰 이점은 없는 듯

예제 코드

// This...
app.use(helmet());

// ...is equivalent to this:
app.use(helmet.contentSecurityPolicy());
app.use(helmet.dnsPrefetchControl());
app.use(helmet.expectCt());
app.use(helmet.frameguard());
app.use(helmet.hidePoweredBy());
app.use(helmet.hsts());
app.use(helmet.ieNoOpen());
app.use(helmet.noSniff());
app.use(helmet.permittedCrossDomainPolicies());
app.use(helmet.referrerPolicy());
app.use(helmet.xssFilter());

주관적인 생각

현재 우리 프로젝트에서 CSRF Token은 생각처럼 잘 진행되지않는 고민거리이다. 그 이유가 Cookie로 저장된 CSRF Token은 httpOnly 옵션을 주게되면 값을 가지고 있을 수 없기 때문이다..😂
httpOnly 옵션을 설정해주지않으면 XSS공격에 취약해지기 때문에 이문제로 고민하다 결국 httpOnly 옵션을 주지않고 CSRF를 방어하는 방향으로 가기로 결정했는데, 뭔가 찝찝한 마음이 한켠에 존재하고있었다.
이번에 Express helmet을 사용하면서 CSP(Content-Security-Policy 헤더 설정. XSS(Cross-site scripting) 공격 및 기타 교차 사이트 인젝션 예방.) 을 찾아보게 되었고, XSS공격을 예방해준다는 것을 확인하고 조금 안심하고 사용할 수 있게 된 것 같다.

Clone this wiki locally