HSTS 설정 방법, max-age와 단계적 적용
- HSTS는 한 번 받으면 정해진 기간 동안 브라우저가 HTTPS로만 접속하게 만드는 헤더이며, HTTPS 응답에서만 인정된다.
- 처음에는 max-age를 짧게 두고 문제가 없으면 하루, 한 달, 1년 순으로 늘리는 단계 적용이 안전하다.
- preload는 모든 하위 도메인이 HTTPS를 지원할 때만 신청하고, 한 번 등록되면 되돌리는 데 몇 달이 걸릴 수 있다.
HTTPS를 설치했어도 누군가 주소창에 http:// 로 시작하는 주소를 입력하면 첫 요청은 암호화되지 않은 채 나갑니다. 서버가 그 요청을 HTTPS로 되돌려 보내 주긴 하지만, 그 짧은 구간이 공격자에게 틈이 될 수 있습니다. HSTS(HTTP Strict Transport Security)는 한 번 받은 뒤부터는 이 사이트에 항상 HTTPS로 접속하라고 브라우저가 기억하게 하는 헤더입니다.
이 글은 헤더 문법과 의미, 서버별 설정, 안전하게 늘려 가는 순서, preload 등록 때 조심할 점을 정리합니다. MDN, hstspreload.org, OWASP 문서를 2026년 10월 24일에 확인한 내용입니다. 보안 헤더 전체 그림은 보안 헤더 설정 방법 글에서 볼 수 있습니다.
HSTS 헤더 구성 요소
MDN이 설명하는 문법은 다음과 같습니다.
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
| 지시어 | 의미 |
|---|---|
| max-age=초 | 브라우저가 HTTPS 전용으로 기억할 시간. 필수 |
| includeSubDomains | 하위 도메인까지 같은 정책 적용 |
| preload | 브라우저에 내장된 목록에 올려 달라는 신호 |
몇 가지 동작 원칙도 알아 두세요.
- HTTPS 응답에서만 인정됩니다. HTTP로 보낸 헤더는 브라우저가 무시합니다.
- 응답을 받을 때마다 만료 시점이 현재 시각 더하기 max-age로 갱신됩니다.
- IP 주소로 접속하는 경우에는 적용되지 않습니다.
- 헤더를 처음 보기 전의 첫 접속은 보호하지 못합니다. 이 빈틈을 줄이는 방법이 preload입니다.
- HTTP에서 HTTPS로 보내는 리디렉션 응답은 영구 리디렉션(301)으로 하고, 그 HTTP 응답에는 HSTS 헤더를 넣지 않습니다.
설정 전 확인할 것
HSTS는 되돌리기 어려운 설정이라 준비가 먼저입니다.
- 모든 페이지와 하위 도메인이 HTTPS로 정상 열리는지 확인합니다.
- 인증서 자동 갱신이 동작하는지 확인합니다. 만료되면 HSTS 사용자는 경고를 넘기지 못하고 사이트에 들어올 수 없습니다. 만료 관리는 SSL 인증서 설치 방법 글과 연계해서 보세요.
- 이미지와 스크립트가 HTTP 주소로 불러와지는 혼합 콘텐츠가 없는지 점검합니다.
- HTTP 접속이 HTTPS로 영구 리디렉션되는지 확인합니다.
HSTS·CSP 같은 보안 헤더가 어떻게 설정되어 있는지 바로 확인할 수 있습니다.
보안 헤더 검사하기Apache 설정 예시
HTTPS를 처리하는 가상호스트(443)에 넣습니다. mod_headers 가 필요하며, always 를 붙이면 오류 응답에도 헤더가 붙습니다.
<VirtualHost *:443>
ServerName example.com
Header always set Strict-Transport-Security "max-age=300"
</VirtualHost>
설정 변경 후에는 apachectl configtest 로 문법을 확인하고 reload로 반영합니다.
Nginx 설정 예시
nginx의 add_header 는 always 를 붙여야 오류 응답에도 들어갑니다. 또 하위 블록에 다른 add_header 가 하나라도 있으면 상위 블록의 헤더를 상속하지 않으니, location 안에서 헤더를 따로 정의했다면 HSTS도 거기에 다시 적어야 합니다.
server {
listen 443 ssl;
server_name example.com;
add_header Strict-Transport-Security "max-age=300" always;
}
nginx -t 로 검사한 뒤 nginx -s reload 로 반영합니다.
단계적으로 늘리는 순서
처음부터 1년을 넣으면 문제가 생겼을 때 사용자 브라우저에서 1년간 정책이 남습니다. 다음 순서로 늘리는 방식이 안전합니다. 기간은 예시이며 사이트 상황에 맞게 조정하세요.
| 단계 | 값 | 유지 기간 권장 | 확인 |
|---|---|---|---|
| 1 | max-age=300 | 며칠 | 접속·결제·로그인 정상 여부 |
| 2 | max-age=86400 | 1주 안팎 | 하위 도메인 오류 제보 |
| 3 | max-age=2592000 | 몇 주 | 인증서 갱신 정상 여부 |
| 4 | max-age=31536000 | 상시 | 갱신 자동화 유지 |
| 5 | includeSubDomains 추가 | 상시 | 모든 하위 도메인 HTTPS 확인 후 |
OWASP 문서가 제시하는 권장값은 max-age=63072000; includeSubDomains; preload(2년)입니다. 다만 OWASP도 설정 오류나 인증서 문제가 있으면 사용자가 max-age 기간 동안 접속하지 못할 수 있다고 경고합니다. 이 값은 준비가 끝난 뒤의 최종 목표로 보시면 됩니다.
preload는 신중하게
preload는 브라우저 제작사가 관리하는 목록에 도메인을 올려, 첫 접속부터 HTTPS를 강제하는 방식입니다. hstspreload.org가 밝히는 요건은 다음과 같습니다.
- 유효한 인증서를 사용한다
- 80번 포트가 열려 있다면 같은 호스트에서 HTTPS로 리디렉션한다
- 존재하는 모든 하위 도메인(내부용 포함)이 HTTPS를 지원한다
- 기본 도메인 응답에
max-age31536000 이상,includeSubDomains,preload를 모두 넣는다
경고도 분명합니다. 요건을 계속 충족해야 하고, 어기면 자동으로 제거될 수 있으며, 직접 제거하려 해도 브라우저 업데이트를 거쳐 몇 달이 걸리고 다른 브라우저는 보장되지 않습니다. hstspreload.org는 모든 하위 도메인을 장기간 HTTPS로 운영할 수 있을 때만 신청하라고 안내하며, 자동으로 HTTP를 HTTPS로 올려 주는 브라우저가 늘어 preload가 꼭 필요하지는 않다는 취지의 설명도 덧붙입니다. 소규모 사이트는 max-age=31536000; includeSubDomains 까지만 적용해도 충분한 경우가 많습니다.
문제가 생기면
HTTPS 응답으로 max-age=0 을 보내면 브라우저가 기억한 HSTS 정책이 사라집니다. 이미 접속한 사용자의 브라우저는 다음에 사이트에 접속해 이 헤더를 받아야 정책이 해제되므로, 접속이 완전히 막혔다면 해제 자체가 어렵습니다. 그래서 짧은 값부터 시작하는 것입니다.
보안 헤더 검사HSTS·CSP·X-Content-Type-Options 등 6개 헤더의 값 평가을 무료로 확인할 수 있습니다.
보안 헤더 검사하기자주 묻는 질문
HSTS를 켜면 HTTP 접속은 어떻게 되나요?
브라우저가 헤더를 받은 이후에는 http 요청을 스스로 https로 바꿔 보냅니다. 인증서 오류가 나도 사용자가 경고를 넘길 수 없으므로 인증서 만료 관리가 더 중요해집니다.
HTTP 사이트에 HSTS 헤더를 넣으면 효과가 있나요?
없습니다. MDN에 따르면 브라우저는 HTTP로 받은 HSTS 헤더를 무시합니다. HTTPS 응답에만 넣으세요.
HSTS를 끄려면 어떻게 하나요?
HTTPS 응답에서 max-age=0 을 보내면 브라우저가 기억한 정책이 사라집니다. 다만 이미 preload 목록에 올라갔다면 별도 제거 절차와 오랜 시간이 필요합니다.
includeSubDomains는 꼭 넣어야 하나요?
일반 HSTS에서는 선택 사항이지만 preload를 신청하려면 필수입니다. 내부용 하위 도메인까지 HTTPS가 가능한지 먼저 확인하세요.
확인한 자료
- MDN - Strict-Transport-Security
- HSTS Preload List Submission
- OWASP HTTP Headers Cheat Sheet
- Apache HTTP Server - mod_headers
- nginx - ngx_http_headers_module
기술 정보는 2026-10-24에 위 자료로 확인했습니다. 소프트웨어 버전·기본값·서비스 정책은 바뀔 수 있으므로 적용 전 각 문서의 최신 내용을 확인하세요. 이 글은 일반 정보이며 특정 서비스 가입을 권하지 않습니다.