1. WebRTC์™€ LiveKit์˜ ๊ด€๊ณ„

  • WebRTC๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์•ฑ์—์„œ ์‹ค์‹œ๊ฐ„ ์˜ค๋””์˜ค ๋น„๋””์˜ค ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ์œ„ํ•œ ํ‘œ์ค€ ๊ธฐ์ˆ ์ด๋‹ค. WebRTC ๊ณต์‹ ์‚ฌ์ดํŠธ: webrtc.org
  • LiveKit์€ WebRTC๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ€ํ‹ฐ ์œ ์ € ์‹ค์‹œ๊ฐ„ ์•ฑ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ”Œ๋žซํผ์ด๋‹ค. LiveKit ์„œ๋ฒ„๋Š” WebRTC ๊ธฐ๋ฐ˜ SFU๋กœ ๋™์ž‘ํ•œ๋‹ค.

์ฆ‰, LiveKit์€ WebRTC๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ๋ณด๋‹ค WebRTC ์œ„์— ๋ฃธ ๋ชจ๋ธ, ๊ถŒํ•œ, ๊ตฌ๋… ์ œ์–ด, ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ ˆ์ด์–ด์— ๊ฐ€๊น๋‹ค.

2. ์™œ SFU๊ฐ€ ํ•„์š”ํ•œ๊ฐ€

2.1 ์ˆœ์ˆ˜ WebRTC P2P ๋ฉ”์‹œ์˜ ํ•œ๊ณ„

N๋ช…์ด ๋ชจ๋‘ P2P๋กœ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ ํด๋ผ์ด์–ธํŠธ๋Š” N-1๊ฐœ์˜ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•ด์•ผ ํ•ด์„œ ์—…๋กœ๋“œ ๋Œ€์—ญํญ๊ณผ CPU ๋ถ€๋‹ด์ด ์ปค์ง„๋‹ค.

A โ†โ†’ B
A โ†โ†’ C
A โ†โ†’ D
B โ†โ†’ C
...

2.2 LiveKit์˜ ๋ฐฉ์‹

  • ๊ฐ ํด๋ผ์ด์–ธํŠธ๋Š” SFU๋กœ ํ•œ ๋ฒˆ๋งŒ ์—…๋กœ๋“œ
  • SFU๊ฐ€ ๋‹ค๋ฅธ ์ฐธ๊ฐ€์ž์—๊ฒŒ ํŠธ๋ž™์„ ์„ ํƒ์ ์œผ๋กœ ์ „๋‹ฌ
  • ๋„คํŠธ์›Œํฌ ์ƒํƒœ์— ๋”ฐ๋ผ ํ’ˆ์งˆ ๋ ˆ์ด์–ด๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋„๋ก Simulcast ๋“ฑ์„ ์ง€์›ํ•œ๋‹ค
      A
      โ†“โ†‘
      SFU
  โ†“โ†‘   โ†“โ†‘   โ†“โ†‘
 B     C     D

3. WebRTC ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

3.1 RTCPeerConnection

  • RTCPeerConnection์€ ๋กœ์ปฌ ํ”ผ์–ด์—์„œ ์›๊ฒฉ ํ”ผ์–ด์™€์˜ WebRTC ์—ฐ๊ฒฐ์„ ํ‘œํ˜„ํ•˜๋Š” ํ•ต์‹ฌ API๋‹ค.

์ค‘์š”ํ•œ ๊ฐœ๋…:

  • ์—ฐ๊ฒฐ์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ A์™€ B ์‚ฌ์ด์— ์„ฑ๋ฆฝํ•˜์ง€๋งŒ, ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ ํ”ผ์–ด์— ํ•˜๋‚˜์”ฉ ์กด์žฌํ•œ๋‹ค
  • RTCPeerConnection A, RTCPeerConnection B๊ฐ€ ๊ฐ๊ฐ ์žˆ์œผ๋ฉฐ signaling์œผ๋กœ SDP์™€ ICE ํ›„๋ณด๋ฅผ ๊ตํ™˜ํ•ด ์—ฐ๊ฒฐ์„ ์„ฑ๋ฆฝ์‹œํ‚จ๋‹ค

3.2 MediaStream๊ณผ MediaStreamTrack

  • ์นด๋ฉ”๋ผ ๋งˆ์ดํฌ ์ž…๋ ฅ์€ ๋ณดํ†ต getUserMedia๋กœ ์–ป๊ณ , ๊ฒฐ๊ณผ๋Š” MediaStream์ด๋‹ค
  • ์‹ค์ œ๋กœ ์ „์†ก์— ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์œ„๋Š” MediaStreamTrack์ด๋ฉฐ, ํŠธ๋ž™์„ addTrack๋กœ RTCPeerConnection์— ๋ถ™์—ฌ ์ „์†กํ•œ๋‹ค

