TURN 서버는 Traversal Using Relays around NAT 프로토콜의 서버로, 직접 P2P 연결이 불가능할 때 두 피어 간의 미디어 트래픽을 중계합니다. IETF RFC 5766, 2010에 따르면, TURN 서버는 WebRTC의 ICE 프로세스에서 최후의 폴백(fallback)으로 작동하여 Symmetric NAT 및 기업 방화벽이 있는 경우에도 보장된 연결을 제공합니다.
핵심 요점
TURN 서버(Traversal Using Relays around NAT)는 RFC 5766에 정의되고 RFC 8656에서 업데이트된 네트워크 서비스로, NAT 또는 방화벽 제한으로 인해 직접 P2P 연결이 불가능할 때 두 클라이언트 간의 UDP 및 TCP 트래픽을 중계합니다. WebRTC 아키텍처에서 TURN 서버는 최종 폴백 메커니즘으로 작동하여 모든 네트워크 조건에서 연결성을 보장합니다.
단순히 클라이언트에 외부 주소를 알려주는 STUN과 달리, TURN 서버는 데이터 전송에 적극적으로 참여합니다. 각 피어는 TURN 서버와 연결을 설정하고 미디어 데이터를 전송합니다. TURN 서버는 이 데이터를 상대 피어에게 전달합니다. 결과적으로 피어 간에 직접 연결은 존재하지 않으며, 모든 트래픽이 릴레이 서버를 통과하여 가장 엄격한 NAT 제한 하에서도 전달이 보장됩니다.
TURN은 STUN 프로토콜의 확장입니다. TURN 메시지는 동일한 20바이트 헤더와 속성 메커니즘을 사용합니다. 주요 차이점은 TURN이 새로운 메시지 유형(Allocate, Refresh, Send, Data, CreatePermission, ChannelBind)과 릴레이 할당 관리에 필요한 속성을 정의한다는 것입니다. 클라이언트는 Allocate 메시지를 통해 TURN 서버에 할당을 생성하고, 중계 전송 주소(relayed transport address)를 받아 서버를 통해 데이터를 송수신하는 데 사용합니다.
TURN 서버는 다음 단계 순서에 따라 작동합니다. 클라이언트는 인증 정보(사용자 이름, 자격 증명)와 함께 Allocate Request를 보냅니다. 서버는 자격 증명을 확인하고 할당(TURN 서버의 IP:포트에 클라이언트를 임시로 바인딩)을 생성합니다. 서버는 중계 전송 주소가 포함된 Allocate Response를 반환합니다. 이 주소는 다른 피어가 TURN 서버를 통해 이 클라이언트로 데이터를 보내는 데 사용할 주소입니다.
할당이 생성된 후, 클라이언트는 Send Indication 메시지 또는 채널(ChannelBind)을 통해 TURN 서버를 경유하여 데이터를 보낼 수 있습니다. 클라이언트로부터 데이터를 수신하면, TURN 서버는 권한(특정 피어에 데이터 전송 권한)을 확인하고 대상 피어로 데이터를 중계합니다. 수신 데이터를 받으려면 클라이언트가 먼저 데이터를 기대하는 피어에 대한 권한을 생성해야 하며, 그렇지 않으면 TURN 서버가 수신 패킷을 폐기합니다. 권한은 피어의 IP 주소를 지정하여 CreatePermission 메시지를 통해 생성됩니다.
TURN 서버의 할당에는 제한된 수명이 있습니다 — 기본적으로 10분입니다. 클라이언트는 할당을 연장하기 위해 정기적으로 Refresh Request를 보내야 합니다. 수명은 LIFETIME 속성에 초 단위로 지정됩니다. Refresh가 수신되지 않으면 서버는 할당을 제거하고 중계 주소를 해제합니다. 권장 새로 고침 간격 — Refresh 패킷 손실에 대비하여 5분(300초)입니다.
WebRTC에서 TURN 서버는 iceServers 배열의 RTCPeerConnection 구성을 통해 설정됩니다. TURN 서버는 UDP, TCP 또는 TLS 전송을 사용할 수 있습니다. 인증은 일반적으로 애플리케이션 서버에서 제한된 유효 기간으로 생성되는 시간 제한 자격 증명(TURN 자격 증명)을 사용합니다.
JavaScript에서 HMAC-SHA1 토큰 인증을 사용한 TURN 서버 구성 예시를 살펴보겠습니다.
async function createPeerConnection(turnServerUrl) {
const credentials = await fetchTurnCredentials();
const config = {
iceServers: [
{
urls: "stun:stun.l.google.com:19302"
},
{
urls: turnServerUrl,
username: credentials.username,
credential: credentials.credential
}
],
iceTransportPolicy: "all"
};
return new RTCPeerConnection(config);
}
async function fetchTurnCredentials() {
const response = await fetch("/api/turn-credentials");
return response.json();
}
const turnUrl = "turn:turn.example.com:3478";
const pc = await createPeerConnection(turnUrl);
이 예시에서 TURN 서버는 STUN 서버와 함께 단일 ICE 구성에 지정됩니다. ICE 프로세스는 먼저 호스트 후보와 STUN에서 얻은 srflx 후보를 사용하려고 시도합니다. 직접 연결이 실패하면 ICE는 자동으로 TURN 서버에서 얻은 릴레이 후보로 전환합니다. 매개변수 iceTransportPolicy: "all"은 릴레이 후보를 활성화합니다. 대체 값 "relay"는 TURN을 제외한 모든 후보를 비활성화하며, 테스트에 유용합니다.
무단 사용을 방지하기 위해 TURN 서버는 인증이 필요합니다. 표준 접근 방식은 HMAC-SHA1을 사용하여 애플리케이션 서버에서 생성되는 시간 제한 자격 증명입니다. 애플리케이션 서버는 TURN 서버의 비밀 키로 사용자 이름을 암호화하고 사용자 이름과 자격 증명을 클라이언트에 반환합니다. 클라이언트는 이를 RTCPeerConnection 구성에 전달하고, 브라우저는 TURN 서버에서 할당을 생성할 때 이를 사용합니다. 자격 증명이 만료되면 클라이언트는 애플리케이션 서버에서 새 자격 증명을 받습니다.
TURN과 STUN은 관련 NAT 트래버설 작업을 해결하지만 메커니즘과 비용에서 근본적으로 다릅니다. TURN은 트래픽을 중계하여 중개자 역할을 하는 반면, STUN은 직접 P2P 연결을 위한 외부 주소 확인만 지원합니다. 둘 중 선택은 피어의 NAT 유형과 성능 요구 사항에 따라 달라집니다.
| 기준 | STUN | TURN |
|---|---|---|
| 메커니즘 | 외부 주소 발견 | 트래픽 중계 |
| 연결 | 직접 P2P | 릴레이 서버를 통해 |
| 지연 시간 | 최소(직접 경로) | 추가(릴레이 통해) |
| 서버 부하 | 초기 요청만 | 지속적인 트래픽 중계 |
| 비용 | 낮음(소량 요청) | 높음(서버 트래픽) |
| Symmetric NAT 지원 | 아니오 | 예 |
| 대역폭 | P2P 채널로만 제한 | 서버 채널로 제한 |
실제로 TURN 서버는 P2P가 불가능한 연결에만 사용됩니다. Google(WebRTC 통계, 2023)에 따르면, 모든 WebRTC 연결의 약 15–20%가 TURN 중계를 필요로 합니다. 나머지 80–85%는 STUN 또는 로컬 호스트 후보를 통해 연결을 설정합니다. 애플리케이션을 설계할 때, 사용자층에 기업 네트워크 및 엄격한 NAT 제한이 있는 지역의 사용자가 포함된 경우 총 미디어 볼륨의 15–20%를 TURN 트래픽으로 예산 책정해야 합니다.
TURN 서버는 모든 미디어 트래픽이 통과하므로 상당한 리소스를 소비합니다. TURN 중계를 사용하는 각 활성 통화는 총 미디어 트래픽 처리량(수신 + 발신 스트림)과 동일한 서버 대역폭을 사용합니다. HD 화상 통화(720p)의 경우, 각 방향으로 연결당 1.5–2.5Mbps, TURN 서버를 통과하는 총 트래픽은 3–5Mbps입니다.
TURN 인프라 배포에는 여러 옵션이 있습니다. 무료 공용 TURN 서버는 품질 및 보안 보장이 부족하여 프로덕션에 권장되지 않습니다. 상용 제공업체(Twilio Network Traversal Service, Xirsys, Metered)는 기가바이트당 가격으로 TURN을 서비스로 제공합니다. 일반적인 비용은 기가바이트당 $0.005–0.02입니다. coturn(오픈 소스 TURN 서버)을 사용한 자체 호스팅에는 충분한 대역폭 용량과 모니터링 설정이 있는 서버가 필요합니다.
TURN 서버 솔루션을 선택할 때는 사용자 지리적 분포, 트래픽 비용 및 보안 요구 사항을 고려하십시오. 수천 개의 동시 통화가 있는 애플리케이션의 경우, 넓은 채널(1+Gbps) 서버의 자체 호스팅 coturn이 상용 제공업체보다 비용 효율적일 수 있습니다. 수십 명의 사용자가 있는 소규모 프로젝트의 경우, 관리 및 모니터링 오버헤드가 없기 때문에 상용 TURN 서비스가 더 좋습니다.
자주 묻는 질문
TURN 서버는 사용자가 직접 연결할 수 없을 때 데이터를 중계하는 중개자입니다. 두 컴퓨터가 직접 연결을 허용하지 않는 라우터 뒤에 있는 경우, TURN 서버는 한쪽에서 데이터를 받아 다른 쪽으로 전송합니다.
TURN 서버는 WebRTC 통화의 두 참가자가 모두 Symmetric NAT 또는 P2P 트래픽을 차단하는 기업 방화벽 뒤에 있을 때 필요합니다. 이러한 경우 STUN이 도움이 되지 않으며, ICE 프로세스가 자동으로 TURN 서버에서 얻은 릴레이 후보로 전환합니다.
STUN은 단순히 컴퓨터에 직접 연결을 위한 외부 주소를 보여줍니다. TURN은 자체를 통해 트래픽을 적극적으로 중계합니다. STUN은 서버 부하를 발생시키지 않는 반면, TURN은 대역폭을 소비합니다. STUN은 특정 NAT 유형에서만 작동하지만, TURN은 항상 작동하지만 비용이 더 듭니다.
TURN 서버 비용은 제공업체와 트래픽 양에 따라 다릅니다. Twilio는 TURN 중계 트래픽 1GB당 약 $0.005–0.01을 청구합니다. Xirsys는 1GB당 $0.007부터 청구합니다. coturn 자체 호스팅에는 최소 100Mbps 대역폭의 서버가 필요하며, 비용은 호스팅 제공업체에 따라 다릅니다.
자체 TURN 서버는 coturn(오픈 소스)을 사용하여 설정할 수 있습니다. 설치에는 포트, 인증(공유 비밀), TLS 인증서 및 방화벽 구성이 포함됩니다. 기본 구성 파일에는 listening-port, realm, user 및 fingerprint 매개변수가 포함됩니다. 설정 후, 서버는 TLS의 경우 turn: 또는 turns: 접두사를 사용하여 WebRTC iceServers에 지정됩니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.