[Nginx] HSTS(HTTP Strict Transport Security) 활성화

1. 사용 이유

HTTPS를 강제하는 사이트의 경우 HTTP로 접속할 때, 302 Found(요청된 리소스가 임시적으로 이동 페이지로 이동)로 인해 리다이렉트되는 경우가 있다. 이로 인해 SSL Strip(중간자 공격 방법 중 일부) 공격에 취약해진다.

그렇기 때문에 HTTPS 요청만 사용하도록 설정해주는 HSTS를 사용해야한다.

참고 : https://webhack.dynu.net/?idx=20161112.001

2. HSTS 활성화

2.1. nginx 구성 파일 설정

$ vi /etc/nginx/sites-available/default

>
server {
                listen 80 default_server;
                listen [::]:80 deafult_server;
etc ...
}

server {
                listen [::]:443 ssl ipv6only=on;
                listen 443 ssl;
etc ...
}

구성 파일을 열면 80번(http)포트 서버와 443번(https)포트 서버에 대한 설정이 각각 있다.

443번 포트 서버에

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
>
server {
                listen [::]:443 ssl ipv6only=on;
                listen 443 ssl;
                add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
etc ...
}

add header Strict-Transport-Security를 추가한다.

  • options
옵션명 설명 비고
max-age HSTS가 브라우저에 설정될 시간 값 초단위로 설정, Ex) 606024 = 86,400 = 1day
includeSubdomains HSTS가 적용될 도메인의 서브 도메인 적용 여부 해당값을 추가하게되면 example.com-> www.example.com, test.example.com까지 확장되어 적용됩니다.
preload HSTS가 브라우저 측에서 Preload 적용여부 추가시 브라우저 preload list에 추가됩니다.

참고 : https://akageun.github.io/2018/03/07/hsts.html

2.2. Nginx 재시작

$ service nginx restart

2.3. HSTS 활성화 확인

# curl -I https://{도메인 주소}
$ curl -I https://example.com

>
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Wed, 24 Aug 2022 08:12:01 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 4511
Connection: keep-alive
X-Frame-Options: DENY
Vary: Cookie
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Strict-Transport-Security가 나온다면 활성화 완료