๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป
article thumbnail
๋ฐ˜์‘ํ˜•

webRTC๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”? ์‰ฝ๊ฒŒ ์„ค๋ช… ํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค.

โœจ WebRTC๋ž€ ๋ญ˜๊นŒ?

์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์— ์žˆ์–ด ์•„์ฃผ ์žฌ๋ฐŒ๋Š” ๊ธฐ์ˆ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ”๋กœ webRTC(Web Real-Time Communication)์ธ๋ฐ์š”.

 

2011๋…„, Google์˜ ๊ฐœ๋ฐœ์ž๋“ค์— ์˜ํ•ด์„œ ํƒ„์ƒํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

WebRTC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ๋ช…ํ•œ ์„œ๋น„์Šค๋“ค ์ค‘ Google Meet, Discord, Zoom ๋“ฑ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

์‰ฝ๊ฒŒ ๋งํ•ด์„œ "๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ๊ฐ€๋Šฅํ•œ ์‹ค์‹œ๊ฐ„ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๊ธฐ์ˆ "์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ™”์ƒ ์ฑ„ํŒ…, ์Œ์„ฑ ํ†ตํ™”, ํŒŒ์ผ ๊ณต์œ  ๋“ฑ๋“ฑ ์ด ๋ชจ๋“  ๊ฑธ ๋ณ„๋„์˜ ํ”„๋กœ๊ทธ๋žจ ์—†์ด ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฌผ๋ก ์ด๊ณ , ๋ชจ๋ฐ”์ผ ์•ฑ, ๋ฐ์Šคํฌํƒ‘ ์•ฑ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ด๋ฉฐ ๊ฐ•๋ ฅํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

 

๋”์šฑ ์‹ ๊ธฐํ•œ ์ ์€ ์„œ๋ฒ„ ์—†์ด P2P(Peer To Peer)๋กœ ์—ฐ๊ฒฐ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

(P2P๋กœ ์—ฐ๊ฒฐ๋˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •์—์„œ ์ค‘๊ณ„ ์„œ๋ฒ„๋Š” ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‚ด์šฉ์€ ์•„๋ž˜ Signaling์— ๊ด€ํ•œ ์„ค๋ช…์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.)

 

WebRTC๋ฅผ ๋’ท๋ฐ›์นจํ•˜๋Š” ๊ธฐ์ˆ ์€ ๊ฐœ๋ฐฉํ˜• ์›น ํ‘œ์ค€(๊ธฐ์ˆ  ํ‘œ์ค€์ด ๋ฌธ์„œ๊ฐ€ ๊ณต๊ฐœ๋˜์–ด ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ด ์ž์œ ๋กœ์šด ๊ฒฝ์šฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์šฉ์–ด)์œผ๋กœ ๊ตฌํ˜„๋˜๋ฉฐ ๋ชจ๋“  ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ API๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

Android ๋ฐ iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฐ™์€ ๋„ค์ดํ‹ฐ๋ธŒ ํด๋ผ์ด์–ธํŠธ์˜ ๊ฒฝ์šฐ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ’ก ์ฃผ์š” ๊ฐœ๋… ๋ฐ ์šฉ์–ด

webRTC์—๋Š”  ์ฃผ์š” ์šฉ์–ด ๋ฐ ๊ฐœ๋…๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ์š”.

 

๋ฐ”๋กœ

  • ์‹œ๊ทธ๋„๋ง(Signaling)
  • SDP(Session Description Protocol)
  • ICE(Interactive Connectivity Establishment)
  • STUN/TURN

๋“ฑ์˜ ์šฉ์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์กฐ๊ธˆ ๋” ์‰ฝ๊ณ  ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์ด์ „์— ์ œ๊ฐ€ P2P๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๊ณ„ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ค‘๊ณ„์„œ๋ฒ„๋ฅผ ํ†ตํ•ด์„œ ์„œ๋กœ๋ฅผ ์ฐพ๊ณ  ์—ฐ๊ฒฐ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ”๋กœ ์‹œ๊ทธ๋„๋ง(Signaling)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

