WebRTC : RTCDataChannel

RTCDataChannel์˜ ๊ฐœ์š”

RTCDataChannel์€ WebRTC (Web Real-Time Communication) API์˜ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋กœ, ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ๋˜๋Š” ํ”ผ์–ด ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋‹ด๋‹นํ•˜๋Š” ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ์ฑ„๋„์ด๋‹ค. RTCDataChannel์€ ๋น„๋””์˜ค, ์˜ค๋””์˜ค ์ŠคํŠธ๋ฆผ ์™ธ์— ํ…์ŠคํŠธ, ํŒŒ์ผ, ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์€ ๋‚ฎ์€ ์ง€์—ฐ์‹œ๊ฐ„๊ณผ ๋†’์€ ์‹ ๋ขฐ์„ฑ์„ ์š”๊ตฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•œ๋‹ค.

RTCDataChannel์˜ ์ดˆ๊ธฐํ™”์™€ ์„ค์ •

RTCDataChannel์€ RTCPeerConnection ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ๋‹ค. RTCPeerConnection์€ WebRTC์˜ ํ•ต์‹ฌ ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋กœ, ํ”ผ์–ด ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋ฏธ๋””์–ด ๋ฐ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์„ค์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. RTCDataChannel์„ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ, ์‚ฌ์šฉ์ž๋Š” ํŠน์ • ์˜ต์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ํŠน์„ฑ๊ณผ ์ฑ„๋„์˜ ๋™์ž‘์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.

  • ordered: ์ด ์˜ต์…˜์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋œ ์ˆœ์„œ๋Œ€๋กœ ๋„์ฐฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ด๋ฉฐ, false๋กœ ์„ค์ •ํ•˜๋ฉด ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์ง€๋งŒ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค.

  • maxPacketLifeTime: ์ด ์˜ต์…˜์€ ํŒจํ‚ท์˜ ์ตœ๋Œ€ ์ˆ˜๋ช…์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ •์˜ํ•œ๋‹ค. ํŒจํ‚ท์ด ์ด ์‹œ๊ฐ„ ๋‚ด์— ๋„์ฐฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฒ„๋ ค์ง„๋‹ค.

  • maxRetransmits: ์ด ์˜ต์…˜์€ ํŒจํ‚ท์˜ ์žฌ์ „์†ก ํšŸ์ˆ˜๋ฅผ ์ œํ•œํ•œ๋‹ค. ํŠน์ • ํšŸ์ˆ˜ ์ด์ƒ์œผ๋กœ ํŒจํ‚ท์„ ์žฌ์ „์†กํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • protocol: ์ด ํ•„๋“œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก ํ”„๋กœํ† ์ฝœ์„ ๋ช…์‹œํ•œ๋‹ค.

  • negotiated: ์ด ์˜ต์…˜์ด true๋กœ ์„ค์ •๋˜๋ฉด, RTCDataChannel์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false๋กœ ์ž๋™ ํ˜‘์ƒ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

  • id: negotiated ์˜ต์…˜์ด true์ผ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ์ฑ„๋„์˜ ๊ณ ์œ  ID๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

RTCDataChannel์˜ ์ „์†ก ๋ฐฉ์‹

RTCDataChannel์€ ๋ฐ์ดํ„ฐ ์ „์†ก์— ์žˆ์–ด UDP ๊ธฐ๋ฐ˜์˜ SRTP (Secure Real-time Transport Protocol) ๋˜๋Š” SCTP (Stream Control Transmission Protocol)์„ ์‚ฌ์šฉํ•œ๋‹ค. ํŠนํžˆ SCTP๋Š” RTCDataChannel์—์„œ์˜ ์ „์†ก์„ ์œ„ํ•ด ์ฑ„ํƒ๋œ ํ”„๋กœํ† ์ฝœ๋กœ, ๋‹ค์–‘ํ•œ ์ŠคํŠธ๋ฆผ์„ ์ง€์›ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ ์ „์†ก ์ค‘ ์ผ๋ถ€ ํŒจํ‚ท์ด ์†์‹ค๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์ŠคํŠธ๋ฆผ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค. SCTP๋Š” ๋˜ํ•œ ์‹ ๋ขฐ์„ฑ, ์ˆœ์„œ ๋ณด์žฅ, ์ „์†ก ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋“ฑ TCP์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์‹ค์‹œ๊ฐ„ ์ „์†ก ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค.

