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의 후보 유형 설명은 유용한 요약표가 됩니다.
- host: 내 기기나 로컬 네트워크의 주소. 두 기기가 같은 네트워크에 있을 때 동작합니다.
- srflx(서버 반사형): STUN 서버가 본 내 공인 주소. 대부분의 가정용 공유기를 통과합니다.
- prflx(피어 반사형): 브라우저끼리 서로 시험하는 동안 발견되는 주소. 더 엄격한 NAT가 끼어 있을 때 흔합니다.
- relay: TURN 서버의 주소. 거의 어디서나 되지만 효율은 가장 낮습니다.
ICE는 좋은 후보부터 시도해 나쁜 후보로 내려갑니다. 결과는 동작하는 가장 짧은 경로이며, 가장 저렴하고 빠르기도 합니다. 성공한 통화의 대부분은 host나 srflx 쌍으로 끝나고, relay는 안전망입니다.
내 통화에 주는 의미
- 두 사람이 모두 평범한 가정이나 모바일 네트워크에 있다면 대개 STUN으로 충분하며, 통화는 두 브라우저 사이를 직접 오갑니다.
- 한 사람이 엄격한 공유기, 회사 방화벽, 학교 네트워크 뒤에 있다면 릴레이가 필요할 수 있습니다. 릴레이가 없으면 메시지는 서버를 통해 전달되므로 텍스트 채팅은 되는데 통화만 연결되지 않을 수 있습니다.
- VPN이나 프록시는 나타나는 후보를 바꾸고, 좋은 네트워크를 엄격한 네트워크처럼 동작하게 만들 수 있습니다. VPN 관련 글을 보세요.
- 내 쪽 테스트 결과가 좋다고 통화가 보장되는 것은 아닙니다. 상대 네트워크도 협조해야 합니다.
- 로컬 주소가 .local로 끝나는 무작위 이름으로 보일 수 있습니다. 브라우저의 개인정보 보호 기능이지 고장이 아닙니다.
직접 확인해 볼 수 있습니다. 이 사이트의 WebRTC 연결 테스트는 내 브라우저에서 후보를 모아 종류별로 몇 개를 찾았는지 보여줍니다. 거기서 relay 후보가 0개인 것은 테스트가 일부러 STUN만 쓰기 때문에 정상입니다.
작은 용어 사전
- NAT: 여러 기기가 하나의 공인 주소를 공유하게 해 주는 공유기의 주소 다시 쓰기.
- STUN: 내 공인 주소를 알려 주는 공개 서비스.
- TURN: 직접 경로가 불가능할 때 통화를 전달해 주는 공개 릴레이.
- ICE: 후보를 모아 가장 좋은 동작 쌍을 찾는 절차.
- SDP: 형식, 암호화 같은 통화의 내용을 적은 텍스트로, 연결 설정의 일부로 브라우저가 교환합니다.
- UDP와 TCP: 데이터를 보내는 두 방식. UDP는 더 빠르고 실시간 미디어에 선호되며, TCP는 더 안정적이고 UDP가 막혔을 때 쓰입니다.
ChatLite에 대해
ChatLite는 STUN으로 브라우저 사이의 직접 연결을 시도하며 릴레이 서버를 항상 쓸 수 있다고 보장하지 않습니다. 그래서 중요한 통화 전에 이 사이트의 연결 테스트가 도움이 됩니다.
참고 자료
이 글을 확인하는 데 쓴 공식 문서입니다. 문서는 각 운영 주체가 관리하며 바뀔 수 있습니다. 한국어 메뉴 이름은 버전과 언어 설정에 따라 다를 수 있으니, 화면의 이름과 다르면 비슷한 항목을 찾거나 공식 문서의 영어 이름을 참고하세요.
ChatLite의 현재 동작을 기준으로 검토한 날짜: .