EngleBee 프로젝트

[study] WebRTC를 이용한 실시간 데이터 교환

람대리 2024. 8. 25. 18:43
728x90

WebRTC

WebRTC는 시그널링을 통해 NAT 우회과정을 거쳐 데이터를 교환할 수 있습니다.

WebRTC는 서버와 같은 중간자를 거치지 않고 브라우저간을 P2P로 연결하는 기술입니다. 중간 서버를 거치지 않기 때문에 빠른 속도가 보장되며, HTTPS가 강제 되기 때문에 중간자 공격에 대한 보안이 보장됩니다. 

 

P2P 절차

각 피어간의 P2P 연결을 위해 먼저 각 피어간의 P2P 통신에 동의해야 합니다. 그리고 서로의 주소를 공유하고 각 피어간의 보안 사항 및 방화벽을 우회합니다. 이 과정을 거쳐 데이터 교환을 실시간으로 하게 됩니다. WebRTC는 통신 초기 설정에서 중재자가 서로의 주소를 공유하여 보안 사항들을 우회하는 과정이 필요합니다.

 

방화벽과 NAT 트래버셜

일반적인 컴퓨터에는 공인 IP가 할당되어 있지 않습니다. 그 원인으로는 방화벽, 여러대의 컴퓨터가 하나의 공인IP를 공유하는 NAT이 있기 때문입니다. 그래서 공인 IP뿐 아니라 사설 IP 주소까지 알아내야 특정한 사용자를 지정할 수 있습니다. 일반적으로 라우터가 NAT 역할을 합니다. 외부에서 접근하는 공인 IP와 포트 번호를 확인하여 현재 네트워크 내의 사설 IP로 맵핑해줍니다. 피어 두개가 서로 직접 통신하기 위해서는 라우터의 공인 IP 주소와 포트 번호를 먼저 알아내야 합니다.

하지만 어떤 라우터들은 특정 주소나 포트와의 연결을 차단하는 방화벽이 있기도 합니다. 라우터를 통과하여 연결할 방법을 찾는 과정을 NAT 트래버셜이라고 합니다.

 

STUN과 TURN
NAT 트래버셜 작업은 STUN 서버에 의해 이루어집니다. STUN 서버를 이용하여 자신의 공인 IP 주소와 포트를 확인할 수 있습니다. WebRTC를 시작하기 전에 STUN 서버에게 요청을 보내면 NAT 뒤에 있는 피어들이 서로 연결할 수 있는 공인 IP주소와 포트번호를 찾아줍니다.

하지만 어떤 라우터들은 방화벽 정책을 다르게 할 수 있고, 이전에 연결된 적이 있는 네트워크만 연결할 수 있게 제한을 걸기도 합니다. 이 때문에 STUN 서버를 통해 자기 자신의 주소를 받아내지 못할 때는 TURN 서버를 이용하게 됩니다.

TURN 방식은 중간에 서버를 한번 거치기 때문에 P2P 통신이 아니며 구조상 지연이 필연적으로 발생하게 됩니다. 

 

ICE와 Candidate

STUN과 TURN 서버를 이용해서 얻은 주소들을 Candidate이라고 부릅니다. candidate를 수집하면 자신의 사설 IP와 포트 넘버, 자신의 공인 IP와 포트넘버, TURN 서버의 IP주소와 포트넘버를 얻게 됩니다. 이 과정을 후보 찾기라고 부르며, ICE라는 프레임워크에서 이루어지게 됩니다. ICE는 두개의 피어가 P2P 연결이 가능하도록 최적의 경로를 찾아주는 프레임워크입니다. ICE 프레임워크가 STUN 또는 TURN 서버를 이용하여 상대방과 연결 가능한 후보들을 갖고 있게 됩니다. 두 피어간의 통신할 수 있는 주소를 알아내게 되면 이제 미디어와 관련된 정보를 교환해야 합니다.

 

SDP

WebRTC에서 피어간에 스트리밍 미디어의 해상도나 형식, 코덱 등의 멀티미디어 콘텐츠의 초기 인수를 설명하기 위해 SDP라는 프로토콜을 채택하였습니다. 이를 통해 비디오의 해상도나 오디오 전송 또는 수신여부를 확인 할 수 있습니다.

SDP는 제안 응답 모델(Offer/Answer)을 갖고 있습니다. 한 피어가 미디어 스트림을 교환할 것을 제안하면, 상대방으로부터 응답을 기다립니다. 응답을 받게 되면 각자의 피어가 수집한 ICE 후보 중에서 최적의 경로를 결정하고 협상하는 프로세스를 발생합니다. 최적의 ICE 후보가 선택되면 기본적으로 필요한 모든 메타 데이터, IP 주소와 포트, 미디어 정보가 피어 간 합의가 완료됩니다. 이 과정을 통해 피어간의 P2P 연결이 완전히 설정되고 활성화됩니다. 그 후 각 피어에 의해 로컬 데이터 스트림의 엔드포인트가 생성되며, 이 데이터는 양방향 통신 기술을 사용하여 최종적으로 양방향으로 전송됩니다.

 

시그널링

위 모든 과정을 시그널이라고 부릅니다. WebRTC 통신에 사용할 프로토콜, 채널, 미디어 코덱 및 형식, 데이터 전송 방법, 라우팅 정보와 NAT 통과 방법을 포함한 통신 규격을 교환하기 위해 두 장치의 제어 정보를 교환하는 과정입니다.

시그널링은 WebRTC 연결 전 미리 준비해야 하는 과정입니다. 두 피어가 언제 어떤 방식으로 연결될 수 있는지에 대한 모든 경우를 예측하기 어렵기 때문에 한가지로 정해진 방법은 없습니다. 이 때문에 두 피어를 연결할 수 있는 시그널링 서버를 직접 구축하거나, 시그널링 서버를 제공해주는 외부 솔루션을 이용할 수 있습니다.

 

참고 블로그

https://wormwlrm.github.io/2021/01/24/Introducing-WebRTC.html