๋น„์œ ํ•˜์ž๋ฉด ์‹œ๊ทธ๋„๋ง์˜ ๊ฐœ๋…์€ ๋งˆ์น˜ ์†Œ๊ฐœํŒ… ์ฃผ์„ ์ž์ฒ˜๋Ÿผ ์–‘์ชฝ์—์„œ ์„œ๋กœ์˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค.

 

์ด ์‹œ๊ทธ๋„๋ง์€ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋˜๊ณ , ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ์ง€๋Š” ์ž์œ ์ž…๋‹ˆ๋‹ค.

WebSocket, HTTP ๋“ฑ ์ ์ ˆํ•œ ํ”„๋กœํ† ์ฝœ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

SDP(Session Description Protocol)

SDP๋Š” "๋ฌด์—‡์œผ๋กœ ์†Œํ†ตํ• ์ง€, ์–ด๋–ป๊ฒŒ ์†Œํ†ตํ• ์ง€"์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ์–‘์‹์ž…๋‹ˆ๋‹ค.

์ฆ‰, "๋‚˜๋Š” ์ด๋Ÿฐ ์˜ค๋””์˜ค, ๋น„๋””์˜ค๋ฅผ ์ง€์›ํ•ด"๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ์ž๊ธฐ์†Œ๊ฐœ์„œ์™€ ๊ฐ™๋‹ค๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๋” ์ž์„ธํ•˜๊ฒŒ๋Š” ์„ธ์…˜ ์ •๋ณด, ๋„คํŠธ์›Œํฌ ์ •๋ณด, ๋ฏธ๋””์–ด์˜ ์ข…๋ฅ˜, ์ฝ”๋ฑ, ์ŠคํŠธ๋ฆผ์˜ ์†์„ฑ ๋“ฑ ๋งŽ์€ ๋‚ด์šฉ์ด ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์—ฐ๊ฒฐํ•˜๋Š” ์‹œ์ž‘ํ•˜๋Š” ์ชฝ์—์„œ๋Š” Offer SDP๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฐ›๋Š” ์ชฝ์—์„œ๋Š” Answer SDP๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

์ด ์ •๋ณด๋“ค์„ ํ†ตํ•ด์„œ ์–‘์ชฝ ํ”ผ์–ด๊ฐ€ ์ง€์›ํ•˜๋Š” ์ฝ”๋ฑ, ํ•ด์ƒ๋„ ๋“ฑ์„ ํ˜‘์ƒํ•˜์—ฌ ์ตœ์ ์˜ ์„ค์ •์„ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ .

 

SDP์˜ ๊ตฌ์กฐ๋ฅผ ํ•œ๋ฒˆ ๋ณผ๊นŒ์š”?

v=0
o=- 1234567890 1234567890 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:someufrag
a=ice-pwd:someicepwd
a=fingerprint:sha-256 somefingerprint
...

์ด SDP๋ฅผ ๊ฐ€์ง€๊ณ  ํ”ผ์–ด๋ผ๋ฆฌ ์•Œ์•„์„œ ํ˜‘์ƒ์„ ํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฑธ ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋Š” ์ž์„ธํžˆ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ชจ๋‘ ์™ธ์šธ ํ•„์š”๋Š” ์—†์–ด์š”.

 

๊ฐ ์ค„์˜ ์˜๋ฏธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์•„์š”.

์ถœ์ฒ˜: ์œ„ํ‚คํ”ผ๋””์•„ SDP

์˜จ์ „ํžˆ ์„ธ์…˜ ์„ค๋ช…์„ ์œ„ํ•œ ํ˜•์‹์ด๋ผ๊ณ  ์ดํ•ดํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ICE(Interactive Connectivity Establishment)

์œ„์—์„œ ์ž๊ธฐ์†Œ๊ฐœ(SDP)๋ฅผ ํ–ˆ์œผ๋‹ˆ ์ด์ œ ์–ด๋–ป๊ฒŒ ์—ฐ๋ฝ์„ ํ• ์ง€ ์ •ํ•ด์•ผ๊ฒ ์ฃ ?

 

ICE๋Š” "๋‚˜ํ•œํ…Œ ์—ฐ๋ฝํ•˜๋ ค๋ฉด ์ด ์ฃผ์†Œ๋กœ ์—ฐ๋ฝํ•ด!"๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

 

์ฆ‰, ๋‘ ํ”ผ์–ด ๊ฐ„์˜ ์ตœ์ ์˜ ํ†ต์‹  ๊ฒฝ๋กœ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

NAT(Network Address Traslation)์™€ ๋ฐฉํ™”๋ฒฝ ๋“ฑ์˜ ๋„คํŠธ์›Œํฌ ์žฅ๋ฒฝ์„ ๊ทน๋ณตํ•˜๊ณ  ์ง์ ‘์ ์ธ ์—ฐ๊ฒฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ์—ฐ๊ฒฐ ํ›„๋ณด ์ˆ˜์ง‘: ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•(ํ›„๋ณด)์„ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.
  • ์—ฐ๊ฒฐ์„ฑ ๊ฒ€์‚ฌ: ๊ฐ ํ›„๋ณด์— ๋Œ€ํ•ด ์‹ค์ œ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ์„ ์ˆœ์œ„ ๊ฒฐ์ •: ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ์—ฐ๊ฒฐ ๊ฒฝ๋กœ(์ง€์—ฐ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ์งง์€ ์—ฐ๊ฒฐ์„ ์„ ํ˜ธ)๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • NAT ๋ฐ ๋ฐฉํ™”๋ฒฝ ํ†ต๊ณผ: ๋‹ค์–‘ํ•œ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ์˜ ์—ฐ๊ฒฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

ICE ํ”„๋ ˆ์ž„์›Œํฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‘ ํ”ผ์–ด๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ง€์—ฐ ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ(์ตœ์ ์˜ ํ†ต์‹  ๊ฒฝ๋กœ)๋ฅผ ์ฐพ๊ณ , ์•„๋ž˜ ์˜ต์…˜์„ ์ˆœ์„œ๋Œ€๋กœ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ง์ ‘ UDP ์—ฐ๊ฒฐ, ์‚ฌ์„ค IP (์ด ๊ฒฝ์šฐ์—๋งŒ STUN ์„œ๋ฒ„๋Š” ํ”ผ์–ด์˜ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์ฃผ์†Œ๋ฅผ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค)
  2. HTTP ํฌํŠธ๋ฅผ ํ†ตํ•œ ์ง์ ‘ TCP ์—ฐ๊ฒฐ
  3. HTTPS ํฌํŠธ๋ฅผ ํ†ตํ•œ ์ง์ ‘ TCP ์—ฐ๊ฒฐ
  4. relay/TURN ์„œ๋ฒ„๋ฅผ ํ†ตํ•œ ๊ฐ„์ ‘ ์—ฐ๊ฒฐ (์ง์ ‘ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ํ”ผ์–ด๊ฐ€ NAT ํ†ต๊ณผ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉํ™”๋ฒฝ ๋’ค์— ์žˆ๋Š” ๊ฒฝ์šฐ)

STUN / TURN

์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ๋ณด๋‹ค ์™„์ „ํžˆ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ ๋‹ค๋ฅธ ํ”ผ์–ด์™€ ์—ฐ๊ฒฐ์„ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

 

๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๋ง์— ์žˆ์œผ๋ฉด ์‚ฌ์„ค IP๋กœ P2P ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‚˜, ์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ ๊ฐ์ž์˜ ์‚ฌ์„ค IP๋กœ๋Š” ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์ฃ .

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ STUN ์„œ๋ฒ„์™€ TURN ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

์ฆ‰, ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ ๋ณ€ํ™˜(NAT) ๋’ค์— ์žˆ๋Š” ์žฅ์น˜๋“ค์ด ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค.

STUN

STUN(Session Traversal Utilities for NAT)์€ ์šฐ๋ฆฌ์˜ ์ปดํ“จํ„ฐ๊ฐ€ "๋‚˜ ์ง€๊ธˆ ์–ด๋”” ์žˆ๋Š” ๊ฑฐ์•ผ?"๋ผ๊ณ  ๋ฌผ์–ด๋ณผ ๋•Œ ๋Œ€๋‹ตํ•ด ์ฃผ๋Š” ์นœ์ ˆํ•œ ์„œ๋ฒ„๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

NATํ™˜๊ฒฝ์—์„œ Private IP๋ฅผ ๋ณ„๋„๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— P2P ํ†ต์‹ ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์š”.

๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์˜ Public IP๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด STUN ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ž์‹ ์˜ Public IP๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

STUN ์„œ๋ฒ„์˜ ํŠน์ง•์œผ๋กœ๋Š” ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ฒŒ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TURN

TURN(Traversal Using Relays around NAT)์€ ๋งˆ์น˜ "๋„ˆํฌ ๋‘˜์ด ๋งŒ๋‚˜๊ธฐ ์–ด๋ ค์šฐ๋ฉด, ๋‚ด๊ฐ€ ์ค‘๊ฐ„์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „ํ•ด์ค„๊ฒŒ!"๋ผ๊ณ  ํ•˜๋Š” ์นœ์ ˆํ•œ ์ค‘๊ณ„์ž์ž…๋‹ˆ๋‹ค.

 

TURN ์„œ๋ฒ„๋Š” STUN ์„œ๋ฒ„๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ๊ณ ์ง‘์ด ์„ผ(?) NAT ๊ตฌ์„ฑ์—์„œ๋Š” ์™ธ๋ถ€ ์„œ๋ฒ„์™€์˜ ์ง์ ‘์ ์ธ P2P ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

 

๊ทธ๋ž˜์„œ TURN ์„œ๋ฒ„์˜ ํŠน์ง•์œผ๋กœ๋Š” ์™„๋ฒฝํ•œ ์ค‘๊ณ„ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ƒ๋Œ€์ ์œผ๋กœ ๋Š๋ฆฌ๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ WebRTC๋Š” ๋ณดํ†ต ์ด๋ ‡๊ฒŒ ํ–‰๋™ํ•ด์š”.

  1. "๋จผ์ € STUN์œผ๋กœ ํ•ด๋ณผ๊นŒ? ์˜ค ์ž˜๋˜๋„ค ์ด๊ฑธ๋กœ ๊ฐ€์ž!"
  2. "STUN์ด ์•ˆ ๋˜๋„ค..? ๊ทธ๋Ÿผ TURNํ•œํ…Œ ๋ถ€ํƒํ•˜์ž"

์ฆ‰, STUN ์„œ๋ฒ„๋กœ ๋จผ์ € ์‹œ๋„ํ•˜๊ณ  ์•ˆ๋˜๋ฉด TURN ์„œ๋ฒ„๋กœ ์‹œ๋„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

webRTC์—์„œ๋Š” ์•„๋ž˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.

const peerConnection = new RTCPeerConnection({
  iceServers: [
    { urls: 'stun:stun.l.google.com:19302' }, // STUN ์„œ๋ฒ„
    { 
      urls: 'turn:your-turn-server.com',      // TURN ์„œ๋ฒ„
      username: '์œ ์ €๋„ค์ž„',
      credential: '๋น„๋ฐ€๋ฒˆํ˜ธ'
    }
  ]
});

๐Ÿ‘€ ๋™์ž‘ ์›๋ฆฌ

์ „์ฒด์ ์ธ ํฐ ๊ทธ๋ฆผ์„ ํ•œ๋ฒˆ ์‚ดํŽด๋ณผ๊นŒ์š”?

์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์ด๋ผ ๊ฐ€์ •ํ•œ ์ƒํ™ฉ์—์„œ STUN ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ ์ •๋ณด๋ฅผ ํš๋“ํ•˜๊ณ  ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด์„œ SDP๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด SDP์— ICE ํ›„๋ณด์˜ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ IP์ฃผ์†Œ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

