WebRTC, Signaling, STUN Server, TURN Server

iamyoungbin·2024년 1월 12일

WebRTC란

WebRTC(Web Real-Time Communication)란 웹 어플리케이션과 사이트가 중간자 없이 브라우저 간에 오디오나 영상 미디어를 포착하고 마음대로 스트림할 뿐 아니라, 임의의 데이터도 교환할 수 있게 하는 기술이다.

WebRTC를 사용한 웹 애플리케이션에서는 별도의 플러그인이나 소프트웨어없이 P2P(Peer-to-Peer) 연결을 통해 데이터 교환을 가능하게 한다.


동작과정

WebRTC는 P2P 방식의 커뮤니케이션이기 때문에 각각의 웹 애플리케이션은 다음과 같은 과정을 거쳐야 한다.

  1. 각 애플리케이션이 P2P 커뮤니케이션에 동의
  2. 서로의 주소를 공유
  3. 보안 사항 및 방화벽 우회
  4. 멀티미디어 데이터를 실시간으로 교환

클라이언트 간의 연결을 위해서는 각 클라이언트가 서로의 IP 주소와 미디어 데이터의 정보(해상도, 형식, 코덱)를 필요로 한다. 하지만 WebRTC의 경우 두 클라이언트 간의 별도의 중계자가 없기 때문에 각 클라이언트에게 이를 제공하는 별도의 서버가 필요하다.


Signaling Server

서로 다른 네트워크 장치간에 통신을 위해서는 사용할 프로토콜, 채널, 미디어 코덱 및 형식, 데이터 전송 방법, 라우팅 통과 방법과 NAT 통과 방법을 포함한 통신 규격을 장치 간에 교환해야 하고 이를 시그널링(Signaling)이라고 한다.

시그널링을 통해 피어 간에 연결을 위한 정보를 교환하고 P2P 연결을 가능하게 한다.

WebRTC에서는 두 클라이언트 사이의 별도의 중계자가 없기 때문에 이를 제공하는 별도의 매체가 필요하고 이를 Signaling Server라고 한다.


STUN Server

STUN(Session Traversal Utilities for NAT)은 어떤 종단이 NAT 혹은 방화벽 뒤에 있는지 확인할 수 있는 통신 프로토콜이다.

NAT 환경에서는 외부 네트워크와 private ip와 포트 넘버가 아닌 NAT을 통해 제공되는 public ip와 포트 넘버를 통해 통신한다. 이 때문에 서로 다른 NAT 상의 두 클라이언트가 P2P 통신을 하기 위해서는 다음과 같은 걸림돌이 존재한다.

  1. A(나)는 B와 P2P 통신을 하려하는데 나는 내 private ip와 포트넘버만 알고 NAT을 거쳐 어떠한 public ip와 포트 넘버로 변환될지를 모른다.
  2. A(나)가 받은 B의 private ip와 포트 넘버로는 해당 목적지 주소의 패킷이 실제로 B로 도착할 수 없다. (private ip는 하나의 NAT에서만 유효하고, B와 같은 private ip를 쓰는 네트워크 기기는 엄청나게 많다)

따라서 두 클라이언트 간에 P2P 통신을 하기 위해서는 각 클라이언트는 서로의 private ip 주소가 아닌 public ip 주소를 교환해야 한다. 따라서 시그널링 시에 STUN Server를 통해 자신의 private ip 주소와 포트 넘버를 확인하고 이를 바탕으로 P2P 통신을 진행한다. P2P 통신이 진행되는 과정은 다음과 같다.

  1. A와 B가 서로의 주소를 교환하기에 앞서 우선 STUN Server에 접속한다.
  2. STUN Server는 단순히 접속한 클라이언트에게 해당 클라이언트의 public ip와 포트 넘버를 전송한다. 이 과정에서, NAT은 테이블에 클라이언트의 private ip와 public ip를 매핑한다.
  3. A와 B는 시그널링을 통해 서로의 public ip와 포트 넘버를 공유한 뒤, 이를 통해 P2P 통신을 진행한다.

이렇게 NAT 위에서 중계 서버를 이용해 클라이언트 간의 P2P 통신을 가능하게 하는 기법을 마치 NAT에 통로를 뚫어준다고 하여 홀 펀칭(Hole Punching)이라고 한다.

주의할 점으로는 NAT이 매핑시킨 private ip와 public ip 간의 통신이 장기간 없으면 매핑 정보가 삭제되므로, 주기적으로 ping을 보내서 통신을 유지시켜야 한다.


TURN Server

STUN Server를 이용하여 private ip 주소를 교환해 P2P 통신을 Symmetric NAT 의 경우 애플리케이션이 달라지면 NAT의 매핑 테이블이 달라질 수 있다.
또한, 방화벽 등의 이유로 STUN Server를 통해 peer의 정보를 알아내지 못할 수도 있다. 이러한 경우에 TURN Server를 사용하여 통신한다.

TURN(Traversal Using Relays around NAT)은 peer 간 직접 통신이 실패할 경우 종단점들 사이에 데이터 릴레이를 수행하는 TURN 서버들을 사용한다. Signaling Server가 클라이언트 간의 ip 교환을 중개해주었다면, TURN Server는 데이터의 교환을 중계해준다.

TURN Server는 하나의 private ip를 갖고 다른 클라이언트들은 서버를 통해 미디어를 릴레이한다. 따라서, TURN Server는 P2P 통신은 아니지만 P2P 통신이 불가능한 클라이언트들을 대상으로도 미디어 릴레이가 가능하게 한다.


참조

https://developer.mozilla.org/ko/docs/Web/API/WebRTC_API

https://web.dev/articles/webrtc-infrastructure?hl=ko

https://medium.com/@hyun.sang/webrtc-webrtc%EB%9E%80-43df68cbe511

https://cjwoov.tistory.com/6

0개의 댓글