nginx에 HSTS(HTTP Strict Transport Security) 설정하기

  • 5th September 2024
  • 3 min read

웹사이트의 보안을 강화하는 것은 웹 개발에서 필수적인 요소이다. 특히 HTTPS 를 통해 안전한 통신을 유지하는 것이 중요하다. 이를 위한 핵심적인 기술로 HSTS 라는 것이 있다.

HSTS란?

HSTS는 HTTP Strict Transport Security의 약자로 웹사이트가 오직 HTTPS 프로토콜을 통해서만 접근되도록 강제하는 보안 메커니즘이다. 이를 통해 HTTP 프로토콜로의 접속을 막고, HTTPS 를 통한 안전한 통신을 보장한다. HSTS 는 클라이언트(브라우저)에게 특정기간동안 HTTP 접속을 하지 못하게 하고 HTTPS만 허용하도록 하기 때문에 Man-in-the-Middle 같은 공격을 막는데 도움이 된다. 

PS. MITM 공격에 대한 내용은 기회가 있으면 작성해보겠..... (과연..)

HSTS를 설정하는 방법

nginx의 설정파일에서 server 구문 안에 HSTS 헤더를 설정해주는 것으로 HSTS 설정은 마무리 된다.

server {
   listen 443 ssl;  # HTTPS 포트
   server_name example.com;  # 도메인 이름
   
   ssl_certificate /path/to/your/certificate.crt;
   ssl_certificate_key /path/to/your/private.key;
   
   # HSTS 헤더 설정
   add_header Strict-Transport-Security "max-age=63072000" always;
}
  • max-age : 브라우저가 HSTS 정책을 기억하는 시간을 초 단위로 설정한다. 63072000초는 2년이다.
  • always : 캐시된 응답에도 HSTS 헤더를 추가하게 한다.

HSTS 가 설정된 웹사이트에 한번 접속한 클라이언트는 이후에 HTTP 프로토콜로의 접속은 시도하지 않으며 HTTPS 로만 접속을 시도하게 된다. 즉, http://domain.com 으로 접속하려고 하면 HSTS에 의해 자동으로 https://domain.com 으로 전환된다. 브라우저 수준에서 이를 강제하여 접속하게 하기에, 웹사이트로의 비보안 접속을 원천적으로 차단할 수 있다.

HTTP 요청을 HTTPS 로 301 REDIRECT

HSTS 헤더는 일단 한번 웹사이트에 접속을 해야 생기는 헤더이기 때문에 최초의 접속에 대해선 HTTPS 로 리다이렉트 해주는 작업이 필요하다. nginx 에 아래와 같이 설정해주자.

server {
   listen 80;
   server_name example.com www.example.com;
   
   return 301 https://$host$request_uri;
}

여기서 의문

어차피 http 로 접속했을 때 자동으로 HTTPS 로 redirect 해준다면 HSTS 를 설정하는 것와 무슨 차이가 있는 것인가에 대한 의문이 생긴다. 어차피 똑같은 것 아닌가?

결론부터 말하자면 다르다. 

특성301 REDIRECTHSTS
전환방법HTTP 접속 후 HTTPS 로 REDIRECTHTTP 접속 없이 브라우저가 자동으로 HTTPS  연결
적용범위nginx 에 설정된 server 구문의 server_name 에 한해 적용 가능 (매 server 구문마다 적용해야함)서브 도메인 전체에 대해서도 일괄 적용이 가능함 (단, 한번 접속했다면) 
보안수준초기요청을 HTTP로 연결하며 이후로도HTTP연결을 하게 될 수 있기에 MITM 공격같은 위험이 존재함헤더를 수신후에는 HTTP접속 자체를 브라우저에서 차단하여 더 강력하게 보안을 제공함
브라우저 캐싱 브라우저가 301 응답을 캐싱 브라우저가 max-age 동안 HTTPS 접속을 강제함

HSTS는 보안 측면에서 매우 강력한 도구이지만, 초기에 HTTP로 접속한 사용자가 HTTPS로 접속하도록 전환하려면 301 리다이렉트가 필요하다. HSTS가 활성화되기 전까지는 사용자가 여전히 HTTP로 접속할 수 있으므로, 301 리다이렉트를 통해 HTTPS로 유도하는 단계가 필수적이다.

따라서 Nginx에서 HSTS와 301 리다이렉트를 함께 설정하는 것이 필수이다. 초기 HTTP 접속은 301 리다이렉트를 통해 HTTPS로 전환하고, 이후 접속한 사용자에게 HSTS 정책을 전달하여 해당 사이트에 대해 HTTP 접속을 아예 막는 방식이다.

결론

웹사이트의 보안을 강화하기 위해서는 HTTPS를 통한 안전한 통신뿐만 아니라, 추가적인 보안 메커니즘인 HSTS와 301 리다이렉트를 함께 사용하는 것이 중요하다. HSTS는 클라이언트가 HTTP 접속을 시도하지 못하도록 강제하여 보안 수준을 높이는 반면, 301 리다이렉트는 초기 접속을 HTTPS로 자연스럽게 전환하는 데 도움을 준다. 이 두 가지를 적절히 활용하면, 사용자가 더 안전하게 웹사이트에 접속할 수 있고, 보안 취약점을 최소화할 수 있다.

Nginx에서 간단한 설정만으로 이 두 가지 기술을 쉽게 적용할 수 있으므로, 웹사이트의 보안 수준을 한층 더 높일 수 있을 것이다.