안전한 웹을 위해 HTTPS 이해하기 | HSTS 란 | HSTS 세팅

2023. 1. 26. 13:17Backup

https://yozm.wishket.com/magazine/detail/1852/

 

https://yozm.wishket.com/magazine/detail/1862/

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security

 

위 글들을 제나름의 정리 & 백업하기 위한 목적의 글 입니다. 

또한 제가 이해한 형태로 재가공 하여 게재하오니, 되도록이면 원문의 글을 참조 부탁드립니다. 

제가 작성한 글 중, 잘못된 부분이 있다면 이유와 함께 고견 부탁드립니다. 

 

 

 


https://yozm.wishket.com/magazine/detail/1852/

HTTP / HTTPS 의 차이

평문 / 암호화

 

인터넷 콘텐츠를 전달하는 tcp 프로토콜의 일종인 http + s(secure) => https 

 

HTTPS 는 100퍼 안전할까? 

-> no

전달 구간(http)에 대한 보안기술이므로, 중간자 공격을 수행할 수 있는 취약점 있다면, 내용 노출의 위험성 잔존. 

더보기

(https://hacks.mozilla.org/2010/08/firefox-4-http-strict-transport-security-force-https/)

In the future, any requests to x.com are modified to be via https if they are attempted through http before the request hits the network.

This header is not considered during a non-encrypted HTTP transaction because the User-Agent doesn’t know if the https actually exists and also because the header can be injected by an attacker.

 

따라서 

인스턴트 메시징과 같은 대화(개인간 대화)에서는 https 를 적용. 

종단간 암호화 (end to end encryption; E2EE)기술을 추가하여, 설령 https 가 무력화 되어도 노출된 데이터가 암호화를 유지하는 방법이 일반적으로 쓰인다. (ex, 카카오톡, 텔레그램 , 클라우드 기술 등 )

 

최근에는 https://letsencrypt.org/ 나, 여타 퍼블릭 클라우드 제공사를 통해 무료 제공 인증서를 쉽게 사용할 수 있다. 

 

 

 

https://www.rfc-editor.org/rfc/rfc6797

  HTTP Strict Transport Security (HSTS)

HSTS 웹 사이트 접속시, 사용자로 하여금 HTTPS만 사용하도록 강제하는 기술 (지원하는 브라우저 사용시)

https://caniuse.com/?search=HSTS

웹서버가 사용자를 https 로 유도하는데 사용되는 일반적인 방법 

1 사용자가 http 방식으로, url을 브라우저 주소창에 입력 후 엔터 친다. 고고~

2  웹서버는 301, Permanently Moved or 302, Temporarily Moved로 응답한다. (일단 https://www.rfc-editor.org/rfc/pdfrfc/rfc6797.txt.pdf 여기 HSTS명세에는 301 만 나와있긴 함. 통용되는 방법은 302도 되는건지? 모르겠네요.)

// 301 Redirect
Response.RedirectPermanent(url, true);
 
// 302 Redirect
Response.Redirect(url, true);

닷넷이라면 대충 이렇게 넣어준다고 해보겠다. 그럼, 실사용자 뿐 아니라 크롤러 까지도 위의 url 로 리다이렉트 된 값을 수집할 수가 있겠다. 

3 사용자의 브라우저는 HTTPS 방식으로 웹서버에 접속한다. 

 

허나, 1번 단계에서 이미 사용자의 http 패킷을 캡처할 수 있고, 쿠키 값 혹은 세션 정보를 엿볼 수 있음에 유의해야한다. 

 

HSTS를 적용하는 상세 방법 

응답헤더에 Strict-Transport-Security 라는 헤더를 세팅해 보낸다. 

이는 단순히, 301으로 리디렉션 구성하는 것보다 더욱 안전하다. 브라우저에게 HTTPS를 사용하라고 알리는 공식적인 방법이므로.  

 

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
https://hstspreload.org/?domain=facebook.com

위 페이지는 HSTS가 헤더에 어떤식으로 세팅 되어있는지 확인시켜주는 웹 페이지 이다. 

max-age=15552000 이므로 권장 연한보다 비교적 짧음을 알수있다. 

preloaded 인 hsts 웹사이트 목록에 facebook 이 있음을 의미한다. 한마디로 크롬은 이미 이 페이지가 hsts 설정이 되어있는 것을 이미 알고 있다 고 보면 되겠다. 

 

https://source.chromium.org/chromium/chromium/src/+/main:net/http/transport_security_state_static.json

 

 

크롬에서는 이런식으로 확인할 수 있다. 크롬에 등록하는 형태로 미리 알리거나, 언젠가 알아서 수집도 될 것이다. 

https://www.chromium.org/hsts/

 

 

네이버의 경우에는 아직 해당 리스트에서 unknown 이라서 빨간색으로 까지 보인다;

네이버의 HSTS 적용주기는 63072000초. 730일이다. includeSubdomains 라는 옵셔널한 설정을 통해 하위 도메인 모두 HSTS 설정이 적용되어있다. 

 

추측하건대, 맨처음 http로 사용자가 가나봄. 그래서 인증서 만료 시, https 로 아예 접속이 안될 수 있어 등록하지 않은 모양.
적용 예시 / cdn 에서 HSTS 를 쉽게 적용할 수 있게 한다.

위에 자세히 기재한 세팅 방법이 있었지만, 사실 cdn에서 이리도 간단히 적용할 수 있기도 하다. 

 

 

 

HSTS 한계

명세를 보니 꽤 오래되어 대부분의 현대 브라우저에서는 사용가능한 기능이다.

이 또한 위의 링크 중, ff 브라우저 개발자의 블로그글 하단의 담론에 의하면, 

"http를 사용하는, 단순한 사용자"를 위한 기능일 뿐, 모든 부분에서의 보안기능이 될 수 없음을 알 수 있다. (당연하지만..!)