개요
업무 중 하나의 시스템에서 GS인증을 적용해야 했는데,
인증을 받기 위해서는 그 서비스의 기본 도메인에 HSTS를 적용하고 크롬의 HSTS Preload List에 등록해야 했고,
그에 따라 서브 도메인들에도 필연적으로 HTTPS를 적용해야 했다.
대응을 위해 여러 설정 및 적용을 해보며 HSTS 및 도메인에 대한 전반적인 내용을 기록한다.
해당 포스팅은 https 리다이렉트에 대한 기초적인 지식이 필요합니다. https 리다이렉트 관련한 내용은 아래 포스팅을 참고해 주세요 :)
https://hojun-dev.tistory.com/entry/http-https-리다이렉트
HSTS란?
HSTS(HTTP Strict Transport Security)는 웹 브라우저와 웹 서버 간의 통신을 안전하게 유지하기 위한 보안 메커니즘 중 하나로써,
HSTS가 적용된 호스트에 대해 브라우저가 처음 접속할 때 서버는 HSTS 헤더를 응답으로 보내며,
브라우저는 이 헤더를 받으면 해당 호스트와의 향후 모든 통신을 HTTPS로 강제한다.
따라서 브라우저는 HSTS가 적용된 호스트에 대해 자동으로 HTTPS로 접속하도록 한다.
위의 설명에서 알 수 있듯 HSTS 헤더가 응답으로 온 이후 브라우저가 통신을 강제하므로 최초 1회 접속 시에도 HTTPS로 강제되는 것은 아니다.
따라서 사용자가 최초에 HTTP로 들어오는 경우 HTTPS로 리다이렉트를 시켜줘야만 이후 HSTS가 적용된다.
(HTTP에서는 HSTS 헤더를 전달할 수 없다.)
또한 웹 브라우저와 웹 서버 간의 통신이므로 모바일 앱이나 프로그램 등에서는 HSTS가 적용되지 않는다.
HSTS를 적용하는 가장 큰 이유는 보안인데,
HTTP 연결을 사용하는 경우 데이터는 평문(암호화되지 않은 텍스트)으로 전송되기 때문에 공격자가 네트워크에서 데이터를 가로챌 수 있다.
HSTS를 사용하지 않고 HTTPS로 리다이렉트 하는 경우에도 HTTP에 접속했다가 HTTPS로 넘어가는 것이므로 보안에 취약할 수 있다.
따라서 HSTS를 통해 HTTP를 거치지 않고 HTTPS로 통신하도록 하여 데이터 탈취를 막는다.
HSTS 적용 방법
위에서 설명한 HSTS 설정 방법을 알아보자.
HSTS를 적용한 도메인은 Strict-Transfort-Security라는 헤더를 응답으로 보낸다.
아래는 설정 예시.
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
- max-age : 브라우저에 HSTS가 적용될 시간 (초 단위). 63072000 = 2년
- includeSubDomains : 서브 도메인에도 HSTS 적용 여부. (test.com에 적용하면 one.test.com 등에도 자동 적용)
- preload : 브라우저가 해당 사이트를 HSTS Preload List에 추가할 의도가 있음을 나타냄.
Nginx의 경우 아래와 같이 설정할 수 있다.
HTTP 접근 시 HTTPS로 리다이렉트 하도록 설정하고,
인증서 파일을 통해 SSL을 활성화한 후 HSTS 헤더를 추가한다.
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /ssl/example_cert.crt;
ssl_certificate_key /ssl/example_key.key;
location / {
...
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
}
}
하위 도메인을 여러 개 구성할 때 우리는 해당 도메인들이 포함된 SSL 인증서가 필요하다.
보통 *.example.com
형식의 와일드카드 인증서로 작업을 하게 될 텐데,
와일드카드 인증서에는 보통 하위 도메인뿐만 아니라 기본 도메인까지 적용할 수 있도록 DNS 이름이 설정되어 있다.
따라서 와일드카드 인증서를 가지고 기본 도메인의 설정에 적용하고,
동일한 인증서로 하위 도메인들에 설정해도 HTTPS가 정상적으로 동작한다.
또한 includeSubDomains
속성을 추가했으므로 하위 도메인에는 HSTS 헤더를 추가할 필요가 없다.
Preload List
Preload List란 브라우저에서 미리 해당 사이트를 HSTS로 접속하도록 목록을 만들어놓은 것을 말한다.
해당 리스트에 추가된 사이트는 최초 접속 없이도 HSTS가 적용된다.
해당 리스트에 추가되면 서버에서 HSTS 헤더를 삭제하더라도 HSTS 적용이 유지된다.
Preload List는 구글이 운영하고 있고, 크롬 브라우저의 HSTS Preload List를 제공한다.
Preload List에 등록되면 크롬 브라우저 내에 하드코딩되어 HTTPS로만 접속이 가능하도록 설정된다.
대부분의 다른 주요 브라우저들도 해당 Preload List에 기반한 Preload List를 적용한다.
https://hstspreload.org/
Preload List에 도메인을 추가하려면 기본 도메인에 HSTS 헤더를 설정하고 위 사이트에 제출하여 심사를 받아야 한다.
위에서 설명한 HSTS 적용 방법대로 기본 도메인에 적용하고,
모든 하위 도메인에 대해 HTTPS가 적용되어 있다면 심사 제출 요구사항에 만족한다.
제출 요구 사항
- 유효한 인증서 제공
- HTTP 80 포트에 접근 시 동일한 호스트의 HTTPS로 리다이렉트
- 모든 하위 도메인에 HTTPS 제공 (비공개 내부 하위 도메인도 포함)
- 기본 도메인에 HSTS 헤더 제공
- max-age 값 최소 31536000 (1년) 이상. (63072000 (2년) 권장)
- includeSubDomains, preload 지정
- HTTPS 사이트에서 다른 곳으로 리다이렉트를 제공하는 경우 리다이렉트 된 곳에도 HSTS 헤더가 있어야 함
마무리
HSTS가 적용되면 인증서 만료 등으로 HTTPS 접속이 실패하는 경우 사이트 자체 접속이 불가능해진다.
또한 Preload List에 한 번 추가되면 기본 도메인 및 모든 하위 도메인에 모두 HSTS가 적용되고,
Preload List에서 해당 도메인을 삭제하는 데 많은 시간이 소요되므로 Preload List에 등록하는 것은 신중하게 결정해야 한다.
'Setting' 카테고리의 다른 글
Gmail에 도메인 SPF 설정하기 with AWS Route 53 (0) | 2023.11.15 |
---|---|
유용한 사이트 정리 (0) | 2023.09.23 |
JMeter로 API 테스트 및 TPS 측정하기 (0) | 2023.08.09 |
JMeter 설치하기 (0) | 2023.07.31 |
[React] localhost https 설정하기 (0) | 2023.07.12 |