서버랑 클라이언트는 HTTPS 통신을 할 때 위 그림과 같은 구조를 따른다. 그림 숫자를 보면서 이해하면 됨

 

1. 먼저 클라이언트 브라우저에서 '이제부터 서버님이랑 암호화해서 통신할래요' 하고 자신의 세션 ID, SNI, 어떤 암호화 구조를 쓸 수 있는지에 대한 정보, IV(암호화를 위한 이니셜 벡터)를 보낸다. 

 

2. 서버는 "ㅇㅋ"라고 하면서 어떤 암호화 구조를 서버가 쓰는지, 클라이언트가 앞으로 써야 할 세션 ID가 무엇인지, 또 다른 IV(이니셜 벡터), 그리고 빈 SNI를 보낸다

 

3. 이와 함께 서버는 클라이언트로 자신의 서버 인증서를 보낸다. 

 

4. 여기까지 초기 통신 (Hello)

 

5. iv를 가지고 브라우저는 이제부터 우리끼리 쓰는 암호키 재료는 이거에요 라고 암호화된 메시지를 보낸다.

 

6. 그 메시지를 가지고 클라이언트와 서버는 각각 암호키 한 쌍을 만든다.

 

7~9. 서버와 클라이언트는 서로의 키를 확인한다. 여기까지 핸드셰이킹이라 부름.

 

1~9는 5를 제외하면 암호화가 되어있지 않은 평문임. 그리고 5도 본문이 암호화되어있을 뿐 평문의 구조로 전달된다 (해독은 당연히 못한다.. 정확히 말해선 수십년 걸린다.)

 

서버와 클라이언트가 통신하는데, 어떻게 통신할지, 뭘로 암호화 할지, 어디로 가고, 어디로 오는지 정보가 없으면 어떻게 통신을 하겠냐.

여기까지 서버랑 클라이언트가 약속을 한 뒤, 그 다음부터 어플리케이션 데이터들이 6에서 만들어지고 7~9에서 검증된 키를 가지고 암호화 통신을 하는거임.

 

SNI 필드차단은 그 약속을 만들기 전, 평문 통신을 할 때 정보를 ISP(Internet Service Provider)들이 확인해서, ISP가 가지고 있는 블랙리스트에 있으면 걍 connection을 드랍해버리는거임.









Wireshark나 fiddler을 통해 패킷을 까보면, 실제로 SNI (Server Name Indication)이 고스란히 평문으로 노출되는걸 알 수 있다. 

물론 당연히 이건 로컬에서 들어가는 정보라 변조가 가능하고, 그걸로 슬쩍 회피하는게 지금 풀린 각종 회피도구들임. 소위 말하는 Fake SNI.

 

그러면 KT, SKt같은 ISP는 어딨냐 하니, 서버 - 클라이언트 사이에 위치함.

그 사이엔 DNS 서버라는게 있다. 클라이언트가 google.com이라고 보내면 DNS에 저장된 74.125.54.201 (임의의 ip임) 라는 ip랑 매핑을 해 줌.

그 매핑된 정보로 이제부터 통신하도록 하는거임.

 

자 그러면, 종합해보자. SNI 필드에 있는 평문이 DNS 서버 요청인데, 이걸 tcpdump같은걸로 뜨면 어디로 가는지 보이겠지? DNS 호출 단계에서 블랙리스트에 있는 ip로 가면 접속을 끊는거임. 어려울게 하나도 없다.




========


518 북한설 가짜뉴스 퍼뜨리다가

제지당하니까 또 https 검열타령하는

안페=릴베 끄나풀들이

이 글을 볼지는 모르겠는데

개소리 그만 지껄이고

제발 니들 본진가서 떠들어라