한국 인터넷 검열, 그리고 다가오는 끝

2026-01-11

이 글을 어른인 제가 인터넷을 사용하는데 제약을 두는 망할 “심의위원회”에 바칩니다.

우리나라는 독재 정권도 아니고 중국의 황금 방패도 없지만, 인터넷을 검열하는 것은 널리 알려져 있습니다. 외국인의 경우에는 막 도착해 호텔방에서 성인 사이트에 접속하려 하다가 충격을 주게 마련이죠.

물론, 이렇게 정책이 되어 있는 게 맞는가, 아닌가 적으면 글이 너무 길어져 안 읽으실 듯합니다. (물론 이미 창을 닫으셨겠지만 읽고 있다고 가정해 보겠습니다. 아직도 읽고 계신다면 감사하고요.) 하지만 제 생각에는 이렇게 검열을 진행하게 된다면 권한이 악용되거나 확대하여 해석되는 경우가 있을 것이고, 이미 성인으로서 법적으로 아무런 문제가 없는 사이트 접속도 차단되고 있어 벌써 문제가 되는 상황입니다. 따라서 이 방식은 적합하지 않다고 생각하고 다음에 폐지되어야 한다고 생각하지만, 일단 한국에선 어떻게 인터넷이 검열되는지 알아보겠습니다.

(예전에 사용했던) 한국의 인터넷 검열 방식

예전에는 한국의 주요 통신사들이 DNS를 조작하는 방식으로 인터넷을 검열했었습니다. 다른 국가들이 사용했던 주 방식인데, 예시로 Google.com에 접속하려고 했을 때 구글이 (어떤 심사를 통해) 차단된 사이트 목록에 속한다면, 통신사의 DNS 서버에서 구글의 IP가 아닌 다른 IP로 응답해 사용자를 가로채는 방식이었습니다.

물론, 암호화된 DNS의 보급과 브라우저의 HTTPS 검증을 통해 (특히 HSTS가 활성화되어 있다면) 한국 정부가 만든 “경고” 페이지를 더 이상 볼 수 없게 되었죠.

기억을 되살리기 위해, 만약 예전에 이러한 검열 방식에 걸리게 되면 다음과 같은 페이지가 나타났습니다:

대한민국 정부 인터넷 검열 경고 페이지

디자인도 끔찍하고, (“Warning” 문구를 제외하면) 모두 한국어로 되어 있어 외국인이 이해하기 어려우며, 무슨 심의를 거쳐 불법 또는 유해 내용을 담고 있는 사이트를 “합법적”으로 차단한다는 말도 안 되는 소리를 하는데, 물론 여기에서 “유해 내용”이란 성인이면 봐도 상관없지만 아동 및 청소년이 실수로 접속해서 볼 수도 있기 때문에 정부가 부모를 대신해서 차단해 주는 것도 포함됩니다. 부모님들이 실제로 기기의 연령 제한 기능을 사용하는 것은 너무 어렵고 일반 사용자라면 어떻게 하는지 모르니까, 당연히 전부 다 못 접속하는 것이 합당하죠!

위에 설명했듯이, DNS 요청을 평문 포트에서 주고받는 점이 끔찍하다는 것을 인지한 후, DNS-over-TLS와 DNS-over-HTTPS와 같은 것을 보급하여 빠르게 패치해나갔습니다. 따라서 한국 통신사들은 DNS 쿼리를 더 이상 낚아채지 않지만, 그래도 혹시 모를 다른 짓거리를 할 수도 있으니 다른 DNS 서버를 사용하는 것이 좋습니다.

그러면 어떻게 검열 방식이 바뀌었을까요?

(현재 사용되는) 한국의 인터넷 검열 방식

현시점에선, 통신사들은 실제 HTTPS 요청을 확인합니다.

서버에 요청을 보내게 될 경우, TLS 연결을 정립하기 위한 통신이 몇 번 이루어집니다. 이 과정에서 사용되는 TLS 확장 중의 하나가 Server Name Indication(SNI)입니다. 이 확장이 필요한 이유는 웹 서버들이 더욱더 reverse proxy의 역할을 하면서 한 서버에 여러 도메인을 제공하는 경우가 늘고 있기 때문에, 정확히 어떤 도메인을 사용자가 원하는지 알려주는 장치가 필요하기 때문이죠. 따라서 SNI 필드에 도메인 정보가 보내지고, 서버는 도메인에 부합하는 TLS 인증서를 보내어 통신이 이루어지게 됩니다.

하지만 SNI 필드는 암호화되지 않아 한국(과 다른 나라들)의 통신사들이 무슨 사이트를 접속하려 하는지 확인할 수 있고, 연결을 끊어버릴 수 있습니다. 위의 검열 사이트에 리디렉트를 할 순 없지만, 연결을 중단하기 위해 리셋 패킷을 보낼 수 있죠.

그럼 어떻게 우회할 수 있나요?

쉽고 지루한 해결책은 VPN 또는 프록시 등을 사용하는 게 있지만.

그 SNI 필드 하나를 가리기 위해 사용하자니 낭비 같기도 하고 귀찮기도 합니다! 다른 해결책이 분명히 있겠죠?

당연히 있긴 있습니다. 처음에 발표되었을 때의 이름인 Encrypted Server Name Indication (ESNI)가 더욱더 보완되어 가장 최근에 발표된 표준인 Encrypted Client Hello(ECH)에선 TLS 연결을 정립할 때 사용되는 비암호화된 부분을 암호화해 줍니다.

ECH를 사용하게 된다면, 통신사들이 전송되는 데이터를 감시할 수 없으며 무슨 사이트에 연결하는지 확인할 수 없죠.

그럼 지금 바로 ECH를 사용할 수 있나요?

설명하기가 조금 복잡합니다.

대부분의 주요 브라우저에서 현재 ECH를 지원하고 있는데, 서버들도 역시 지원을 추가해야 사용할 수 있습니다. 지원이 조금씩 확산하고 있지만, 모든 주요 서비스가 지원하기 전까지는 검열을 당하는 몇몇 사이트를 만나실 수도 있습니다.

curl와 같은 클라이언트들은 사용하는 SSL 라이브러리가 ECH를 지원해야 합니다. 예를 들자면, 현재 Arch Linux에 기본으로 제공되는 curl 바이너리는 ECH를 지원하지 않습니다.

개인적으로는 이 문제를 제 Rust 프로그램을 개발하면서 맞닥뜨렸는데, 브라우저에선 연결이 성공하는 사이트가 Rust 클라이언트에서는 실패하는 경우가 발생하여 확인하기 시작했습니다. 제가 사용하는 의존성인 reqwest가 최근에 rustls로 변경하였는데, 해당 라이브러리는 클라이언트 ECH를 지원하지만 reqwest에서 해당 기능을 어떻게 사용하는지에 대한 문서는 아직 존재하지 않고, 기본으로 활성화되어 있는지도 명시되어 있지 않습니다 (아마 활성화가 되어 있지 않겠죠).

그래도 ECH가 대중화된다면, 인터넷 연결을 검열하는 방법은 중국처럼 ESNI/ECH 기반의 모든 접속을 차단하는 수밖에 없습니다. 인터넷 대부분을 망가뜨리지 않고선 그렇게 할 수 있는 방법이 없죠.

언젠간 저 검열 웹사이트도 사라지고 다시는 볼 필요가 없겠죠?