# WebRTC 기술의 심층적 이해

WebRTC(Web Real-Time Communication)는 웹 애플리케이션과 사이트가 플러그인 없이 직접 브라우저 간에 음성, 영상, 데이터 통신을 할 수 있게 해주는 기술이다. WebRTC는 실시간 통신을 웹 브라우저 내에서 가능하게 하며, 이를 위해 다양한 표준 기술과 프로토콜을 사용한다. WebRTC는 전통적인 클라이언트-서버 모델을 넘어선 직접적인 피어 투 피어(peer-to-peer) 통신을 제공함으로써, 지연 시간 감소와 효율적인 데이터 전송을 가능하게 한다.

#### WebRTC의 주요 구성 요소

WebRTC의 기술 스택은 크게 세 가지 주요 구성 요소로 나눌 수 있다: 미디어 캡처(Media Capture), 피어 투 피어 연결(Peer-to-Peer Connection), 그리고 데이터 채널(Data Channels).

**미디어 캡처**

WebRTC의 핵심 기능 중 하나는 사용자 기기의 카메라와 마이크에서 오디오 및 비디오 데이터를 캡처하는 것이다. 이 과정은 브라우저의 MediaStream API를 통해 이루어진다. MediaStream API는 웹 애플리케이션이 사용자의 동의를 얻은 후, 비디오 및 오디오 스트림에 접근할 수 있게 해준다. 이 스트림은 그 자체로 재생 가능하며, HTML5의 `<video>` 및 `<audio>` 요소와 함께 사용할 수 있다. 또한, 이 스트림은 WebRTC의 피어 투 피어 연결을 통해 다른 사용자에게 전송될 수도 있다.

**피어 투 피어 연결**

WebRTC의 또 다른 중요한 구성 요소는 RTCPeerConnection API이다. 이 API는 두 클라이언트 간의 직접적인 연결을 설정하고 유지하는 역할을 한다. RTCPeerConnection은 세션 관리, 네트워크 연결 설정, 그리고 미디어 스트림 전송을 담당한다.

피어 투 피어 연결을 설정하는 과정에는 시그널링(Signaling)이라는 과정이 필요하다. 시그널링은 두 피어가 서로 연결하기 위해 필요한 메타데이터를 교환하는 과정이다. 이 과정에서는 ICE (Interactive Connectivity Establishment) 프로토콜이 사용된다. ICE는 NAT(Network Address Translation)를 통한 네트워크 주소 변환 및 방화벽 문제를 해결하기 위해 설계되었으며, 연결 가능한 경로를 찾기 위해 여러 후보(candidates) 경로를 제시한다.

RTCPeerConnection은 SRTP(Secure Real-time Transport Protocol)를 사용하여 미디어 스트림을 암호화하고 전송한다. 이로 인해, WebRTC는 기본적으로 보안성이 높은 실시간 통신을 지원한다.

**데이터 채널**

WebRTC는 미디어 스트림뿐만 아니라 일반 데이터도 전송할 수 있다. 이를 위해 제공되는 것이 RTCDataChannel API이다. 이 API는 피어 간의 텍스트 메시지나 바이너리 데이터를 실시간으로 전송하는 데 사용된다. 데이터 채널은 TCP 또는 UDP 기반의 전송 프로토콜을 사용할 수 있으며, 빠르고 신뢰성 있는 데이터 전송을 가능하게 한다.

RTCDataChannel은 응용 프로그램에서 더 복잡한 커뮤니케이션 패턴을 지원할 수 있게 해준다. 예를 들어, 게임, 파일 전송, 또는 실시간 협업 애플리케이션에서 효과적으로 사용할 수 있다.

#### WebRTC의 하위 프로토콜과 표준

WebRTC는 다양한 표준 프로토콜과 기술을 기반으로 동작한다. 이 섹션에서는 WebRTC를 구성하는 주요 프로토콜과 표준에 대해 다룬다.

**SDP (Session Description Protocol)**

SDP는 WebRTC 시그널링 과정에서 미디어와 연결 설정 정보를 설명하는 데 사용된다. SDP는 오디오 및 비디오 코덱, 네트워크 정보, 그리고 미디어 스트림의 구성 요소를 기술한다. 각 피어는 자신의 연결과 미디어 스트림을 설명하는 SDP 메시지를 생성하여 상대 피어와 교환한다. 이 교환 과정에서 두 피어는 서로의 미디어 형식을 협상하고, 연결이 설정된다.

