본문 바로가기

리눅스

웹 서버에서 HSTS(HTTP Strict Transport Security)를 설정하는 방법

반응형

웹 서버에서 HSTS(HTTP Strict Transport Security)를 설정하는 방법

HSTS(Strict Transport Security)는 웹 사이트의 보안을 강화하기 위한 메커니즘 중 하나로, HTTPS를 통해 통신하는 것을 강제하고 중간자 공격을 방지하는 기능을 제공합니다. HSTS를 설정함으로써 클라이언트(웹 브라우저)는 지정된 기간 동안 해당 웹 사이트와의 모든 통신을 HTTPS를 통해서만 수행하도록 강제됩니다.

Redirect HTTP connections to HTTPS

Apache 설정

<VirtualHost *:80>
    ServerName example.com

    RewriteEngine on
    RewriteCond %{HTTPS}  !on
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L]
</VirtualHost>

NGINX 설정

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

HSTS 설정

  • HSTS를 사용하려면 "Strict-Transport-Security" HTTP 헤더를 설정합니다.
    • max-age = 적용 시간. 초단위
    • includeSubdomains : 서브 도메인도 적용
    • preload : 클라이언트(브라우저)에 preload list에 추가

Apache 설정

<VirtualHost example.com:443>
Header always set Strict-Transport-Security "max-age=86400; includeSubdomains; preload"
</VirtualHost>

NGINX 설정

server {
    listen 443;
    server_name example.com;
    
    ssl_certificate /path/to/combined.crt;
    ssl_certificate_key /path/to/private/key.key;
    
    add_header Strict-Transport-Security "max-age=86400; includeSubdomains; preload";
    ...
}
  • max-age=86400: 브라우저가 HSTS 정보를 캐시하는 시간을 나타내며, 이 경우 86400초 (1일) 동안 유지됩니다.
  • includeSubdomains: 현재 도메인 뿐만 아니라 모든 서브도메인에도 HSTS를 적용하도록 지시합니다.
  • preload: 이 사이트가 HSTS preload 리스트에 등록되어 브라우저에 내장되도록 지시합니다. preload 리스트는 브라우저 개발자들이 관리하는 목록으로, HSTS를 적용한 사이트가 리스트에 등록되면 해당 사이트에 접속하는 모든 사용자의 브라우저에서 HSTS가 적용됩니다.
728x90

HSTS가 활성화되었는지 확인하는 방법

크롬 브라우저에서 확인

chrome://net-internals/#hsts

  • domain1.co.kr

c1

  • domain2.co.kr

c2

cURL을 사용하여 HSTS 헤더 확인

 curl -s -D- https://domain.com/ | grep -i Strict
$ curl -s -D- https://sangchul.kr/ | grep -i Strict
Strict-Transport-Security: max-age=63072000; includeSubdomains; preload

 

curl --head https://sangchul.kr
$ curl --head https://sangchul.kr
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 29 Sep 2020 02:09:45 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Link: <https://sangchul.kr/index.php?rest_route=/>; rel="https://api.w.org/"
Strict-Transport-Security: max-age=63072000; includeSubdomains; preload
Public-Key-Pins: max-age=31536000;
                pin-sha256="O2ELvEUIPxmsA7vJAbZxoiABBkonE3U+INXiuRkWTu4=";
                pin-sha256="YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=";
                pin-sha256="Vjs8r4z+80wjNcr1YKepWQboSIRi63WsWXhIMN+eWys=";
                pin-sha256="T3QGJPkeB/a0wqVRQLP1AMsOTOxc8OJOR6nczDNd7H4=";
                includeSubDomains

 

HSTS가 정상적으로 적용되었는지 확인하기 위해 웹 브라우저의 개발자 도구를 열고 네트워크 탭에서 요청 헤더를 확인합니다. Strict-Transport-Security 헤더가 있는지 확인하고, 내용이 올바른지 확인할 수 있습니다.

또한, HSTS가 브라우저에 캐싱되어 정상적으로 작동하는지 확인하기 위해 테스트하는 동안 주의해야 합니다. HSTS를 적용한 웹 사이트로 접근한 후, HTTP로 접속하려고 시도하면 브라우저가 HTTP 접속을 강제하지 않도록 해주기 위해 보안 헤더를 캐시하는 브라우저의 문제를 회피해야 할 수 있습니다.

 

주의: HSTS를 설정할 때 주의해야 할 점은, HSTS를 설정한 웹 사이트에서 HTTPS를 지원하지 않는 경우, 사용자가 해당 웹 사이트에 접속할 수 없게 될 수 있습니다. 따라서 충분한 HTTPS 지원을 확보한 후에 HSTS를 설정하는 것이 좋습니다.

 

참고URL

- HTTP Strict Transport Security

- RFC: RFC6797 (HTTP Strict Transport Security (HSTS))

 

728x90
반응형