- Published on
Strict Transport Security Header
- Authors
- Name
- Jay
이번 글에서는 Strict-Transport-Security Header에 대해서 알아본다. 해당 해더를 줄여서 HSTS
라고 부르기도 하기 때문에, 지금부터는 HSTS라고 하겠다. 응답값에 HSTS가 있으면, 다음번에 브라우저가 HTTP로 해당 도메인에 요청을 하면 자동으로 HTTPS로 바꿔서 요청하게 된다. HSTS의 존재와 역할을 이해하면, 아래와 같은 상황이 왜 발생하는지 이해할 수 있다.
서버에서는 HTTPS(443)과 HTTP(80)에 대해서 응답을 한다. 서버에서는 HTTP로 요청이 오면 Location Header를 통해서 HTTPS로 단순하게 Redirect해준다. 그런데 방화벽에서 443번 포트만 허용하게 되어 있고, 80번 포트로 요청할 경우에는 요청이 차단이 된다. 따라서
curl http://example.com
으로 요청을 하면 timeout이 난다. 하지만 브라우저에서http://example.com
으로 입력하면 HTTPS로 리다이렉트가 된다.
예제
daum.net
도메인에 대해서 살펴보자. 아래와 같이 http 프로토콜로 요청을 하면, Location header와 함께 응답이 온다.
curl -i http://daum.net
HTTP/1.1 301 Moved Permanently
Date: Thu, 30 Jan 2025 04:05:27 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: https://daum.net
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
그리고 curl로 HTTP 프로토콜로 요청을 하면, 응답값에 HSTS가 포함된 것을 확인할 수 있다. 최종적으로는 www.daum.net으로 Redirect가 된다.
curl -i https://daum.net
HTTP/2 307
date: Thu, 30 Jan 2025 04:05:55 GMT
content-length: 0
location: https://www.daum.net/
vary: Origin
vary: Access-Control-Request-Method
vary: Access-Control-Request-Headers
strict-transport-security: max-age=15724800
이제 브라우저에서 https://daum.net으로 접속한다. 그러면 응답값에 HSTS가 있엇기 때문에 daum.net 도메인에 대해서 HSTS가 설정되었다. Chrome에서는 chrome://net-internals/#hsts에서 아래와 같이 확인할 수 있다.

이렇게 HSTS가 설정된 상태에서 다시 http://daum.net으로 접속하면, 서버에 요청하여 Redirect header로 https로 redirection이 되는 것이 아니라 서버에 요청없이 브라우저에서 자동으로 https로 redirection하게 된다. Chrome에서 아래와 같이 개발자 도구로 확인하면, HSTS에 의해서 된 것을 확인할 수 있다.

결론
HSTS를 통해서 브라우저에게 HTTPS로 요청할 수 있도록 설정할 수 있다. 한번 HTTPS로 접속한 도메인의 경우에는 설정된 HSTS가 만료되기 전까지 브라우저는 HTTPS로 요청한다. 이렇게 HSTS가 설정되면 브라우저에서 서버 요청없이 HTTP 요청을 HTTPS로 redirection하게 된다. 따라서 방화벽에 의해서 80번 포트가 막혔거나 서버에서 80번 포트를 listening하지 않더라도 브라우저단에서 서버 요청 없이 HTTPS로 redirection이 될 수 있다.