**STUN과 TURN**

STUN(Session Traversal Utilities for NAT)과 TURN(Traversal Using Relays around NAT)은 WebRTC에서 NAT를 통한 피어 간의 연결을 설정하는 데 사용되는 프로토콜이다. STUN 서버는 클라이언트가 공용 IP 주소를 결정하고, 이를 피어와 공유할 수 있게 도와준다. 그러나 NAT나 방화벽이 너무 엄격한 경우, STUN만으로는 연결이 불가능할 수 있다. 이때 TURN 서버는 중계 역할을 하여 두 피어 간의 데이터를 전달하는 데 사용된다.

**RTP와 RTCP**

RTP(Real-time Transport Protocol)와 RTCP(Real-time Transport Control Protocol)는 WebRTC에서 오디오 및 비디오 데이터를 전송하는 데 사용된다. RTP는 실제 미디어 데이터를 전송하는 데 사용되며, RTCP는 미디어 전송의 품질을 모니터링하고 제어하는 데 사용된다. 이 두 프로토콜은 함께 작동하여 안정적인 실시간 미디어 스트리밍을 가능하게 한다.

#### WebRTC의 보안 메커니즘

WebRTC는 보안을 최우선으로 설계되었으며, 다양한 보안 메커니즘을 통해 사용자의 데이터를 보호한다.

**미디어 스트림의 암호화**

WebRTC는 DTLS(Datagram Transport Layer Security)와 SRTP(Secure Real-time Transport Protocol)를 사용하여 모든 미디어 스트림을 암호화한다. 이는 전송 중에 데이터가 도청되거나 변조되는 것을 방지한다. DTLS는 데이터 채널의 암호화를 담당하며, SRTP는 오디오 및 비디오 스트림을 보호한다.

**인증과 신뢰성**

WebRTC는 피어 간의 통신에서 상호 인증을 위해 X.509 인증서를 사용한다. 이 인증서를 통해 각 피어는 서로의 신원을 확인할 수 있으며, 이는 신뢰할 수 있는 통신을 가능하게 한다. 또한, WebRTC는 브라우저의 보안 컨텍스트 내에서 실행되므로, 악의적인 웹사이트로부터의 공격을 예방할 수 있다.

#### WebRTC의 성능 최적화

WebRTC는 실시간 통신의 특성상, 지연 시간과 대역폭 관리가 중요한 요소이다. 이를 위해 WebRTC는 다양한 성능 최적화 기술을 활용한다.

**네트워크 적응성**

WebRTC는 네트워크 상태에 따라 동적으로 비트레이트를 조정하는 능력을 가지고 있다. 이를 통해 네트워크 혼잡이나 품질 저하가 발생할 경우, WebRTC는 자동으로 비트레이트를 낮추어 안정적인 연결을 유지한다. 이 과정은 RTCP 피드백 메커니즘을 통해 이루어지며, 클라이언트는 전송 상태에 대한 정보를 주기적으로 교환한다.

**지터 버퍼와 패킷 손실 복구**

WebRTC는 실시간 통신의 품질을 향상시키기 위해 지터 버퍼(jitter buffer)와 FEC(Forward Error Correction) 기술을 사용한다. 지터 버퍼는 네트워크 지연 변동을 보상하기 위해 데이터 패킷을 일시적으로 저장하고 재정렬하며, FEC는 패킷 손실 발생 시 데이터를 복구하는 데 사용된다. 이러한 기술들은 안정적인 실시간 통신을 보장한다.

***

관련 자료:

* [Google WebRTC Documentation](https://webrtc.org/)
* [MDN Web Docs - WebRTC API](https://developer.mozilla.org/ko/docs/Web/API/WebRTC_API)
* [IETF RFC 5245: Interactive Connectivity Establishment (ICE)](https://tools.ietf.org/html/rfc5245)
* [IETF RFC 5766: Traversal Using Relays around NAT (TURN)](https://tools.ietf.org/html/rfc5766)
* [W3C WebRTC 1.0: Real-Time Communication Between Browsers](https://www.w3.org/TR/webrtc/)
