๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

[์‹ค์ „-์ค€๋น„] WebRTC(Web Real-Time Communication) API ๋ณธ๋ฌธ

full stack/ํ”„๋กœ์ ํŠธ

[์‹ค์ „-์ค€๋น„] WebRTC(Web Real-Time Communication) API

Shinjio 2023. 8. 16. 11:43

 

 

์ •์˜

  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์‚ฌ์ดํŠธ๊ฐ€ ์ค‘๊ฐ„์ž ์—†์ด ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์— ์˜ค๋””์˜ค๋‚˜ ์˜์ƒ ๋ฏธ๋””์–ด๋ฅผ ์ŠคํŠธ๋ฆผํ•˜๊ณ , ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ  
  • ์„œ๋ฒ„๋ฅผ ์ตœ๋Œ€ํ•œ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  P2P(Peer-to-Peer Network)๋กœ ๋ธŒ๋ผ์šฐ์ €๋‚˜ ๋‹จ๋ง๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ธฐ์ˆ ์˜ ์›น ํ‘œ์ค€\
  • Zoom, ๊ตฌ๊ธ€ Meet, ํŽ˜์ด์Šค๋ถ ๋ฉ”์‹ ์ € ๋“ฑ์—์„œ ์‚ฌ์šฉ

 

 

ํŠน์ง• 

  • ์›น์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ P2P ๊ธฐ์ˆ ๋กœ ๊ฐ๊ฐ์˜ ๊ธฐ๊ธฐ๊ฐ€ ์„œ๋ฒ„์˜ ๋„์›€ ์—†์ด ์—ฐ๊ฒฐ๋˜๊ธฐ ์œ„ํ•ด ์—ฐ๊ฒฐ์„ ๋„์™€์ฃผ๋Š” ์„œ๋ฒ„(Signaling)๊ณผ P2P ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์„ ๋Œ€๋น„ํ•œ ๋ฆด๋ ˆ์ด ์„œ๋ฒ„(TURN)๊ฐ€ ํ•„์š”ํ•จ
  • UDP(User Datagram Protocol) ๊ธฐ๋ฐ˜์˜ ์ŠคํŠธ๋ฆฌ๋ฐ ๊ธฐ์ˆ 
  • WebRTC๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ผ๋ จ์˜ ํ‘œ์ค€๋“ค์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ ์ œ 3์ž ์†Œํ”„ํŠธ์›จ์–ด ์„ค์น˜ ์—†์ด ์ข…๋‹จ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ ์™€ ํ™”์ƒ ํšŒ์˜๊ฐ€ ๊ฐ€๋Šฅ
  • WebRTC๋Š” ์ƒํ˜ธ ์—ฐ๊ด€๋œ API์™€ ํ”„๋กœํ† ์ฝœ๋กœ ๊ตฌ์„ฑ๋˜์–ด ํ•จ๊ป˜ ์ž‘๋™
  • ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋‹ค๋ฅธ ์ฝ”๋ฑ ๋ฐ ๊ธฐํƒ€ ๋ฏธ๋””์–ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์› ์ˆ˜์ค€์ด ๋‹ค๋ฅด๋ฏ€๋กœ Google์—์„œ ์ œ๊ณตํ•˜๋Š” Adaptor.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœ → ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง• ์ด์Šˆ ํ•ด๊ฒฐ์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉ!
  • ๊ตฌ๊ธ€์ด ์˜คํ”ˆ์†Œ์Šค๋กœ ์ฒ˜์Œ ๋งŒ๋“ค์—ˆ๊ณ , W3C์—์„œ ์ดˆ์•ˆ์„ ์ œ์‹œํ•œ ๊ธฐ์ˆ  ์ŠคํŽ™์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ์—†์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ API

 

 

์‚ฌ์šฉ๋ฒ• 

๋‘ ํ”ผ์–ด ๊ฐ„์˜ ์ปค๋„ฅ์…˜์€ RTCPeerConnection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง 

์ปค๋„ฅ์…˜์ด ์ด๋ฃจ์–ด์ง€๊ณ  ์—ด๋ฆฌ๋ฉด, ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ(MediaStream)๊ณผ ๋ฐ์ดํ„ฐ ์ฑ„๋„(DataChannel)์ด ์ปค๋„ฅ์…˜์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ

๋˜ํ•œ ์ž„์˜์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ(์ด๋ฏธ์ง€, ํ…์ŠคํŠธ, ํŒŒ์ผ ๋“ฑ)์€ RTCDataChannel ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํ”ผ์–ด๋“ค ๊ฐ„์— ๊ตํ™˜ ๊ฐ€๋Šฅ

 

RTCPeerConnection

๋กœ์ปฌ ์ปดํ“จํ„ฐ์™€ ์›๊ฒฉ ํ”ผ์–ด ๊ฐ„์˜ WebRTC ์—ฐ๊ฒฐ


RTCDataChannel

