프론트엔드 기술 면접을 준비하면서 꼭 준비하는 질문 중 하나인 google.com을 입력하면 일어나는 일에 대해 공부하던 중에 한가지 궁금증이 생겼다.

주소창에 http or https를 입력하지 않았음에도 google.com을 입력하면 자동으로 https로 연결이 되는 것을 발견했다.

분명 나는 프로토콜을 명시하지 않았음에도 불구하고 어떻게 프로토콜이 결정되는 걸까?


웹사이트에 접속할때

사용자가 특정 웹사이트에 접속할때 해당 웹사이트가 HTTPS Protocol을 지원하는지 대부분 알 수가 없다.

그래서 웹사이트 접속시 protocol을 입력하지 않고 도메인만을 입력하게 된다.

그러면 브라우저는 먼저 HTTP로 해당 도메인에 접속을 시도한다.

만일, 해당 도메인이 HTTPS Protocol만을 지원하는 웹사이트면 301, 302 상태코드를 보내 HTTPS Protocol로 다시 접속하라고 지시한다.


위 과정은 HTTP로 한번 통신을 하기에 중간에 공격이 들어올 수 있는 문제점이 존재한다.

사용자와 같은 네트워크 상에서 사설 프록시나 해킹 도구를 운영하는 해커들은 중간자 공격의 형태로 사용자 HTTP 패킷을 몰래 캡쳐하고, 쿠키나 세션 정보 등의 민감한 사용자 정보를 엿볼 수 있다.

이러한 문제점을 막기위해 HSTS(HTTP Strict Transport Security) 기능이 존재한다.


HSTS 란?

HSTS(HTTP Strict Transport Security)는 웹 사이트에 접속할 때 HTTPS만 사용하도록 강제하는 기술이다.

HSTS가 적용된 웹사이트의 웹 서버는 클라이언트에게 HTTPS만을 사용할 수 있음을 알려주고, HSTS를 지원하는 브라우저는 이를 해석하고 적용한다.

대부분 최신 브라우저들은 모두 HSTS를 지원하고 있다.

caniuse-hstscaniuse.com - HSTS

HSTS List

최초 웹 사이트 접속 시 HTTPS 응답 헤더에 HSTS 설정 값이 존재하면, 다음에 접속할 때 사용자가 HTTP로 웹사이트를 접근할 필요없이 브라우저가 HTTPS로 웹사이트로 접근하게 한다.

웹 브라우저는 HSTS가 적용된 웹 사이트 리스트를 가지고 있다. 이를 이용해 한번이라도 접속하지 않아도 HTTPS로 접속할 수 있게 한다.

HSTS 동작

HSTS를 지원하는 브라우저는 내부 HSTS List를 보유하고 있다. 즉, HTTPS Protocol을 사용해야만 하는 웹사이트를 가지고 있다.

사용자가 도메인을 입력하면 HSTS List에 해당 도메인이 있는지 확인한다. 도메인 이름에 HSTS가 설정되어 있으면 HTTPS Protocol을 사용해 접속하게 된다.

웹 브라우저는 HSTS가 적용된 웹사이트를 가지고 있는 HSTS List를 가지고 있다.

HSTS List에 포함되어 있는 경우

  1. 사용자가 주소창에 도메인을 입력하거나, HTTP를 이용해 접속
  2. 브라우저는 HSTS List 확인
  3. 리스트에 포함되어 있으면 HTTPS로 접속

HSTS List에 없지만, HSTS 기능이 설정된 경우

  1. HSTS에 포함되어 있지 않은 웹사이트에 HTTP에 접속
  2. 301 상태코드를 통해 다시 HTTPS로 접속
    • Strict-Transport-Security 헤더 없음
    • HTTP는 안전한 프로토콜이 아니기에 HSTS 응답헤더는 HTTPS 요청에 대해서만 설정
  3. 웹 서버는 HTTPS Reply Message HSTS Policy 를 추가해 전송
    • Strict-Transport-Security 헤더 존재
    • HSTS를 지원하는 브라우저는 Strict-Transport-Security 헤더를 해석 및 적용해 HSTS List 구성
    • Strict-Transport-Security 응답헤더는 아래와 같이 설정
         Strict-Transport-Security: max-age='적용시간'
             // max-age값은 초(second) 단위, 해당 시간 동안 HSTS 응답을 받은 웹 사이트에 대해 HTTPS접속만을 허용
    
         Strict-Transport-Security: max-age='적용시간'; includeSubDomains
             // HSTS 가 해당 도메인의 서브 도메인에도 적용되고 있음
    
         Strict-Transport-Security: max-age='적용시간'; preload
             // 브라우저의 Preload List에 해당 도메인을 추가할 것
    

Preload List

이미 만들어져 있는 HSTS List를 웹 브라우저에 제공하는 기능으로 이러한 HSTS List를 Preload List라고 부름

참고 자료

댓글남기기