나만 모른닭 프로젝트에서 음성/영상 채팅을 구현할 때 WebRTC를 사용해서 구현했다.
물론 내가 주도적으로 작업하지 않았기 때문에 WebRTC에 대한 이해도는 0에 수렴하지만... 코드리뷰를 봐도 너무 어렵지만...! 적어도 어느정도 더 알고자 조금 더 찾아보고 정리해보았다.
직접 구현하지 않았어도 이번에 기본 개념을 정리해두면 언젠가 나중에 직접 구현할때 도움이 되겠지?
WebRTC(Web Real-Time Communication)은 웹 애플리케이션과 사이트가 중간자 없이 브라우저 간에 오디오나 영상 미디어를 포착하고 마음대로 스트림할 뿐 아니라, 임의의 데이터도 교환할 수 있도록 하는 기술입니다. WebRTC를 구성하는 일련의 표준들은 플러그인이나 제 3자 소프트웨어 설치 없이 종단 간 데이터 공유와 화상 회의를 가능하게 합니다.
출처: MDN - WebRTC API
WebRTC는 외부 플로그인 없이 p2p (peer-to-peer) 커넥션을 이용해서 오디오와 영상 데이터를 주고받는 기술이다. 영상 통화, 스크린쉐어, 실시간 스트리밍을 구현할 때 사용한다고 한다.
브라우저간의 연결이기 때문에 서버를 거치지 않아 속도가 더 빠르고, HTTPS가 강제적으로 적용되기 때문에 보안성도 좋다고 볼 수 있다!
WebRTC는 구글이 주도적으로 개발한 오픈소스기 때문에 chrome 브라우저에 최적화 되어있다. IE는 지원하지 않고, safari의 경우도 다른 브라우저에 비해 호환성이 떨어진다. WebRTC를 사용하는 경우, 호환성과 상호 운용성을 항상 확인해야 한다고 한다.
p2p 통신을 하기 위해선 상대방의 IP 주소를 꼭 알아야 한다고 한다.
하지만 방화벽 때문에 상대방의 IP 주소를 확인할 수 없는 경우가 많은데, 이때 방화벽을 우회해서 연결이 가능하도록 Stun/Turn 서버를 따로 구축해야 한다.
기본적으로 서버 없이 브라우저간의 통신이 WebRTC지만, 방화벽이나 NAT 문제로 통신 설정 초기 단계에선 중간 서버의 존재가 꼭 필요하다고 한다.
NAT는 Network Address Translation
의 약자로, private IP를 public IP로 변환하는 장치를 의미한다.
인터넷에 연결되는 모든 기기는 고유한 IP주소를 가져야한다. 하지만 인터넷에 접속하는 기기의 수가 너무 많아지면서, 사실상 기기당 IP주소를 부여하는 것이 불가능해졌는데, 이러한 문제를 해결하는게 NAT다.
예를 들어, 집 안에 공유기를 설치하면 Wi-fi를 사용하는 모든 기기는 하나의 공유기에 연결한다. 하나의 랜선에 연결된 공유기에 여러개의 기기가 접속하면서 하나의 IP를 여러개의 기기가 공유하게 된다.
사설 네트워크(집) 주소를 사용하는 망에서 외부 공인망과 연결되는 IP 주소를 받고, NAT가 사설 네트워크 주소를 변환해서 public 네트워크에 접속할 수 있는 것이다.
아무튼 NAT 덕분에 WebRTC는 처음부터 p2p 연결을 진행할 수 없는 것이고, 이러한 문제를 해결하기 위해 Stun/Turn 서버를 사용하는 것이다.
NAT 역할을 하는 라우터를 통과해서 p2p 연결을 하기 위한 작업은 Stun 서버를 통해 이뤄지는데, STUN 방식은 단말이 자신의 공인 IP 주소와 포트를 확인하는 과정에 대한 프로토콜이다. STUN 서버는 인터넷의 복잡한 주소들 속에서 유일하게 자기 자신을 식별할 수 있는 정보를 반환하기 때문에 WebRTC 연결을 시작하기 전에 STUN 서버를 향해 요청을 보내면, STUN 서버는 NAT 뒤에 있는 피어(Peer)들이 서로 연결할 수 있도록 공인 IP와 포트를 찾아준다.
만약 두 개의 장치가 성공적으로 STUN 서버에서 자기 자신의 주소를 알아냈을 경우에는 P2P 연결을 시도할 두 개의 고유한 주소가 생긴 셈.
하지만 Stun 서버가 항상 정보를 알아낼 수 있는건 아니기 때문에 Stun 서버를 이용한 방식이 실패하면 TURN 서버를 사용하게 된다.
TURN 방식은 중간에 서버를 한 번 거치기 때문에, 엄밀히 이야기하자면 P2P 통신이 아니게 되며 그 구조상 지연이 필연적으로 발생한다. 보안 정책이 엄격한 개인 NAT 내부에 위치한 브라우저와 P2P 통신을 할 수 있는 유일한 방법이기 때문에, TURN 방식은 최후의 수단으로 사용된다.
STUN, TURN 서버를 이용해서 획득했던 IP 주소와 프로토콜, 포트의 조합으로 구성된 연결 가능한 네트워크 주소들을 후보(Candidate) 라고한다.
이렇게 후보들을 수집하면 일반적으로 3개의 주소를 얻게된다.
이 모든 과정은 ICE(Interactive Connectivity Establishment) 라는 프레임워크 위에서 이루어진다. 즉 ICE는 두 개의 단말이 P2P 연결을 가능하게 하도록 최적의 경로를 찾아주는 것이다.
ICE는 절대 혼자 작동하지 않고, STUN / TURN 서버 위에서 동작한다.
위에서 설명한 과정, p2p Connection에 사용할 프로토콜, 채널, 데이터 전송 방법, 라우팅 정보와 NAT 통과 방법을 포함한 통신 규격을 교환하기 위해 두 장치의 제어 정보를 교환하는 과정을 "Signaling"
이라고 한다.
WebRTC 연결을 하기 위해서 준비하는 과정인 것이고, 딱히 표준이 정해져있지 않이 때문에 개발자들이 알아서 서버를 구축해야한다.
출처: