HSTS란?
HSTS(HTTP Strict Transport Security)는 브라우저가 웹사이트와 오직 HTTPS로만 통신하도록 지시하는 웹 보안 메커니즘입니다. 브라우저가 HSTS 헤더를 확인하면 이후 요청을 HTTPS로 자동 승격하고 사용자가 http://. 를 직접 입력해도 일반 HTTP 연결을 거부합니다.
HSTS가 중요한 이유
유효한 SSL 인증서가 있어도 다음과 같은 위험이 남습니다.
SSL 스트리핑 공격
1. 사용자가 https:// 없이 example.com을 입력합니다.
2. 공격자가 최초 HTTP 요청을 가로챕니다.
3. 공격자는 HTTPS로 프록시하면서 사용자에게는 HTTP로 응답합니다.
4. 사용자는 안전하다고 생각하지만 공격자는 모든 내용을 볼 수 있습니다.
HSTS는 브라우저가 최초 HTTP 요청을 보내지 않도록 해 이 공격을 막습니다.
HSTS의 이점
- 다운그레이드 공격 방지: HTTP 대체 경로가 없습니다.
- 오래된 북마크 보호: HTTP 북마크도 HTTPS로 바꿉니다.
- 혼합 콘텐츠 제거: 하위 리소스도 HTTPS로 강제합니다.
- 성능 향상: HTTP→HTTPS 리디렉션이 필요 없습니다.
HSTS 헤더 구문
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
지시어
| 지시어 | 설명 |
|---|---|
| max-age | HSTS를 기억할 초(31536000 = 1년) |
| includeSubDomains | 모든 하위 도메인에 HSTS 적용 |
| preload | 브라우저 사전 로드 목록 포함에 동의 |
HSTS 구현
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Cloudflare
Cloudflare 관리 화면에서 SSL/TLS 보안 설정의 엣지 인증서 항목을 열고 HTTP Strict Transport Security 기능을 활성화합니다.
Express.js
const helmet = require('helmet');
app.use(helmet.hsts({
maxAge: 31536000,
includeSubDomains: true,
preload: true
}));
HSTS 사전 로드 목록
HSTS 사전 로드 목록은 HTTPS로만 접근해야 하는 도메인을 브라우저에 하드코딩한 목록입니다. 최초 HTTP 요청 취약점도 제거합니다.
사전 로드 요건
1. 유효한 SSL 인증서
2. 모든 HTTP를 HTTPS로 리디렉션
3. 다음을 포함한 HSTS 헤더:
- 최소 max-age 31536000(1년)
- includeSubDomains 지시어
- preload 지시어
4. 모든 하위 도메인이 HTTPS를 지원해야 함
사전 로드 목록 제출
1. 요건 확인: hstspreload.org에서 확인합니다.
2. 도메인 제출: hstspreload.org에 도메인을 입력합니다.
3. 포함 대기: 브라우저 업데이트까지 수 주에서 수개월이 걸립니다.
사전 로드 경고
사전 로드는 사실상 영구적입니다. 목록에서 제거하는 데 수개월이 걸리고 브라우저 업데이트도 필요합니다. 모든 하위 도메인이 계속 HTTPS를 지원할 것이 확실할 때만 제출하세요.HSTS 확인
브라우저 개발자 도구:1. 개발자 도구의 Network 탭을 엽니다.
2. 사이트를 로드합니다.
3. 응답 헤더에서 Strict-Transport-Security를 확인합니다.
curl 사용:curl -I https://example.com | grep -i strict
DomScan 사용:
curl "https://domscan.net/v1/health?domain=example.com"
# Reports hasHSTS in security details
사전 로드 상태: hstspreload.org에서 도메인이 사전 로드되었는지 확인합니다.
HSTS 배포 전략
1단계: 짧은 max-age
테스트를 위해 짧게 시작합니다.
Strict-Transport-Security: max-age=300
문제가 생겨도 사용자의 캐시는 5분만 유지됩니다.
2단계: 기간 늘리기
모든 곳에서 HTTPS가 작동하는지 확인한 뒤 기간을 늘립니다.
Strict-Transport-Security: max-age=86400
3단계: 하위 도메인 추가
모든 하위 도메인이 HTTPS를 지원하면 추가합니다.
Strict-Transport-Security: max-age=2592000; includeSubDomains
4단계: 전체 배포와 사전 로드
수개월 동안 안정적으로 운영한 뒤 적용합니다.
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
그 다음 사전 로드 목록에 제출합니다.
일반적인 HSTS 문제
HTTPS가 없는 하위 도메인: includeSubDomains가 해당 하위 도메인을 중단시킵니다. 개발 환경: 운영 환경에서 캐시된 HSTS가 로컬 개발을 방해할 수 있습니다. CDN/프록시 헤더: 중간 계층이 HSTS 헤더를 제거하지 않는지 확인합니다. 혼합 콘텐츠: 모든 리소스가 HTTPS여야 하며 HSTS가 삽입된 HTTP 리소스를 고쳐 주지는 않습니다.HSTS는 민감한 데이터를 처리하는 모든 웹사이트에 필수이며, 모든 HTTPS 사이트에 강력히 권장됩니다.