WebRTC (Web Real-Time Communication)는 실시간 통신을 위한 API와 프로토콜을 포함하는 오픈 소스 프로젝트입니다. 이 기술은 웹 브라우저 및 모바일 애플리케이션 간의 실시간 음성, 비디오 및 일반 데이터 통신을 가능하게 합니다. WebRTC는 인터넷 익스플로러를 제외한 대부분의 모더나 웹 브라우저에서 지원됩니다.
WebRTC는 다음의 주요 기술 요소로 구성되어 있습니다:
MediaStream (getUserMedia): 사용자의 카메라 또는 마이크에 접근하여 비디오, 오디오 또는 양자 모두의 스트림을 캡처할 수 있습니다. 이 기능은 사용자의 동의를 필요로 합니다.
RTCPeerConnection: 두 클라이언트 간에 오디오 또는 비디오 통신을 가능하게 하는 방법을 설정합니다. 이것은 또한 NAT / 방화벽을 통과하는 데 사용되는 ICE 프레임워크를 포함합니다.
RTCDataChannel: 이것은 두 클라이언트 간에 데이터를 전송하는 데 사용됩니다. 이것은 실시간 게임이나 P2P 파일 공유와 같은 애플리케이션에 이상적입니다.
WebRTC는 다음의 주요 프로토콜을 사용합니다:
Interactive Connectivity Establishment (ICE): 두 피어 간에 최적의 경로를 찾아서 연결을 설정하는 프레임워크입니다. 이는 STUN(Server Traversal Using Relay NAT) 및 TURN(Traversal Using Relay around NAT) 프로토콜을 사용하여 NAT 또는 방화벽을 우회하는 데 도움이 됩니다.
Session Description Protocol (SDP): 미디어 형식, 프로토콜, 코덱, IP 주소 및 포트 등을 포함하여 미디어 세션을 설명하는 표준을 정의합니다.
Real-time Transport Protocol (RTP): 실시간 전송 프로토콜은 오디오 및 비디오 데이터 패킷을 전송하는 표준입니다.
WebRTC는 이러한 요소를 사용하여 실시간 통신을 가능하게 하며, 이를 사용하여 브라우저 간의 오디오, 비디오, 및 데이터 공유를 가능하게 합니다. 이를 통해 사용자는 플러그인 또는 별도의 소프트웨어를 설치하지 않고도 실시간 통신을 할 수 있습니다.
WebRTC에서 Peer-to-Peer (P2P) 연결을 설정하는 과정은 복잡한 단계를 거칩니다. 다음은 그 과정을 단계별로 설명합니다:
Signaling: 먼저, WebRTC는 P2P 연결을 시작하기 위해 "시그널링"이라는 과정을 거칩니다. 시그널링은 두 클라이언트 간에 연결을 설정하고, 협상하고, 좌표를 맞추는데 사용되는 메커니즘입니다. WebRTC는 이를 위한 특정 메커니즘을 정의하지 않으므로, 개발자는 WebSocket, XHR, SIP 등 자신만의 솔루션을 선택할 수 있습니다. 주로 이 과정에서 Session Description Protocol (SDP)를 이용하여 미디어 캡을 교환하며, 이를 이용하여 각 피어의 미디어 형식과 네트워크 정보를 알 수 있습니다.
Creating RTCPeerConnection: 각 피어는 이제 RTCPeerConnection 객체를 생성합니다. 이 객체는 두 피어 간의 연결을 관리하며, 미디어 스트림의 추가, ICE 캔디데이트 수신, SDP의 변경 등에 대한 콜백을 제공합니다.
Gathering ICE Candidates: RTCPeerConnection 객체는 ICE 프레임워크를 사용하여 가능한 모든 네트워크 경로(ICE candidates)를 수집합니다. 이들 후보는 STUN 서버를 통해 공개 IP를 찾거나, TURN 서버를 사용하여 릴레이를 설정합니다. 이러한 ICE 캔디데이트는 다시 시그널링 경로를 통해 다른 피어에게 전송됩니다.
Exchange of Offer and Answer: 피어 A(콜러)는 createOffer
메소드를 사용하여 SDP를 생성하고, 이를 setLocalDescription
메소드를 사용하여 자신의 로컬 설명으로 설정합니다. 이 offer는 시그널링 메커니즘을 통해 피어 B(캘리)에게 전송됩니다. 피어 B는 이 offer를 setRemoteDescription
메소드를 사용하여 원격 설명으로 설정하고, createAnswer
메소드를 사용하여 자신의 SDP를 생성합니다. 그 후 이 answer를 setLocalDescription
로 자신의 로컬 설명으로 설정하고, 시그널링 메커니즘을 통해 피어 A에게 다시 전송합니다. 피어 A는 마지막으로 이 answer를 setRemoteDescription
로 설정합니다.
Connection: 이제 두 피어는 각각의 ICE 캔디데이트를 사용하여 연결을 시도하며
, 성공적으로 연결되면 P2P 연결이 설정됩니다. 그 후, 미디어 스트림은 해당 RTCPeerConnection을 통해 전송됩니다.
이 과정이 모두 완료되면 WebRTC 연결이 성공적으로 수립되고, 두 피어는 실시간으로 오디오, 비디오, 및 데이터를 교환할 수 있습니다.