STUN의 기본 개념
STUN(Session Traversal Utilities for NAT)은 클라이언트가 자신이 연결된 네트워크의 공인 IP 주소와 NAT(Network Address Translator) 유형을 알아내기 위해 사용되는 네트워크 프로토콜이다. NAT 환경에서 클라이언트가 공인 인터넷에서 자신의 위치를 파악하고, 피어 간의 직접적인 연결을 설정하기 위해 STUN 서버를 사용한다. 이는 WebRTC에서 피어 간의 직접적인 미디어 스트림 전송을 가능하게 하는 중요한 요소 중 하나이다.
STUN의 작동 원리
STUN 프로토콜은 클라이언트와 STUN 서버 간의 요청-응답 기반의 메커니즘을 통해 작동한다. 클라이언트는 STUN 서버에 요청 메시지를 보내고, 서버는 요청을 받은 IP 주소와 포트를 포함한 응답을 반환한다. 클라이언트는 이 응답을 통해 자신의 공인 IP 주소와 포트를 확인할 수 있다. STUN 메시지는 UDP를 기반으로 전송되며, 클라이언트와 서버 간의 상호작용은 다음과 같이 이루어진다:
- Binding Request: 클라이언트는 STUN 서버에 Binding Request를 보낸다. 이 요청에는 클라이언트의 NAT 바인딩 정보를 요청하는 메시지가 포함된다.
- Binding Response: STUN 서버는 클라이언트의 요청에 대해 Binding Response를 반환한다. 이 응답에는 클라이언트가 외부에서 보게 될 공인 IP 주소와 포트 정보가 포함된다.
- NAT 유형 결정: 클라이언트는 반환된 정보를 바탕으로 자신이 연결된 NAT의 유형을 결정할 수 있다. 이 단계에서 클라이언트는 Symmetric NAT, Full Cone NAT, Restricted Cone NAT, Port Restricted Cone NAT 등의 NAT 유형을 판별한다.
NAT Traversal에서 STUN의 역할
STUN은 주로 NAT Traversal 메커니즘에서 활용된다. NAT Traversal은 NAT 환경에서 내부 네트워크의 클라이언트가 외부 네트워크와 직접 통신할 수 있도록 하는 방법이다. STUN은 피어 간의 직접 연결을 위해 필요한 공인 IP 주소와 포트 정보를 클라이언트에게 제공함으로써 NAT Traversal을 지원한다. 특히, STUN은 다음과 같은 상황에서 사용된다:
- Public IP Discovery: 클라이언트가 NAT 뒤에 위치한 경우, 공인 IP 주소와 포트를 알아내기 위해 STUN 서버에 요청을 보낸다.
- Connection Establishment: STUN은 피어 간의 연결 설정을 돕기 위해 사용된다. 예를 들어, WebRTC에서 ICE (Interactive Connectivity Establishment) 프로토콜은 STUN을 활용하여 후보군을 수집하고, 이를 바탕으로 피어 간의 최적의 연결 경로를 선택한다.
STUN 메시지 포맷
STUN 프로토콜의 메시지 포맷은 매우 간단하며, 기본적으로 요청(request)과 응답(response)으로 구분된다. 각 메시지는 20바이트의 헤더와 여러 속성(attribute)으로 구성된다. 주요 속성들은 다음과 같다:
- MAPPED-ADDRESS: 클라이언트의 공인 IP 주소와 포트를 나타낸다. STUN 서버가 Binding Request에 대한 응답으로 제공하는 주요 정보이다.
- XOR-MAPPED-ADDRESS: 보안 강화를 위해 XOR 연산을 적용한 IP 주소와 포트를 제공한다.
- USERNAME: 메시지의 상호 인증을 위한 사용자 이름이다.
- MESSAGE-INTEGRITY: 메시지의 무결성을 확인하기 위한 HMAC-SHA1 해시 값이다.
- FINGERPRINT: 메시지의 전체성을 검증하기 위해 CRC32 알고리즘을 사용하여 계산된 값이다.
STUN의 제한 사항 및 한계
STUN은 매우 유용한 프로토콜이지만, 모든 NAT 환경에서 완벽하게 작동하지는 않는다. 예를 들어, Symmetric NAT의 경우 STUN만으로는 피어 간의 연결을 설정하는 것이 어렵다. 이 때문에 TURN (Traversal Using Relays around NAT) 프로토콜이 STUN의 한계를 보완하는 데 사용된다. TURN은 STUN과 달리 중계 서버를 통해 클라이언트 간의 데이터를 전달하는 방식을 사용하여 더 복잡한 NAT 환경에서도 연결을 유지할 수 있게 한다.
관련 자료: - RFC 5389: Session Traversal Utilities for NAT (STUN) - RFC 8445: Interactive Connectivity Establishment (ICE) - WebRTC의 이해와 활용, 한국정보통신학회, 2021