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는 되돌리기 어려운 설정이라 준비가 먼저입니다.

  1. 모든 페이지와 하위 도메인이 HTTPS로 정상 열리는지 확인합니다.
  2. 인증서 자동 갱신이 동작하는지 확인합니다. 만료되면 HSTS 사용자는 경고를 넘기지 못하고 사이트에 들어올 수 없습니다. 만료 관리는 SSL 인증서 설치 방법 글과 연계해서 보세요.
  3. 이미지와 스크립트가 HTTP 주소로 불러와지는 혼합 콘텐츠가 없는지 점검합니다.
  4. 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년간 정책이 남습니다. 다음 순서로 늘리는 방식이 안전합니다. 기간은 예시이며 사이트 상황에 맞게 조정하세요.

단계값유지 기간 권장확인
1max-age=300며칠접속·결제·로그인 정상 여부
2max-age=864001주 안팎하위 도메인 오류 제보
3max-age=2592000몇 주인증서 갱신 정상 여부
4max-age=31536000상시갱신 자동화 유지
5includeSubDomains 추가상시모든 하위 도메인 HTTPS 확인 후

OWASP 문서가 제시하는 권장값은 max-age=63072000; includeSubDomains; preload(2년)입니다. 다만 OWASP도 설정 오류나 인증서 문제가 있으면 사용자가 max-age 기간 동안 접속하지 못할 수 있다고 경고합니다. 이 값은 준비가 끝난 뒤의 최종 목표로 보시면 됩니다.

preload는 신중하게

preload는 브라우저 제작사가 관리하는 목록에 도메인을 올려, 첫 접속부터 HTTPS를 강제하는 방식입니다. hstspreload.org가 밝히는 요건은 다음과 같습니다.

  • 유효한 인증서를 사용한다
  • 80번 포트가 열려 있다면 같은 호스트에서 HTTPS로 리디렉션한다
  • 존재하는 모든 하위 도메인(내부용 포함)이 HTTPS를 지원한다
  • 기본 도메인 응답에 max-age 31536000 이상, 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가 가능한지 먼저 확인하세요.

확인한 자료

기술 정보는 2026-10-24에 위 자료로 확인했습니다. 소프트웨어 버전·기본값·서비스 정책은 바뀔 수 있으므로 적용 전 각 문서의 최신 내용을 확인하세요. 이 글은 일반 정보이며 특정 서비스 가입을 권하지 않습니다.

Next
웹사이트 보안

보안 헤더 설정 방법, Apache·Nginx 예시

HSTS, CSP, X-Content-Type-Options, Referrer-Policy, X-Frame-Options, Permissions-Policy의 역할과 권장값, Apache·Nginx 설정 예시, 적용 후 확인 방법을 정리했습니다.

가이드 보기 →
SSL 인증서

SSL 인증서 설치 방법, Apache·Nginx 설정

SSL 인증서를 Apache와 Nginx에 설치하는 설정 예시, 체인 파일 순서, 설정 검사와 reload, HTTP에서 HTTPS로 영구 리디렉션 설정 방법을 단계별로 안내합니다.

가이드 보기 →
웹사이트 보안

CSP 적용 가이드, Report-Only부터 시작

CSP를 안전하게 적용하는 순서를 정리했습니다. Report-Only로 시작하는 방법, default-src·script-src·frame-ancestors 등 주요 지시어, unsafe-inline 문제와 nonce, Apache·Nginx 예시를 다룹니다.

가이드 보기 →
웹사이트 보안

웹사이트 악성코드 감염 대처, 초기 대응과 증거 보존

웹사이트 악성코드 감염이 의심될 때 먼저 할 일을 순서대로 정리했습니다. 격리, 증거 보존, 비밀번호 교체, 정리와 재발 방지, Search Console 검토 요청까지 다룹니다.

가이드 보기 →
웹사이트 보안

홈페이지 해킹 확인 방법, Search Console 점검

내 홈페이지가 해킹됐는지 확인하는 순서를 정리했습니다. 검색 결과 스팸, 리디렉션, Search Console 보안 문제 보고서, 파일·로그 점검과 공개 검사의 한계까지 다룹니다.

가이드 보기 →