인터넷 사이트 차단

유튜브를 돌아다니다가 HTTPS 차단 규제가 위험한 이유에 대한 동영상을 봤다. 요지는 HTTPS의 SNI 필드를 이용해서 차단하는 기법은 정부가 패킷을 가로채 그 내용을 ‘검열’할 수도 있다는 것이었다. 아래에는 나라가 공산당화가 되고 있다느니… 분노에 찬 댓글들이 가득했다.

하지만 (나름) 전공자의 입장에서 동영상을 다 본 뒤에는 개운하지 못한 의문이 남았다. HTTPS 자체가 패킷 스니핑을 방지하기 위한 보안 프로토콜이라, 분명히 내용이 암호화되어 있을 텐데, 대체 어떻게 그 내용을 검열할 수 있다는 말일까.

자세한 기술적인 내용은 동영상에서는 자세히 설명되어 있지 않아서, 네트워크 수업 때 가물가물한 기억도 되찾을 겸 좀더 찾아봤다.

HTTPS/SSL

HTTPS(HTTP Secure)은 HTTP의 보안을 강화한 것으로, 암호화된 연결로 웹 서버와 통신하는 방식이다. 이를 위해 네트워크의 Transport Layer 계층에 추가적인 프로토콜이 추가되는데, 이 기술을 통합적으로 SSL, 또는 TLS라고 부른다.

SSL은 인증서(Digital Certificate)를 이용한 보안을 제공한다. 브라우저에는 신뢰할 수 있는 CA 목록과 CA 공개키가 미리 저장되어 있다. ‘신뢰할 수 있는 서버’는 비밀키로 암호화된 인증서를 브라우저로 전송하고, 브라우저는 이를 저장된 공개키로 복호화해서 풀리는지 검사한다. (풀리면 유효한 인증서고, 풀리지 않으면 가짜 인증서를 준 것)

인증서 유효성 검사를 포함한 Handshake 과정을 좀더 자세히 살펴보면 다음과 같다.

(출처: https://brunch.co.kr/@sokoban/22)

인증서의 유효성이 확인되면, 먼저 교환된 Random으로 만들어진 데이터를 활용해서 클라이언트와 서버가 공유하는 대칭키를 만든다. (Key generation) 이 대칭키를 서버의 공개키로 암호화해서 보내주고, 서버에서는 자신의 비밀키를 활용해서 대칭키를 복호화할 수 있다.

Handshake 과정에서 주고받는 SNI 값이 바로 Server Name Indication, 즉 접속하고자 하는 호스트 이름이다. 가상 도메인의 개념으로 이해할 수 있다. 왜 SNI 값을 보내는 걸까? 바로 한 IP를 사용하는 서버가 하나의 사이트만 운영하지는 않을 수 있기 때문이다. nginx와 같은 웹 서버 소프트웨어로 vhost를 지정해서 각 도메인에 각각 다른 app이 연결되도록 설정할 수 있다. 한 서버에 dev.hello.com, test.hello.com 이런 식으로 다른 서브도메인을 연결해서 쓰는 경우도 굉장히 흔하게 봤다. 그런데 이 경우, TLS를 사용할 때 문제가 된다. 왜냐하면 호스트 이름은 HTTP 헤더에 포함되어 있는데, 처음 Handshake를 하는 과정에서는 이 필드가 암호화되어 있기 때문에 서버가 알지 못한다. 그러므로 요청이 어떤 서버에 대한 것인지 판단할 수가 없다.

그래서 대신 첫 Handshake 과정에서 SNI를 바로 교환하는 것이다. 즉, 이 값은 평문으로 교환된다.

SNI 바꿔치기를 통한 사이트 차단

이번에 정부와 통신사가 한다는 게 바로 이 SNI를 가로채서 유효하지 않은 값으로 바꾸고, 그 결과 (자신들이 판단하기에) 유해 사이트에 대한 접속을 차단한다는 것이다.

물론 이는 망중립성(=모든 패킷은 평등하게 다뤄져야 한다)에 어긋나고, 어떤 관점에서 보면 지나친 규제라고 할 수도 있을 것이다. 우회 방법이 있기는 하지만, 차단하는 사이트의 기준은 어쨌든 정부에서 규정하는 것이므로. 하지만 이렇게 SNI를 변조하는 행위가 정부의 검열 행위라고 주장하는 데에는 어폐가 있는 것 같다. 왜냐하면 애초에 SNI는 누구든 볼 수 있는 정보인걸.. 사실 일반인도 마음만 먹으면 전송되는 HTTPS 패킷을 스니핑해서 SNI를 확인하고 수정까지 할 수 있다. 그리고 망중립성의 부분을 따진다면 지금까지 시행해 왔던 DNS 리디렉션을 통한 HTTP 규제에 비해, 이번 SNI 규제가 그리 특별할 것은 없다는 생각이다.

유튜브에서 자극적인 투로 말하는 것들을 곧이곧대로 들으면 안되겠다는 또다른 교훈을 얻는다. 이 경우엔 내가 조금이라도 친숙한 분야였기 때문에 의문을 가질 수 있었지만, 내가 모르는 분야에 대해서는, ‘일반인이 알기 쉽게’ 포장한 얕은 기술적 설명으로 얼마나 쉽게 자신의 견해를 주입시킬 수 있을지를 깨닫게 됐다.