์—ฐ๊ฒฐ๋œ ๋‘ ํ”ผ์–ด๊ฐ„์˜ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ์ฑ„๋„

 

RTCDataChannelEvent

RTCDataChannel์„ RTCPeerConnection์— ์—ฐ๊ฒฐํ•˜๋Š” ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ

์ด ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•จ๊ป˜ ์ „์†ก๋˜๋Š” ์œ ์ผํ•œ ์ด๋ฒคํŠธ๋Š” datachannel

 

RTCSctpTransport

์ŠคํŠธ๋ฆผ ์ œ์–ด ์ „์†ก ํ”„๋กœํ† ์ฝœ(Stream Control Transmission Protocol)

 

 

P2P ์ ˆ์ฐจ

1. ๊ฐ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ P2P ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์— ๋™์˜

2. ์„œ๋กœ์˜ ์ฃผ์†Œ๋ฅผ ๊ณต์œ 

3. ๋ณด์•ˆ ์‚ฌํ•ญ ๋ฐ ๋ฐฉํ™”๋ฒฝ ์šฐํšŒ

4. ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ๋ฐ์ดํ„ฐ ์‹ค์‹œ๊ฐ„ ๊ตํ™˜

 

 

 

๊ด€๋ จ ๊ฐœ๋… 

์‹œ๊ทธ๋„๋ง(Signaling)

์ƒ๋Œ€๋ฐฉ๊ณผ์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด์„œ๋Š” ์ƒ๋Œ€๋ฐฉ์˜ ๋„คํŠธ์›Œํฌ ์ •๋ณด์™€ ์ƒ๋Œ€๋ฐฉ์ด ๋ณด๋‚ด๋Š” ๋ฏธ๋””์–ด ๋ฐ์ดํ„ฐ ์ •๋ณด ๋“ฑ์ด ํ•„์š”ํ•จ

์„ธ์…˜ ์ œ์–ด ์ •๋ณด : ํ†ต์‹ ์˜ ์ดˆ๊ธฐํ™”, ์ข…๋ฃŒ, ์—๋Ÿฌ
๋„คํŠธ์›Œํฌ ์ •๋ณด : IP, PORT
๋ฏธ๋””์–ด ์ •๋ณด : SDP ํ˜•์‹์œผ๋กœ ์ฝ”๋ฑ, ํ•ด์ƒ๋„, ์†ก์ˆ˜์‹  ์—ฌ๋ถ€๋ฅผ ์‘๋‹ต ๋ชจ๋ธ(Offer ↔ Answer)์„ ํ†ตํ•ด ํ˜‘์ƒ

 

์ด๋ฅผ ์œ„ํ•ด ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์‹œ๊ทธ๋„๋ง

์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹œ๊ทธ๋„๋ง์„ ํ†ตํ•ด Peer๊ฐ„ ๋„คํŠธ์›Œํฌ ๋ฐ ๋ฏธ๋””์–ด ๊ด€๋ จ ์ •๋ณด๋ฅผ ๊ตํ™˜

 

NAT(Network Address Translation)

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ ๋‹จ๋ง์€ ํ•˜๋‚˜์˜ ๊ณต์ธ IP๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์‚ฌ์„ค IP๋กœ ์ชผ๊ฐœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์™ธ๋ถ€์™€ ํ†ต์‹ ํ•  ๋•Œ์—๋Š” ๊ณต์ธ IP๋กœ ํ†ต์‹ ์„ ์ง„ํ–‰

NAT๋ฅผ ํ†ตํ•ด ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์— ์กด์žฌํ•˜๋Š” ์‚ฌ์„ค IP์™€ ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์™€ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ณต์ธ IP ๋ฐ ํฌํŠธ์™€ ๋งคํ•‘ํ•˜์—ฌ ์ €์žฅํ•ด๋†“์Œ์œผ๋กœ์จ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์คŒ

 

TURN(Traveral Using Relays around NAT) 

๋ช‡๋ช‡์˜ ๋ผ์šฐํ„ฐ๋“ค์€ peer๋“ค์ด ์˜ค์ง ์ด์ „์— ์—ฐ๊ฒฐํ•œ ์  ์žˆ๋Š” ์—ฐ๊ฒฐ๋“ค๋งŒ ํ—ˆ์šฉ. ์ด์™€ ๊ฐ™์€ Symmetric NAT ์ œํ•œ์„ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด TURN ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉ

 

ICE(Interactive Connectivity Establishment)

์ƒ๋Œ€๋ฐฉ๊ณผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ์„ ๊ฒฝ๋กœ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•œ ๊ณผ์ •์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

 

 

 

 

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ 

https://developer.mozilla.org/ko/docs/Web/API/WebRTC_API

https://wormwlrm.github.io/2021/01/24/Introducing-WebRTC.html

https://gh402.tistory.com/38

https://medium.com/@hyun.sang/webrtc-webrtc%EB%9E%80-43df68cbe511