최신 업데이트:2025-08-14 16:08:28
WebRTC 시그널링은 통신 조정을 위해 메타데이터를 교환하는 과정입니다. 여기에 핵심이 되는 것은 Session Description Protocol(SDP)로, 피어 간 코덱, 네트워크 경로, 미디어 유형 등 세션 파라미터를 협상할 수 있게 해줍니다. 당사 서비스는 업계 표준 WHIP(WebRTC-HTTP Ingestion Protocol) 및 WHEP(WebRTC-HTTP Egress Protocol)와 맞춤형 HTTP/JSON 기반 프로토콜, 두 가지 시그널링 방식을 지원합니다. 본 가이드에서는 맞춤형 HTTP/JSON 프로토콜의 상세 내용을 설명합니다.
시그널링 프로세스는 표준 WebRTC Offer/Answer 모델에 기반합니다. 클라이언트가 offer SDP를 전송하여 세션을 시작하고, 서버는 answer SDP를 반환함으로써 협상을 최종 완료합니다.
스트림의 발행(푸시)과 재생(풀)을 구분하기 위해, 당사 서비스는 클라이언트의 offer SDP 내 속성들을 검사합니다.
offer SDP에는 a=sendonly 속성이 포함되어야 합니다. 이는 클라이언트가 미디어를 송신만 하고 수신하지 않겠다는 의미입니다. 서버는 a=recvonly가 포함된 answer SDP로 응답합니다.offer SDP에는 a=recvonly 속성이 포함되어야 합니다. 이는 클라이언트가 미디어를 수신만 하고 송신하지 않겠다는 의미입니다. 서버는 a=sendonly가 포함된 answer SDP로 응답합니다.중요 안내:
a=sendrecv 속성(양방향 스트림)은 지원되지 않습니다. 반드시 클라이언트가 푸시 전용 또는 풀 전용으로 설정되어 있는지 확인해 주세요.
모든 시그널링 통신은 하나의 HTTP 엔드포인트를 통해 이뤄지며, URL로 대상 스트림을 지정합니다.
http://domain/appName/streamName.sdp?params=xxx
| 매개변수 | 설명 |
|---|---|
domain |
Low Latency Streaming에서 구성한 domain입니다(예: stream.cdnetworks.com). |
appName |
어플리케이션 또는 live stream forwarding의 application name(예: live). |
streamName |
스트림의 고유 이름(예: channel_001). |
params |
(옵션) 추가 쿼리 파라미터(예: userid=123). |
이 형식은 RTMP(rtmp://...) 및 HTTP-FLV(... .flv) URL과 의도적으로 유사하지만, 주요 차이점은 .sdp 접미사가 붙는다는 점입니다.
application/json| 매개변수 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
version |
String | 예 | API 버전입니다. 반드시 고정 값인 "v1.0"이어야 합니다. |
sessionId |
String | 아니오 | 클라이언트에서 생성한 고유 ID로서, 세션 식별에 사용됩니다. 선택 항목이지만, 로그 기록 및 디버깅 목적상 사용을 적극 권장합니다. |
localSdp |
Object | 예 | 클라이언트의 SDP 정보를 담고 있는 객체입니다. |
| 매개변수 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
code |
Integer | 예 | 응답의 상태 코드입니다. Status Codes를 참조하세요. |
message |
String | 예 | 응답 상태를 설명하는 메시지입니다. |
remoteSdp |
Object | 예 | 서버의 answer SDP가 포함된 객체입니다. |
localSdp(요청 내)와 remoteSdp(응답 내) 오브젝트는 동일한 구조를 공유합니다.
| 매개변수 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
type |
String | Yes | SDP 유형입니다. 클라이언트의 요청에서는 "offer"를 사용해야 하며, 서버의 응답에서는 "answer"를 사용합니다. |
sdp |
String | Yes | 전체 표준 준수 SDP 콘텐츠이며 문자열입니다(RFC 4566 참고). |
| Code | Message | Description |
|---|---|---|
200 |
success |
요청이 성공적으로 완료되었습니다. |
400 |
body error |
요청 body가 올바른 JSON 형식이 아닙니다. |
401 |
parameter error |
하나 이상의 필수 input parameters가 누락되었거나 유효하지 않습니다. |
402 |
information error |
input parameters에 제공된 정보가 올바르지 않습니다. |
403 |
authentication failure |
인증에 실패하였습니다. |
404 |
stream not found |
요청한 스트림이 존재하지 않습니다. |
600 |
RTC 지원 안 됨 |
서버가 이 스트림에 대해 RTC를 지원하지 않으므로, 클라이언트는 다른 프로토콜로 다운그레이드해야 합니다. |
{
"sessionId": "123456789",
"version": "v1.0",
"localSdp": {
"type": "offer",
"sdp": "v=0\r\no=- 12345 67890 IN IP4 192.0.2.1\r\ns=-\r\nt=0 0\r\na=sendonly\r\nm=video 9 UDP/TLS/RTP/SAVPF 100\r\n..."
}
}
{
"code": 200,
"message": "success",
"remoteSdp": {
"type": "answer",
"sdp": "v=0\r\no=- 98765 43210 IN IP4 198.51.100.1\r\ns=...\r\nt=0 0\r\na=recvonly\r\nm=video 9 UDP/TLS/RTP/SAVPF 100\r\n..."
}
}