3.3 RTCDataChannel

  • RTCDataChannel์€ ์ž„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•œ ์ฑ„๋„์ด๋‹ค
  • ๋ฐ์ดํ„ฐ ์ฑ„๋„ ์ถ”๊ฐ€ ํ๋ฆ„: MDN Using WebRTC data channels
  • webrtc.org: Data channels

4. ๊ตฌ์กฐ์™€ ์—ฐ๊ฒฐ ํ๋ฆ„์„ ํ•œ ์žฅ์œผ๋กœ

์•„๋ž˜ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋‹ค์Œ์„ ํ•œ ๋ฒˆ์— ํ‘œํ˜„ํ•œ๋‹ค.

  • ๊ฐ ํ”ผ์–ด ๋‚ด๋ถ€์— RTCPeerConnection๊ณผ ๋ฏธ๋””์–ด ํŠธ๋ž™, ๋ฐ์ดํ„ฐ ์ฑ„๋„์ด ์—ฐ๊ฒฐ๋˜๋Š” ๊ตฌ์กฐ
  • RTCPeerConnection A์™€ B ์‚ฌ์ด์—์„œ signaling, ICE, DTLS, ๋ฏธ๋””์–ด, ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๊ฐ€๋Š” ํ๋ฆ„
  • ์˜ˆ์‹œ๋กœ A๊ฐ€ B๋กœ audio video๋ฅผ ๋ณด๋‚ด๊ณ  B๊ฐ€ A๋กœ file์„ ๋ณด๋‚ธ๋‹ค๊ณ  ๊ฐ€์ •
flowchart LR
   Signaling server for SDP and ICE exchange
  SIG[Signaling server SDP and ICE exchange]

   Between PeerConnections
  PCA <-->|ICE connectivity checks| PCB
  PCA <-->|DTLS handshake| PCB

   Peer B mirrored, App at far right
  subgraph PeerB[Peer B]
    direction LR
    PCB[RTCPeerConnection B]
    AT_B[MediaStreamTrack audio]
    VT_B[MediaStreamTrack video]
    MSB[MediaStream]
    DCB[RTCDataChannel]
    AppB[App]

    PCB -->|ontrack| AT_B
    PCB -->|ontrack| VT_B
    AT_B --> MSB
    VT_B --> MSB
    MSB --> AppB

    PCB -->|ondatachannel| DCB
    DCB <-->|file send and onmessage| AppB
  end

๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ

  • ontrack์€ ์›๊ฒฉ์—์„œ ๋“ค์–ด์˜จ ํŠธ๋ž™์ด RTCPeerConnection์— ์ถ”๊ฐ€๋œ ๋’ค ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋‹ค
  • ondatachannel์€ ์›๊ฒฉ ํ”ผ์–ด๊ฐ€ createDataChannel๋กœ ๋งŒ๋“  ์ฑ„๋„์ด ์—ฐ๊ฒฐ์— ์ถ”๊ฐ€๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋‹ค

5. ์—ฐ๊ฒฐ์ด ์„ฑ๋ฆฝ๋˜๋Š” ์ˆœ์„œ

์ด ์„น์…˜์€ ์œ„ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์‹œ๊ฐ„ ํ๋ฆ„์œผ๋กœ ์š”์•ฝํ•œ๋‹ค.

  1. SDP ํ˜‘์ƒ
  • offer๋ฅผ ๋งŒ๋“ค๊ณ  local description์— ์„ค์ •ํ•œ ๋’ค signaling์œผ๋กœ ์ „๋‹ฌ
  • ์ƒ๋Œ€๋Š” remote description์œผ๋กœ ์ ์šฉํ•˜๊ณ  answer๋ฅผ ๋งŒ๋“ค์–ด ๋‹ค์‹œ ์ „๋‹ฌ
  • webrtc.org: Getting started with peer connections
  1. ICE ํ›„๋ณด ๊ตํ™˜
  • ICE ํ›„๋ณด๋Š” icecandidate ์ด๋ฒคํŠธ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ signaling์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค
  • ์ƒ๋Œ€๋Š” ํ›„๋ณด๋ฅผ ๋ฐ›์•„ addIceCandidate๋กœ ์ ์šฉํ•œ๋‹ค
  • webrtc.org: Getting started with peer connections
  1. ICE connectivity checks์™€ DTLS
  • ICE๊ฐ€ ํ›„๋ณด ์Œ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ์ตœ์  ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•œ๋‹ค. ICE๋Š” STUN๊ณผ TURN์„ ์‚ฌ์šฉํ•œ๋‹ค
  • ์ดํ›„ DTLS ํ•ธ๋“œ์…ฐ์ดํฌ๋กœ ๋ณด์•ˆ ์—ฐ๊ฒฐ์„ ์„ฑ๋ฆฝํ•œ๋‹ค. DataChannel์€ DTLS๋กœ ๋ณดํ˜ธ๋œ๋‹ค

6. ์˜ˆ์‹œ 3๊ฐœ ํ๋ฆ„

6.1 A์—์„œ B๋กœ audio ์ „๋‹ฌ

  • A๋Š” ๋งˆ์ดํฌ ํŠธ๋ž™์„ addTrack์œผ๋กœ RTCPeerConnection A์— ์ถ”๊ฐ€ํ•œ๋‹ค
  • ์—ฐ๊ฒฐ์ด ์„ฑ๋ฆฝ๋˜๋ฉด B์˜ RTCPeerConnection B์—์„œ ontrack์œผ๋กœ audio ํŠธ๋ž™์„ ๋ฐ›๋Š”๋‹ค
  • MDN: track event

6.2 A์—์„œ B๋กœ video ์ „๋‹ฌ

  • A๋Š” ์นด๋ฉ”๋ผ ํŠธ๋ž™์„ addTrack์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค
  • B๋Š” ๋™์ผํ•˜๊ฒŒ ontrack์œผ๋กœ video ํŠธ๋ž™์„ ์ˆ˜์‹ ํ•œ๋‹ค
  • MDN: track event

6.3 B์—์„œ A๋กœ file ์ „๋‹ฌ

  • ํŒŒ์ผ ์ „์†ก์€ RTCDataChannel์„ ์‚ฌ์šฉํ•œ๋‹ค. ํŒŒ์ผ์„ chunk๋กœ ๋‚˜๋ˆ  send๋กœ ์ „์†กํ•˜๊ณ  ์ƒ๋Œ€๋Š” message๋กœ ์ˆ˜์‹ ํ•œ๋‹ค
  • ์ˆ˜์‹  ์ธก ๋ฐ์ดํ„ฐ ์ฑ„๋„์€ RTCPeerConnection์˜ ondatachannel ์ด๋ฒคํŠธ๋กœ ์ „๋‹ฌ๋œ๋‹ค
  • MDN: Using WebRTC data channels
  • webrtc.org: Data channels

7. ICE STUN TURN ๊ฐœ๋…๊ณผ ์˜ˆ์‹œ

7.1 ๊ฐœ๋… ์š”์•ฝ

  • ICE๋Š” NAT ํ™˜๊ฒฝ์—์„œ ํ†ต์‹  ๊ฒฝ๋กœ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ํ›„๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๊ฒ€์‚ฌํ•ด ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•˜๋Š” ์ ˆ์ฐจ๋‹ค. ICE๋Š” STUN๊ณผ TURN์„ ์‚ฌ์šฉํ•œ๋‹ค
  • STUN์€ NAT ๋’ค์˜ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์™ธ๋ถ€์—์„œ ๊ด€์ธก๋˜๋Š” ์ฃผ์†Œ ์ •๋ณด๋ฅผ ์–ป๊ฑฐ๋‚˜ ์—ฐ๊ฒฐ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๋•๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค
  • TURN์€ ์ง์ ‘ ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ ๋ฆด๋ ˆ์ด ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ํŒจํ‚ท์„ ์ „๋‹ฌํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค

7.2 ์˜ˆ์‹œ๋กœ ์ดํ•ดํ•˜๊ธฐ

  • ๊ฐ™์€ LAN ํ™˜๊ฒฝ
    • host ํ›„๋ณด๋งŒ์œผ๋กœ๋„ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค
  • ์„œ๋กœ ๋‹ค๋ฅธ ์ง‘ ํ™˜๊ฒฝ
    • STUN์„ ์ด์šฉํ•ด ์™ธ๋ถ€์—์„œ ๋ณด์ด๋Š” ์ฃผ์†Œ ํ›„๋ณด๋ฅผ ์–ป๊ณ  ์ง์ ‘ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์—„๊ฒฉํ•œ ๋ฐฉํ™”๋ฒฝ ๋˜๋Š” ๋Œ€์นญ NAT ํ™˜๊ฒฝ
    • ์ง์ ‘ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•˜๋ฉด TURN ๋ฆด๋ ˆ์ด ํ›„๋ณด๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•œ๋‹ค

8. LiveKit ํ•ต์‹ฌ ๊ฐœ๋…

LiveKit ๊ธฐ๋ณธ ๋ชจ๋ธ์€ Room Participant Track์ด๋‹ค.

Token์ด ํ•„์š”ํ•œ ์ด์œ 

LiveKit SDK๊ฐ€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด access token์ด ํ•„์š”ํ•˜๋ฉฐ, ํ† ํฐ์—๋Š” ์ฐธ๊ฐ€์ž identity, room ์ด๋ฆ„, publish subscribe ๊ถŒํ•œ ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค. ํ† ํฐ์€ JWT ๊ธฐ๋ฐ˜์ด๋ฉฐ API secret์œผ๋กœ ์„œ๋ช…๋œ๋‹ค.


์ฐธ๊ณ  ๋ฌธ์„œ

WebRTC

MDN Web APIs

ICE STUN TURN RFC

LiveKit