RTCDataChannel์„ ํ†ตํ•ด ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค:

  • ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ: ๋ฌธ์ž์—ด ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋กœ, ๋ณดํ†ต UTF-8๋กœ ์ธ์ฝ”๋”ฉ๋œ ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€์ด๋‹ค.

  • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ: ํŒŒ์ผ, ์ด๋ฏธ์ง€, ์˜ค๋””์˜ค ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋Š” ArrayBuffer๋‚˜ Blob ํ˜•ํƒœ๋กœ ์ „์†ก๋œ๋‹ค.

  • ์˜ค๋ธŒ์ ํŠธ ๋ฐ์ดํ„ฐ: JavaScript ๊ฐ์ฒด๋ฅผ JSON ํ˜•์‹์œผ๋กœ ์ง๋ ฌํ™”ํ•˜์—ฌ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

RTCDataChannel์˜ ์ด๋ฒคํŠธ์™€ ํ•ธ๋“ค๋Ÿฌ

RTCDataChannel์€ ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์ด๋ฒคํŠธ๋กœ๋Š” open, message, bufferedamountlow, close, error ๋“ฑ์ด ์žˆ๋‹ค.

  • open: ๋ฐ์ดํ„ฐ ์ฑ„๋„์ด ์„ฑ๊ณต์ ์œผ๋กœ ์—ด๋ฆฌ๋ฉด ๋ฐœ์ƒํ•œ๋‹ค. ์ด ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • message: ์ƒ๋Œ€ ํ”ผ์–ด๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. ์ˆ˜์‹ ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

  • bufferedamountlow: ์ „์†ก๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ํŠน์ • ์ž„๊ณ„๊ฐ’ ์ดํ•˜๋กœ ๋‚ด๋ ค๊ฐ”์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

  • close: ๋ฐ์ดํ„ฐ ์ฑ„๋„์ด ์ •์ƒ์ ์œผ๋กœ ๋‹ซํž ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. ์ฑ„๋„ ์ž์›์„ ์ •๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

  • error: ๋ฐ์ดํ„ฐ ์ „์†ก ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

RTCDataChannel์˜ ๋ณด์•ˆ

RTCDataChannel์—์„œ ์ „์†ก๋˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” DTLS (Datagram Transport Layer Security)๋กœ ์•”ํ˜ธํ™”๋œ๋‹ค. DTLS๋Š” ๋ฐ์ดํ„ฐ๊ทธ๋žจ ์ „์†ก์— ์ ํ•ฉํ•œ TLS์˜ ๋ณ€ํ˜•์œผ๋กœ, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ, ์ธ์ฆ, ๊ธฐ๋ฐ€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์•”ํ˜ธํ™” ๊ณผ์ •์€ ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ(man-in-the-middle attack) ๋“ฑ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ์œ„ํ˜‘์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•œ๋‹ค. ๋˜ํ•œ, WebRTC ์ž์ฒด๊ฐ€ ๋ณด์•ˆ์„ ๋งค์šฐ ์ค‘์š”ํ•˜๊ฒŒ ๋‹ค๋ฃจ๋Š” ๊ตฌ์กฐ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, RTCDataChannel์˜ ๋ณด์•ˆ์„ฑ๋„ ๋งค์šฐ ๋†’์€ ํŽธ์ด๋‹ค.

RTCDataChannel์˜ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๊ด€๋ฆฌ

RTCDataChannel์€ ์ƒํƒœ(state) ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฑ„๋„์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค. RTCDataChannel.readyState ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ฑ„๋„์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฃผ์š” ์ƒํƒœ๋กœ๋Š” ๋‹ค์Œ์ด ์žˆ๋‹ค:

  • connecting: ๋ฐ์ดํ„ฐ ์ฑ„๋„์ด ์„ค์ • ์ค‘์ธ ์ƒํƒœ๋กœ, ์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

  • open: ๋ฐ์ดํ„ฐ ์ฑ„๋„์ด ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์ •๋˜์–ด ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ด๋‹ค.

  • closing: ๋ฐ์ดํ„ฐ ์ฑ„๋„์ด ๋‹ซํžˆ๋Š” ์ค‘์œผ๋กœ, ์ด ์ƒํƒœ์—์„œ๋Š” ๋” ์ด์ƒ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๋ถˆ๊ฐ€๋Šฅํ•œ๋‹ค.

  • closed: ๋ฐ์ดํ„ฐ ์ฑ„๋„์ด ์™„์ „ํžˆ ๋‹ซํžŒ ์ƒํƒœ๋กœ, ๋ชจ๋“  ํ†ต์‹ ์ด ์ข…๋ฃŒ๋˜์—ˆ๋‹ค.

์ด ์™ธ์—๋„ bufferedAmount ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ๋Œ€๊ธฐ ์ค‘์ธ ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ํšจ์œจ์„ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ด€๋ จ ์ž๋ฃŒ:

  • WebRTC 1.0: Real-Time Communication Between Browsers, W3C Editor's Draft, https://www.w3.org/TR/webrtc/

  • Data channels, MDN Web Docs, https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel

Last updated