SDP๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ  ์„œ๋กœ์˜ SDP๋ฅผ webRTC์—์„œ ์—ฐ๊ฒฐ์ด ์„ค์ •๋œ ํ›„ ๋‚˜๋ฉด ๋น„๋กœ์†Œ P2P ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๋ง๋ถ™์ด์ž๋ฉด, ์ด ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๋Š” ์—ฐ๊ฒฐ ๊ณผ์ •์—์„œ๋งŒ ํ•„์š”ํ•˜๊ณ  ๋” ์ด์ƒ P2P ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ดํ›„ ํ†ต์‹ ์€ webRTC๋ฅผ ํ†ตํ•ด P2P๋กœ ํ†ต์‹ ์„ ํ•˜๊ฒŒ ๋˜์ฃ .

 

์‹ค์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•œ webRTC P2P ์—ฐ๊ฒฐ์€ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

โ‰๏ธ P2P ์—ฐ๊ฒฐ์˜ ํ•œ๊ณ„

webRTC๋ฅผ ํ†ตํ•œ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด์„œ๋Š” ๊ผญ ์•Œ์•„๋‘์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

P2P ์—ฐ๊ฒฐ์€ webRTC์˜ ๊ธฐ๋ณธ์ด์ง€๋งŒ, ์ฐธ๊ฐ€์ž๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๊ณผ๋ถ€ํ•˜๊ฐ€ ์˜ค๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์น˜ ํ•œ ์‚ฌ๋žŒ์ด ์—ฌ๋Ÿฌ ๋ช…์—๊ฒŒ ๋™์‹œ์— ๋งํ•˜๋ ค๋‹ค๊ฐ€ ๋ชฉ์ด ์•„ํŒŒ์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”.

 

๋งŒ์•ฝ N๋ช…์ด ์ฐธ์—ฌํ•˜๋ฉด N(N-1) / 2 ๊ฐœ์˜ ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ฐ€์ž๊ฐ€ 10๋ช…์ด๋ฉด 45๊ฐœ์˜ ์—ฐ๊ฒฐ์ด ์ƒ์„ฑ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ฆ‰, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด CPU์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ์˜ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค.

 

๋Œ€์‹  ๋ณดํ†ต P2P ๊ตฌํ˜„์€ ์„œ๋ฒ„์— ๋ณ„๋„์˜ ๋ถ€ํ•˜๊ฐ€ ์—†๊ณ , Peer ๊ฐ„์˜ ์ง์ ‘์ ์ธ ์—ฐ๊ฒฐ๋กœ ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ๋งค์šฐ ์ ์€ ์‚ฌ์šฉ์ž๋“ค๋งŒ ํ•„์š”๋กœ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๊ตฌํ˜„ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์–ด๋– ํ•œ ๋ฐฉ์‹๋“ค์ด ์žˆ์„์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์งš๊ณ  ๋งˆ๋ฌด๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

SFU(Selective Forwarding Unit)

SFU๋Š” ์˜๋ฆฌํ•œ ๋ฏธ๋””์–ด ๋ผ์šฐํ„ฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฏธ๋””์–ด ๊ฐ„์˜ ํŠธ๋ž˜ํ”ฝ์„ ์ค‘๊ณ„ํ•˜๋Š” ์ค‘์•™ ์„œ๋ฒ„์ด๋ฉฐ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ Peer์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ ์ฐธ๊ฐ€์ž๋กœ๋ถ€ํ„ฐ ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ๋งŒ ๋ฐ›์•„์„œ ํ•„์š”ํ•œ ๊ณณ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ฐธ๊ฐ€์ž๋“ค์˜ ๋Œ€์—ญํญ๊ณผ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ์˜์ƒ ํ’ˆ์งˆ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜๊ณ , ์ง€์—ฐ ์‹œ๊ฐ„๋„ ๋น„๊ต์  ์งง์Šต๋‹ˆ๋‹ค.

