STUN, TURN, NAT 쉽게 이해하기

작성 · 수정

화상통화 설정 안내를 읽다 보면 NAT, STUN, TURN이라는 말을 만납니다. 내부 용어처럼 들리지만 사실은 단순한 문제를 가리킵니다. 내 기기는 공유기 뒤에 있고, 내가 전화하려는 기기도 공유기 뒤에 있다는 것입니다. 이 글은 그 문제와 해결하는 세 가지 도구, 그리고 이 지식으로 실제로 할 수 있는 일을 설명합니다.

문제: 집 안 네트워크는 밖에서 보이지 않습니다

큰 아파트 단지를 떠올려 보세요. 단지에는 주소가 하나뿐이지만 수백 개의 집이 있고, 각 집의 동호수는 단지 안에서만 의미가 있습니다. 공유기는 그 단지의 경비실입니다. 집 안의 모든 기기에는 동호수 같은 사설 주소가 있고, 이 주소는 바깥에서는 아무 의미가 없습니다. 기기가 인터넷으로 요청을 보내면 공유기는 그 요청을 단지의 하나뿐인 공인 주소와 번호를 붙여 다시 쓰고, 답이 어느 집의 것인지 기억해 둡니다. 이렇게 다시 쓰는 일이 네트워크 주소 변환, 곧 NAT입니다. MDN도 같은 식으로 설명합니다. 여러 기기가 하나의 공인 IP를 공유하고, 각각은 공유기 뒤의 사설 주소를 가지며, 공유기가 나가는 요청을 자기 공인 주소와 고유한 포트로 변환합니다.

NAT는 대부분의 일에 좋습니다. 주소를 절약하고 엉뚱한 트래픽을 막아 줍니다. 하지만 두 브라우저 사이의 통화에서는 방해가 됩니다. 브라우저 A는 경비실이 자신에게 배정한 공인 주소와 포트를 모르고, 브라우저 B도 마찬가지입니다. 알더라도 어떤 경비실은 집 안에서 먼저 그 상대에게 무언가를 보내지 않았다면 안쪽으로 아무것도 들여보내지 않습니다. MDN은 일부 공유기는 누가 들어올 수 있는지도 제한하므로 공인 주소를 알아도 상대가 연결하지 못할 수 있다고 설명합니다.

도구 하나: STUN, 인터넷 위의 거울

STUN은 Session Traversal Utilities for NAT의 약자입니다. STUN 서버는 한 가지 일만 하는 작은 공개 서비스입니다. 브라우저가 메시지를 보내면, 그 메시지가 어느 주소와 포트에서 왔는지를 답으로 알려 줍니다. 아파트 비유로는, 밖으로 나가 지나가는 사람에게 경비실 주소가 어떻게 보이는지 물어서 적어 두는 것입니다. 이제 내 공인 주소를 알게 되었고 통화하려는 사람에게 알려 줄 수 있습니다.

STUN을 정의한 표준 RFC 8489는 주된 목적이 끝점이 NAT가 자신의 사설 주소에 대응시킨 공인 주소와 포트를 알아내게 하는 것이라고 밝힙니다. 또한 STUN은 그 자체로 완전한 해법이 아니라 더 큰 시스템이 쓰는 구성 요소라고도 적습니다. 기본 포트는 3478이고, TLS 위의 STUN은 5349입니다. 서버가 아주 작은 질문에 답하고 물러나기 때문에 STUN은 부담이 적고, 그래서 많은 서비스가 ChatLite와 이 사이트의 연결 테스트가 쓰는 구글 서버 세 곳 같은 무료 공개 STUN 서버를 이용합니다.

도구 둘: TURN, 다른 방법이 없을 때의 택배

때로는 공인 주소를 아는 것으로 부족합니다. 양쪽 경비실이 서로의 패킷을 들이지 않기 때문입니다. 목적지마다 새로운 공인 포트를 고르는 더 엄격한 NAT에서 흔합니다. MDN은 이를 대칭형 NAT라고 부르며, 이전에 연결한 적이 있는 상대의 연결만 받는 공유기라고 설명합니다. 이런 상황에서는 브라우저가 아무리 영리해도 직접 경로를 열 수 없습니다.

TURN은 택배로 해결합니다. TURN은 Traversal Using Relays around NAT의 약자입니다. 두 브라우저가 모두 공용 인터넷의 TURN 서버로 밖을 향해 연결하고, 서버가 한쪽 패킷을 다른 쪽으로 전달합니다. RFC 8656은 TURN을 NAT 뒤의 호스트가 중간 릴레이 서버를 이용해 다른 호스트와 패킷을 주고받게 하는 프로토콜로 설명하며, 클라이언트가 UDP, TCP, TLS, DTLS로 서버에 접속할 수 있다고도 밝힙니다. 이 다양성은 엄격한 네트워크에서 중요합니다. TLS로 접속한 릴레이는 평범한 웹 트래픽처럼 보이므로 UDP가 막힌 곳에서도 동작할 수 있습니다.

택배의 대가는 대역폭입니다. 모든 영상과 소리가 서버를 지나므로 운영자에게 실제 비용이 들고, 약간의 지연이 더해지며, 미디어가 나와 상대 사이의 직접 경로가 아니게 됩니다. 그래서 TURN은 대안이 없을 때만 쓰이고, 많은 무료 서비스가 모두에게 릴레이를 제공하지 못합니다.

도구 셋: ICE, 계획자

ICE(Interactive Connectivity Establishment)는 이 도구들을 하나로 묶는 절차입니다. 각 브라우저가 자신에게 닿을 수 있는 방법의 목록, 곧 후보를 모으고, 두 브라우저가 목록을 교환해 쌍을 시험하다 하나가 성공하면 그 쌍을 씁니다. MDN의 후보 유형 설명은 유용한 요약표가 됩니다.

ICE는 좋은 후보부터 시도해 나쁜 후보로 내려갑니다. 결과는 동작하는 가장 짧은 경로이며, 가장 저렴하고 빠르기도 합니다. 성공한 통화의 대부분은 host나 srflx 쌍으로 끝나고, relay는 안전망입니다.

내 통화에 주는 의미

직접 확인해 볼 수 있습니다. 이 사이트의 WebRTC 연결 테스트는 내 브라우저에서 후보를 모아 종류별로 몇 개를 찾았는지 보여줍니다. 거기서 relay 후보가 0개인 것은 테스트가 일부러 STUN만 쓰기 때문에 정상입니다.

작은 용어 사전

ChatLite에 대해

ChatLite는 STUN으로 브라우저 사이의 직접 연결을 시도하며 릴레이 서버를 항상 쓸 수 있다고 보장하지 않습니다. 그래서 중요한 통화 전에 이 사이트의 연결 테스트가 도움이 됩니다.

참고 자료

이 글을 확인하는 데 쓴 공식 문서입니다. 문서는 각 운영 주체가 관리하며 바뀔 수 있습니다. 한국어 메뉴 이름은 버전과 언어 설정에 따라 다를 수 있으니, 화면의 이름과 다르면 비슷한 항목을 찾거나 공식 문서의 영어 이름을 참고하세요.

ChatLite의 현재 동작을 기준으로 검토한 날짜: .