HTTP와 같은 일반 텍스트 프로토콜은 공격자가 전송된 콘텐츠를 읽을 수 있는 도청 공격에 취약할 수 있습니다. 전송 계층 보안 (TLS)은 트래픽을 암호화하여 공격자가 캡처된 데이터를 사용하기 훨씬 어렵게 만들 수 있습니다.
하지만 공격자가 암호화된 연결이 일반 텍스트 HTTP를 사용하도록 강제하여 TLS를 우회할 수 있습니다. 이 문제를 해결하려면 HTTP Strict Transport Security (HSTS) 응답 헤더를 사용하면 됩니다. HSTS는 사용자의 브라우저가 TLS를 사용하여 웹사이트를 방문하도록 강제하며, 설정된 시간 동안 일반 텍스트 HTTP로 대체하는 것을 허용하지 않습니다.
Lighthouse 감사가 실패하는 방식
감사에서 HSTS 헤더와 관련된 다음 문제를 표시합니다.
- HSTS 헤더가 전혀 없는 경우
- 권장 지시문 중 하나가 누락된 경우 (
max-age,includeSubDomains,preload) max-age지시문의 기간이 1년 (31536000초) 미만인 경우- 알 수 없는 지시문과 같이 헤더를 파싱할 때 구문 오류가 있는 경우
강력한 HSTS 정책 구성
최적의 HSTS 헤더 구성은 다음과 같습니다.
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
max-age지시어는 사용자의 브라우저가 TLS만 사용하여 웹사이트를 방문하도록 강제되는 시간을 지정합니다 (초). 시간이 지나면 웹사이트에서 제공하는 HSTS 헤더 (또는 HTTP에서 HTTPS로의 임시 리디렉션)가 없는 경우 사용자가 일반 HTTP로 사이트에 다시 연결할 수 있습니다.includeSubDomains지시어를 설정하면 헤더를 처음 전송하는 페이지 URL의 모든 하위 도메인에 헤더가 적용됩니다. 예를 들어includeSubDomains지시어가 포함된 HSTS 헤더가google.com에 의해 전송되면mail.google.com에 HSTS 헤더가 적용됩니다.preload지시어를 설정하고 도메인을 HSTS 미리 로드 서비스에 제출하면 미리 로드된 HSTS 목록을 사용하는 브라우저 바이너리에 도메인이 컴파일됩니다. 이는 Google Chrome에만 해당하지 않습니다.
HSTS 헤더를 롤아웃할 때는 몇 가지 위험이 있습니다. 암호화되지 않은 HTTP 연결이 필요한 기능은 max-age 지시문에 설정된 시간 동안 효과적으로 중단됩니다. preload 지시어가 적용되면 더 길어질 수도 있습니다.
출시와 관련된 위험을 줄이려면 단계적 접근 방식을 사용하는 것이 좋습니다.
작은
max-age값으로 시작하고includeSubDomains만 추가합니다 (preload미포함).max-age=3600; includeSubDomains문제 보고가 없는 대기 기간 (예: 1주일)이 지난 후
max-age를 올립니다. 예를 들면 다음과 같습니다.max-age=604800; includeSubDomains이 초기 단계가 장기간(예: 3개월) 성공적으로 진행되면 웹사이트와 하위 도메인을 HSTS 미리 로드 목록에 추가하고
preload지시어를 추가해야 합니다.max-age=63072000; includeSubDomains; preload