์ž‘๋™ ๋ฐฉ์‹์„ ์•Œ์•„๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. A๊ฐ€ ์˜์ƒ์„ SFU๋กœ ํ•œ ๋ฒˆ๋งŒ ์ „์†กํ•ด์š”.
  2. SFU๊ฐ€ ์ด ์˜์ƒ์„ B, C, D์—๊ฒŒ ๊ฐ๊ฐ ์ „๋‹ฌํ•ด์š”.
  3. A๋Š” ์—…๋กœ๋“œ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ 1:N ํ˜•์‹ ๋˜๋Š” ์†Œ๊ทœ๋ชจ N:M ํ˜•์‹์˜ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ ์ฃผ๋กœ ์ฑ„ํƒ๋˜๊ณ  ์žˆ์–ด์š”.

MCU(Multipoint Control Unit)

MCU๋Š” ์˜์ƒ์„ ๋ฐ›์•„์„œ ์„ž์€ ๋‹ค์Œ์— ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋งŒ๋“ค์–ด ๋ณด๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

MCU ๋ฐฉ์‹์€ ํด๋ผ์ด์–ธํŠธ์— ๋ถ€๋‹ด์ด ๊ฐ€์žฅ ์ ๊ณ , ์ผ๊ด€๋œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ตœ๋Œ€ ๋‹จ์ ์œผ๋กœ๋Š” webRTC์˜ ์ตœ๋Œ€ ์žฅ์ ์ธ ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์–ด์š”.

 

์ž‘๋™ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์•„์š”

  1. A, B, C๊ฐ€ ๊ฐ์ž์˜ ์˜์ƒ์„ MCU๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  2. MUC๊ฐ€ ์ด ์˜์ƒ๋“ค์„ ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋งŒ๋“ค์–ด์š”
  3. ๊ทธ๋ฆฌ๊ณ  ์ด ํ†ตํ•ฉ๋œ ์ŠคํŠธ๋ฆผ์„ ๋ชจ๋“  ์ฐธ๊ฐ€์ž์—๊ฒŒ ๋ณด๋‚ด์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ์š”์•ฝํ•˜์ž๋ฉด

  • SFU: ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ์„ฑ์ด ์ข‹์•„์š”. ๋Œ€๊ทœ๋ชจ ํšŒ์˜์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • MCU: ์ผ๊ด€๋œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ๋ถ€๋‹ด์ด ์ ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ํšŒ์˜๋‚˜ ๋‚ฎ์€ ์„ฑ๋Šฅ์˜ ๊ธฐ๊ธฐ์— ์ข‹์•„์š”.

์ €ํฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์„œ๋น„์Šค ์ค‘์—์„œ Zoom์€ SFU์™€ MCU์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ , GoogleMeet๋Š” SFU ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜๋„ค์š”.

๐Ÿ“• ๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” webRTC๊ฐ€ ๋ฌด์—‡์ด๊ณ , ์ด๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ป๊ฒŒ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ์ด๋ฃจ์–ด์ง€๋Š”์ง€, ์–ด๋–ค ํ•œ๊ณ„์ ์ด ์žˆ๊ณ  ์–ด๋–ค ๋ฐฉ์‹์ด ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— ์„ค๋ช…ํ–ˆ๋˜ P2P ๋ฐฉ์‹, SFU, MCU์™€ ๊ฐ™์€ ๋ฐฉ์‹์€ ๊ฐ๊ฐ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ  ์ •๋‹ต์€ ์—†์Šต๋‹ˆ๋‹ค.

 

์ „์ฒด์ ์ธ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด์•˜๊ณ  ๋‹ค์Œ ํฌ์ŠคํŒ…์€ ์‹ค์ œ ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•œ webRTC์˜ ๊ฐ„๋‹จํ•œ P2P ๋ฐฉ์‹ ํ™”์ƒ์ฑ„ํŒ… ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด์„œ ๋™์ž‘ ๋ฐฉ์‹์„ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

์ฐธ๊ณ  ๋ฌธํ—Œ:

๋ฐ˜์‘ํ˜•
profile

๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป

@์šฉ๋‡ฝ

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!