HSTS(HTTP Strict Transport Security)는 HTTP 응답 헤더에 설정하는 방식으로, 브라우저에게 HTTP 대신 HTTPS를 강제하도록 하는 기능입니다. HSTS 헤더를 중심으로 Apache 서버에서 HTTPS를 강제하는 방법을 알아보겠습니다.
HSTS란 무엇인가요?
HSTS는 서버가 브라우저에게 Strict-Transport-Security라는 HTTP 응답 헤더를 통해 HTTPS를 강제하도록 알려주는 보안 기술입니다. 브라우저는 이 헤더를 읽고 다음과 같은 동작을 수행합니다
- HTTP 연결 차단: HTTP로 접속하려는 시도를 HTTPS로 자동 변환합니다.
- 정책 기억: HSTS 헤더의 max-age 값에 따라 정해진 기간 동안 HTTPS 강제 정책을 유지합니다.
- 중간자 공격 방지: HTTP 연결을 완전히 차단해 데이터 탈취 가능성을 낮춥니다.
이 모든 작업은 HTTP 응답 헤더에 Strict-Transport-Security를 설정함으로써 이루어집니다.
HSTS 헤더의 형식
HSTS 헤더의 기본 형식은 다음과 같습니다
Strict-Transport-Security: max-age=<초>; [includeSubDomains]; [preload]
- max-age: HSTS 정책의 유효 기간을 초 단위로 지정합니다. 예를 들어, 31536000은 1년을 의미합니다.
- includeSubDomains (선택사항): 모든 서브 도메인에도 동일한 정책을 적용합니다.
- preload (선택사항): 브라우저의 HSTS Preload List에 사이트를 등록하려면 필요합니다.
1. Apache에서 HSTS 헤더 추가하기
HSTS의 핵심은 HTTP 응답 헤더에 Strict-Transport-Security를 포함시키는 것입니다.
이를 Apache 설정에서 적용하는 방법은 다음과 같습니다.
1.1 헤더 설정 전제 조건
- HTTPS가 활성화되어 있어야 합니다.
- Apache 모듈 mod_headers가 활성화되어 있어야 합니다.
LoadModule ssl_module modules/mod_ssl.so LoadModule headers_module modules/mod_headers.so
1.2 HSTS 헤더 추가
Apache의 HTTPS VirtualHost 설정 파일에 아래와 같이 HSTS 헤더를 추가합니다
<VirtualHost *:443>
ServerName yourdomain.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/yourdomain.crt
SSLCertificateKeyFile /etc/ssl/private/yourdomain.key
# HSTS 헤더 설정
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>
- always set: 응답에 항상 HSTS 헤더를 추가하도록 설정합니다.
- max-age=31536000: HSTS 정책을 1년 동안 유지합니다.
- includeSubDomains: 서브 도메인에도 동일한 정책을 적용합니다.
- preload: 브라우저의 HSTS Preload List 등록을 위한 옵션입니다.
2. HSTS 헤더 동작 방식 확인
HSTS가 제대로 설정되었는지 확인하려면 응답 헤더를 직접 확인할 수 있습니다.
2.1 curl 명령어로 헤더 확인
아래 명령어를 실행하여 서버의 응답 헤더를 확인합니다
curl -I https://samso.tistory.com
출력 결과에 다음과 같은 헤더가 포함되어 있어야 합니다.
Strict-Transport-Security: max-age=31536000; includeSubDomains;
2.2 브라우저 개발자 도구 확인
- 브라우저에서 F12를 눌러 개발자 도구를 엽니다.
- "네트워크(Network)" 탭으로 이동한 후, HTTPS 요청을 선택합니다.
- "응답 헤더(Response Headers)"에서 Strict-Transport-Security 값을 확인합니다.
3. HSTS Preload List 등록 (선택사항)
HSTS Preload List는 브라우저 제조사가 관리하는 HTTPS 강제 사이트 목록입니다.
등록하면 브라우저가 사이트 접속 전에도 HTTPS를 강제합니다.
3.1 등록 조건
- Strict-Transport-Security 헤더에 다음 값이 포함되어야 합니다
Strict-Transport-Security: max-age=31536000; includeSubDomains;
- HTTP 요청이 모두 HTTPS로 리다이렉트 되어야 합니다.
3.2 등록 방법
HSTS Preload List에 접속하여 도메인을 제출합니다. 제출 후 조건을 충족하지 못하면 오류 메시지가 표시되며, 수정 후 다시 제출해야 합니다.
4. 설정 주의사항
- HSTS 정책은 되돌리기 어렵습니다.
- 설정 후 클라이언트는 지정된 max-age 동안 HTTP 접속을 시도하지 않습니다.
테스트 시에는 짧은 max-age 값을 사용한 후 점진적으로 연장하세요.
- 설정 후 클라이언트는 지정된 max-age 동안 HTTP 접속을 시도하지 않습니다.
- HTTPS 설정이 완벽해야 합니다.
- HTTPS가 제대로 작동하지 않으면 사이트에 접근할 수 없는 문제가 발생할 수 있습니다.
- preload 사용은 신중히 결정하세요.
- Preload List에 등록되면 브라우저의 목록에서 제거하기가 까다롭습니다.
'Server > Web' 카테고리의 다른 글
Web - Apache를 이용한 프록시 패스 설정 가이드 (0) | 2024.05.29 |
---|---|
Web - Apache를 이용한 로드 밸런서 설정 가이드 (0) | 2024.05.28 |
Web - Apache mod_rewrite 사용 변수 모음집 (0) | 2024.05.18 |
Web - Apache 웹 서버에서 Redirect / Rewrite 방법 (0) | 2024.05.17 |
Web - Apache SSL 인증서 비밀번호 자동입력 / 비밀번호 삭제 (2) | 2023.10.27 |