HSTS(HTTP Strict Transport Security)는 브라우저가 특정 도메인에 항상 HTTPS로만 접속하도록 강제하는 보안 정책이다. SSL 스트리핑 공격을 방어하는 핵심 메커니즘이다.
HSTS 동작 원리
첫 번째 접속 (HTTPS):
서버 → Strict-Transport-Security: max-age=31536000
브라우저: "이 도메인은 1년간 HTTPS만 사용" 기록
이후 접속:
사용자가 http://example.com 입력
브라우저: HSTS 정책 확인 → 네트워크 요청 없이
즉시 https://example.com 으로 내부 리다이렉트
→ 공격자가 HTTP 트래픽을 가로챌 기회 없음
SSL 스트리핑 공격 방어:
공격자: HTTPS → HTTP 다운그레이드 시도
HSTS: 브라우저가 HTTP 요청 자체를 차단
HSTS 헤더 설정
http
# 기본
Strict-Transport-Security: max-age=31536000
# 서브도메인 포함
Strict-Transport-Security: max-age=31536000; includeSubDomains
# HSTS Preload (가장 강력) - Chrome 목록에 등록
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Nginx 설정 예시
nginx
server {
listen 80;
server_name example.com www.example.com;
# HTTP → HTTPS 리다이렉트
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/cert.pem;
ssl_certificate_key /etc/ssl/private/key.pem;
# HSTS (2년, 서브도메인 포함, Preload)
add_header Strict-Transport-Security
"max-age=63072000; includeSubDomains; preload" always;
# HTTPS 강화 설정
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
}
HSTS Preload
HSTS Preload List:
- 브라우저에 하드코딩된 HSTS 도메인 목록
- 첫 방문부터 HTTPS 강제 (기존 HSTS는 첫 방문은 HTTP 가능)
- 등록: https://hstspreload.org
- 요건: max-age >= 1년 + includeSubDomains + preload
- 주의: 모든 서브도메인이 HTTPS 지원 필요
제거의 어려움:
- 브라우저 업데이트로만 제거 가능
- 즉각적 제거 불가 → 신중하게 등록
관련 문서