[WebRTC] WebRTC ์ฐข์–ด๋ฒ„๋ฆฌ๊ธฐ - ์ด๋ก  ์ •๋ฆฌ

2025. 5. 30. 00:16ยทDrillDown/WebRTC

์ถœ์ฒ˜: https://webrtc.github.io/webrtc-org/press

 

 

 

๐Ÿ“– ๊ฐœ์š”


๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. WebRTC ๊ด€๋ จ ๊ธ€์ด ์ €์˜ ์ฒซ ํฌ์ŠคํŒ…์ด ๋˜์—ˆ๋„ค์š”. ์ด ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ ๋ฐ๋Š” ๋‚˜๋ฆ„์˜ ๊ณ„๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ถ€ํŠธ์บ ํ”„์—์„œ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ, ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด WebRTC๋ผ๋Š” ๊ธฐ์ˆ ์„ ์ฒ˜์Œ ์ ‘ํ•˜๊ณ  ์ ์šฉํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ ๋‹จ๊ณ„๋ถ€ํ„ฐ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ์—ˆ๊ณ , ์ˆ˜๋งŽ์€ ๊นƒํ—™ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์™€ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ฐธ๊ณ ํ–ˆ์ง€๋งŒ, ๊ธฐ์ดˆ ์ด๋ก ์— ๋Œ€ํ•œ ๋ถ€์กฑํ•จ์„ ๋А๋‚€ ์ฑ„๋กœ ๋ฐ๋“œ๋ผ์ธ์— ์ซ“๊ฒจ ํ”„๋กœ์ ํŠธ๋ฅผ ์–ด์˜๋ถ€์˜ ๋งˆ๋ฌด๋ฆฌ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ฐœ์ธ์ ์ธ ํšŒ๊ณ ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ด๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

“๋ฉด์ ‘์—์„œ WebRTC์˜ ๋™์ž‘ ๋ฐฉ์‹์ด๋‚˜ ์‚ฌ์šฉ ์ด์œ ๋ฅผ ๋ฌผ์–ด๋ณธ๋‹ค๋ฉด, ์ œ๋Œ€๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์„๊นŒ?”
“๋ˆ„๊ตฐ๊ฐ€ WebRTC๋ฅผ ์ฒ˜์Œ ์“ด๋‹ค๊ณ  ์กฐ์–ธ์„ ๊ตฌํ•ด์˜จ๋‹ค๋ฉด, ๋ช…์พŒํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ค„ ์ˆ˜ ์žˆ์„๊นŒ?”

 

์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ œ ๋Œ€๋‹ต์€ “NO” ์˜€์Šต๋‹ˆ๋‹ค. ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ๋ฌด์—‡์ธ์ง€ ์ธ์ง€ํ–ˆ๊ณ , ๊ณผ๊ฑฐ์˜ ์ €์ฒ˜๋Ÿผ ๋ง‰๋ง‰ํ•จ์„ ๋А๋‚„ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋˜๊ณ ์ž ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜๊ณ  ์ด ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด ํฌ์ŠคํŒ…์€ ์ด๋ก  ํŽธ๊ณผ ์‹ค์Šต ์ฝ”๋“œ ํŽธ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ, ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • WebRTC๋ž€?
  • WebRTC ๋™์ž‘๋ฐฉ์‹
  • ํ•ต์‹ฌ ์ •๋ฆฌ
  • ๋งˆ์น˜๋ฉฐ

 

 

 

๐Ÿค” WebRTC๋ž€?


Web Real-Time Communication์˜ ์•ฝ์ž๋กœ, ๋ณ„๋„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—†์ด ์›น/์•ฑ ํ™˜๊ฒฝ์—์„œ ์นด๋ฉ”๋ผ, ๋งˆ์ดํฌ, ๋ฐ์ดํ„ฐ ์ฑ„๋„์„ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

 

์ฃผ์š” ํŠน์ง•

  • Peer-to-Peer ์—ฐ๊ฒฐ
    • ๋ฏธ๋””์–ด/๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž ๊ฐ„ ์ „์†ก
    • Real-Time๊ณผ ๋น„์Šทํ•œ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ์ œ๊ณต
    • P2P ์—ฐ๊ฒฐ์„ ๋งบ๊ธฐ ์œ„ํ•œ Signaling ๋‹จ๊ณ„ ํ•„์š”
  • ๋ฏธ๋””์–ด๋ฟ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ์ „์†ก๋„ ๊ฐ€๋Šฅ
    • ์˜ค๋””์˜ค/๋น„๋””์˜ค ์™ธ์— ํ…์ŠคํŠธ, ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋„ P2P๋กœ ์ „์†ก ๊ฐ€๋Šฅ
    • ๊ฒŒ์ž„, ์ฑ„ํŒ…, ํŒŒ์ผ ์ „์†ก ๋“ฑ์— ํ™œ์šฉ
  • ๋ธŒ๋ผ์šฐ์ € ์ž์ฒด ์ง€์›
    • ๋ณ„๋„ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—†์ด ๋™์ž‘
    • Chrome, Firefox, Safari ๋“ฑ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›
    • Android ๋ฐ iOS์—์„œ๋„ ์ง€์› ๊ฐ€๋Šฅ
    • ์ผ๋ถ€ ๋น„์ฃผ๋ฅ˜ ๋ธŒ๋ผ์šฐ์ €/๋ฒ„์ „์—์„œ๋Š” ๋ฏธ์ง€์› ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ
  • ๋น„๊ต์  ๋‚ฎ์€ ์ง„์ž…์žฅ๋ฒฝ
    • ๊ธฐ๋ณธ JavaScript API๋กœ ๊ตฌ์„ฑ

 

์™œ WebRTC๊ฐ€ ํ•„์š”ํ• ๊นŒ?

๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฐ„ ์‹ค์‹œ๊ฐ„ ํ™”์ƒ์ฑ„ํŒ…์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” REST API๋กœ JSON ์ƒํ•˜์ฐจ๋งŒ ํ•˜๋‹ค๊ฐ€ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ค„์•ผ ํ•œ๋‹ค๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ƒˆํ•˜์–˜์ง‘๋‹ˆ๋‹ค. WebRTC๊ฐ€ ์—†๋‹ค๋ฉด ๊ณ ๋ คํ•ด์•ผํ•  ์š”์†Œ๋“ค์ด ๋„ˆ๋ฌด๋‚˜ ๋งŽ์Šต๋‹ˆ๋‹ค.

  • P2P ์—ฐ๊ฒฐ์„ ์ง์ ‘ ๊ตฌ์„ฑํ•  ๊ฒƒ์ธ๊ฐ€?
  • ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ค‘๊ณ„ํ•  ๊ฒƒ์ธ๊ฐ€?
  • ์‹ค์‹œ๊ฐ„์ด๋ผ๋ฉด UDP๋ฅผ ์ง์ ‘ ๋‹ค๋ค„์•ผ ํ•˜๋‚˜?
  • ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ญ๊ฐ€ ์žˆ์„๊นŒ?
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ ๋ณต์žกํ•œ ์„ค์ •์ด ํ•„์š”ํ•œ ๊ฑด ์•„๋‹๊นŒ?
  • ์•Œ์•„์•ผ ํ•  ํ”„๋กœํ† ์ฝœ์€ ๋˜ ์™œ ์ด๋ ‡๊ฒŒ ๋งŽ์€ ๊ฑด์ง€…

์ด์ฏค ๋˜๋ฉด ๋จธ๋ฆฌ์นด๋ฝ์ด ํ•œ ์˜ฌ์”ฉ ๋น ์ง€๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ WebRTC๋Š” ์ด๋Ÿฐ ๊ณ ๋ฏผ๋“ค์„ ๋œ์–ด์ฃผ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์ฃผ์š” ํŠน์ง•์„ ์‚ดํŽด๋ดค์œผ๋‹ˆ, ์ด์ œ๋ถ€ํ„ฐ๋Š” ๊ธฐ์ˆ ์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด WebRTC๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๊นŠ์ง€ ์•Š๊ณ  ์ ๋‹นํ•œ ์„ ์—์„œ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๐Ÿš€ WebRTC ๋™์ž‘๋ฐฉ์‹


์•ž์„  ๋‚ด์šฉ์—์„œ, WebRTC๋Š” P2P ์—ฐ๊ฒฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

P2P ์—ฐ๊ฒฐ์„ ์„ค๋ฆฝํ•˜๊ธฐ ์œ„ํ•ด Signaling ์ด๋ผ๋Š” ๊ณผ์ •์„ ๋จผ์ € ๊ฑฐ์นฉ๋‹ˆ๋‹ค. ์™œ Signaling์ด ํ•„์š”ํ•œ์ง€ ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š”์ง€๋ฅผ ๋‘ ๋ช…์˜ ์œ ์ €๊ฐ€ ํ™”์ƒ์ฑ„ํŒ…์„ ์‹œ๋„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์‹คํ–‰์˜ ํ๋ฆ„์— ๋”ฐ๋ผ ์„ค๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ž, ์ด์ œ ๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์ด ๋‚ ์”จ ์ด์Šˆ๋กœ ์ธํ•ด์„œ ์ง‘์ฝ•์„ ํ•˜๊ธฐ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๋‘˜์€ ๋งŒ๋‚˜์„œ ๋†€๊ณ ์‹ถ์€๊ฑฐ์ฃ . ์ด ๋•Œ, ์Šคํฐ์ง€๋ฐฅ์ด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด์„œ ํ™”์ƒ์ฑ„ํŒ…์œผ๋กœ ๋งŒ๋‚˜์ž๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

๋šฑ์ด๋Š” ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

“์šฐ๋ฆฌ ๊ฐ์ž ์ปดํ“จํ„ฐ์—์„œ ์‚ฌ์šฉ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ IP์™€ PORT ๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„์•ผ ์ •ํ™•ํžˆ P2P๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์„ํ…๋ฐ, ์–ด๋–ป๊ฒŒ ์•Œ์•„๋‚ด์ง€?”

 

 

Signaling

Signaling ์ด๋ž€, ๊ณ ์ • IP๋ฅผ ๊ฐ€์ง€๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(e.g, AWS EC2๋กœ ๋ฐฐํฌํ•œ ์„œ๋ฒ„)์„ ํ†ตํ•ด WebSocket, REST API ๋“ฑ์˜ ๋ณ„๋„์˜ ์ฑ„๋„์„ ์‚ฌ์šฉํ•ด ์„œ๋กœ์˜ SDP ์ •๋ณด์™€ ICE Candidate๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

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

 

ํ•˜์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€ ํ™”์ƒ์ฑ„ํŒ… ์„œ๋น„์Šค๋ฅผ ์œ„ํ•ด ๋ฐฐํฌํ•œ ์„œ๋ฒ„๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค.

ํ•ด๋‹น ์„œ๋ฒ„๋Š” ์–ธ์ œ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์ •๋œ IP:PORT๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์€ ๊ฐ์ž ์ด ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜์—ฌ ์ž์‹ ์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ, ์„œ๋ฒ„๋Š” ๋šฑ์ด์˜ ์ •๋ณด๋ฅผ ์Šคํฐ์ง€๋ฐฅ์—๊ฒŒ, ์Šคํฐ์ง€๋ฐฅ์˜ ์ •๋ณด๋ฅผ ๋šฑ์ด์—๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ P2P ์—ฐ๊ฒฐ์„ ๋งบ๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€ ๊ตํ™˜ ๊ณผ์ •์„ Signaling์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ์ค‘๊ฐœํ•˜๋Š” ์„œ๋ฒ„๋ฅผ Signaling Server ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Signaling ๊ธฐ๋Šฅ์€ WebRTC API์— ํฌํ•จ๋ผ ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ „๋‹ฌ ๋Œ€์ƒ๋งŒ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์€ ๊ทธ๋Œ€๋กœ ๋Œ€์ƒ์—๊ฒŒ ์ „๋‹ฌํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•œ๊บผ๋ฒˆ์— ์ƒ์†Œํ•œ ํ‚ค์›Œ๋“œ๊ฐ€ ์Ÿ์•„์กŒ๋‹ค๋ฉด ์ž ๊น ๋ฉˆ์ถ”๊ณ  ์‹ถ์–ด์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•œ ๋ถ€๋ถ„, ๊ฐ€๋ณ๊ฒŒ ์ •๋ฆฌํ•˜๊ณ  ๊ฐ€๋ด…์‹œ๋‹ค.

 

 

NAT(Network Address Translation)

“์™œ ์„œ๋ฒ„๋Š” ๊ณ ์ • IP์ด๊ณ , ๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์€ ๋™์ ์ธ IP/PORT๋ฅผ ์“ฐ๋Š” ๊ฑฐ์ง€?”

ํ•ต์‹ฌ์€ ๋ฐ”๋กœ IPv4 ์ฃผ์†Œ์˜ ๋ถ€์กฑ๊ณผ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ NAT ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

IPv4๋Š” ์•ฝ 43์–ต ๊ฐœ์˜ ์ฃผ์†Œ(2³²)๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋นจ๋ฆฌ ๊ณ ๊ฐˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ปดํ“จํ„ฐ, ์Šค๋งˆํŠธํฐ์€ ๋ฌผ๋ก ์ด๊ณ  ๋ƒ‰์žฅ๊ณ , ์„ธํƒ๊ธฐ, ์ž๋™์ฐจ๊นŒ์ง€ ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐ๋˜๋Š” ์‹œ๋Œ€๊ฐ€ ์™”๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๋ชจ๋“  ๊ธฐ๊ธฐ์— ๊ณ ์œ ํ•œ IP๋ฅผ ๋ถ€์—ฌํ•˜๊ธฐ์—” ์ˆ˜๊ฐ€ ํ„ฑ์—†์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

 

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด NAT ์ž…๋‹ˆ๋‹ค.

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

 

์œ„ ๊ทธ๋ฆผ์—์„œ ๋šฑ์ด๊ฐ€ ์™ธ๋ถ€ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ ๊ณผ์ •์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ๊ณต์œ ๊ธฐ์™€ ์—ฐ๊ฒฐ๋œ ๋šฑ์ด์˜ ๋ฐ์Šคํฌํƒ‘์€ ๋กœ์ปฌ DHCP ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด์„œ private IP ํ• ๋‹น๋ฐ›์Šต๋‹ˆ๋‹ค.
    • 192.168.0.23
  2. ๋šฑ์ด๊ฐ€ ๊ณ ์ • IP๋ฅผ ๊ฐ€์ง„ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  3. ๋ผ์šฐํ„ฐ๊ฐ€ NAT ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์™ธ๋ถ€๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    • ๋ผ์šฐํ„ฐ๊ฐ€ ๊ฐ€์ง„ ๊ณต์ธ IP + ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ PORT ๋กœ ๋ณ€ํ™˜
      • 192.168.0.23:52933 ⇒ 112.113.114.115:62000
    • ์—ฐ๊ฒฐ์ด ์ง€์†๋œ๋‹ค๋ฉด NAT๊ฐ€ ๋งคํ•‘ํ•œ ํ•ด๋‹น IP:PORT ๋ฅผ ๋šฑ์ด๊ฐ€ ๊ณ„์† ์ ์œ ํ•˜๋ฉด์„œ ์‚ฌ์šฉ
  4. ๋šฑ์ด๋Š” ์™ธ๋ถ€ ์‘๋‹ต์„ ๋ฐ›๊ณ  ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
    • ํ• ๋‹น ๋ฐ›์•˜๋˜ IP:PORT๋ฅผ ๋งคํ•‘ ํ…Œ์ด๋ธ”์—์„œ ์ œ์™ธ
    • PORT ๋ฒˆํ˜ธ 62000์ด ๋‹ค์‹œ ๊ฐ€์šฉ ์ƒํƒœ๊ฐ€ ๋จ

 

๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์ฒ˜๋Ÿผ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ๋ณดํ†ต NAT ๋’ค์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์•ˆ์—์„œ๋Š” ์‚ฌ์„ค IP๋ฅผ DHCP์„œ๋ฒ„์—๊ฒŒ ๋™์ ์œผ๋กœ ํ• ๋‹น๋ฐ›๊ณ  ์™ธ๋ถ€์—์„œ๋Š” ๊ณต์œ ๊ธฐ์˜ ๊ณต์ธ IP ํ•˜๋‚˜๋งŒ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๋ˆ„๊ตฌ์™€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋ผ์•ผ ํ•˜๋Š”์ง€ ์™ธ๋ถ€์—์„œ๋Š” ์•Œ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•จ์œผ๋กœ์จ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋™์ ์œผ๋กœ IP:PORT๋ฅผ ํ• ๋‹น๋ฐ›๊ณ  ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ, IP ์ฃผ์†Œ ๋ถ€์กฑ ํ˜„์ƒ์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๋ฐ˜๋ฉด ์„œ๋ฒ„๋Š” ์™œ ๊ณ ์ • IP๋ฅผ ์“ธ๊นŒ์š”?

WebRTC์—์„œ Signaling Server์ฒ˜๋Ÿผ ์ค‘๊ฐ„ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋“ค์ด ํ•ญ์ƒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ • IP๊ฐ€ ์‚ฌ์‹ค์ƒ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.๊ณ ์ •๋œ ์œ„์น˜์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์ด ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ธธ ์›ํ•  ๋•Œ, ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์„œ๋กœ์˜ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๊ณ  ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์ฃ . ๋งค๋ฒˆ ๋ฐ”๋€Œ๋Š” IP๋กœ ์šด์˜ํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž๋„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ , ๋„๋ฉ”์ธ ๋งคํ•‘๋„ ํž˜๋“ค ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ๊ณ ์ • IP๋ฅผ ๋ชป ๊ฐ€์ง€๋Š” ๊ฑธ๊นŒ์š”?

๊ผญ ๊ทธ๋Ÿฐ ๊ฑด ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋„ ๊ณ ์ • IP๋ฅผ ์‹ ์ฒญํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ€์ •์šฉ ์ธํ„ฐ๋„ท ํ™˜๊ฒฝ์—์„œ๋Š” ํŠน๋ณ„ํžˆ ์‹ ์ฒญํ•˜์ง€ ์•Š์œผ๋ฉด ๋™์  IP๊ฐ€ ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ ์ • IP๋Š” ์ถ”๊ฐ€ ๋น„์šฉ์„ ์ง€๋ถˆํ•ด์•ผ ํ•˜๊ณ , ๊ด€๋ฆฌ ๋น„์šฉ๋„ ์ฆ๊ฐ€ํ•˜๋ฉฐ ๋ณด์•ˆ ์ธก๋ฉด์—์„œ๋„ ๋™์  IP๊ฐ€ ๋” ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์—ฌ๊ฒจ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

 

SDP (Session Description Protocol)

“SDP๋Š” ์–ด๋–ค ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๊ธธ๋ž˜ ๊ตํ™˜์„ ํ•ด์•ผํ• ๊นŒ?”

๋‚ด๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฏธ๋””์–ด๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์„ค๋ช…์„œ์ž…๋‹ˆ๋‹ค.

WebRTC์—์„œ ํ”ผ์–ด ๊ฐ„ ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฆฝํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐ์ž์˜ ํ™˜๊ฒฝ๊ณผ ๋Šฅ๋ ฅ์„ ๋ฌธ์„œ ํ˜•ํƒœ๋กœ ์ •๋ฆฌํ•ด์„œ ์„œ๋กœ ๊ตํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

{
	"sdp" : "...", // ์„ธ์…˜ ์„ค๋ช… ๋ฌธ์ž์—ด
	"type": "offer" // ๋˜๋Š” "answer"
}

RTCPeerConnection์˜ createOffer() ๋˜๋Š” createAnswer() ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ ์ž์‹ ์˜ SDP๋ฅผ ์ƒ์„ฑํ•˜๋ฉด sdp์™€ type ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

v=0 
o=- 2011585323452908947 2 IN IP4 127.0.0.1 
s=-
t=0 0 
a=group:BUNDLE 0 1
a=extmap-allow-mixed
a=msid-semantic: WMS f5471704-1d3a-4ee9-904d-88c34dd79e39 
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126 
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:OrFD 
a=ice-pwd:8+5g70q/An4QYpxFt9XxErsN 
a=ice-options:trickle 
a=fingerprint:sha-256 CF:06:5C:E1:57:D0:C1:B4:13:72:25:85:57:C6:36:7E:CC:E2:67:44:DA:DD:5F:E9:A5:19:52:5F:3C:6E:A9:5B 
a=setup:actpass 
a=mid:0 
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level 
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=sendrecv
a=msid:f5471704-1d3a-4ee9-904d-88c34dd79e39 c9076eae-d8c4-4535-b702-ab5ee80b0781 // WebRTC์—์„œ media stream๊ณผ track ์‹๋ณ„์ž ์ง€์ •
a=rtcp-mux 
a=rtcp-rsize
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc 
a=fmtp:111 minptime=10;useinbandfec=1 
.
.
.

์œ„ ๋ฐ์ดํ„ฐ๋Š” ์ƒ์„ฑํ•œ SDP ๋ฐ์ดํ„ฐ ์ผ๋ถ€๋ฅผ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ๋ฏธ๋””์–ด๋ฅผ, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ, ์–ด๋–ค ์ฝ”๋ฑ์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ธฐ์ˆ ํ•œ ์ •๋ณด ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

 

“์™œ ๊ฐ์ž์˜ SDP ๋ฅผ ๊ตํ™˜ํ•ด์•ผํ• ๊นŒ”

๊ฐ ํ”ผ์–ด์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ, NAT, ์ฝ”๋ฑ ์ง€์›, ํŠธ๋ž™ ๊ฐœ์ˆ˜ ๋“ฑ ๋‹ค๋ฅธ ํ™˜๊ฒฝ ์ž…๋‹ˆ๋‹ค. ์„œ๋กœ ์–ด๋–ค ์กฐ๊ฑด์œผ๋กœ ๋ฏธ๋””์–ด๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ•ฉ์˜ํ•˜๊ธฐ ์œ„ํ•ด offer(caller์˜ SDP)์™€ answer(callee์˜ SDP)๋ฅผ ์ฃผ๊ณ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • offer(SDP): Caller๊ฐ€ ์ž์‹ ์˜ ์กฐ๊ฑด์„ ๋จผ์ € ์ œ์•ˆ
  • answer(SDP): ๋ฐ›์€ offer์— ๋Œ€ํ•ด์„œ Callee๊ฐ€ ์ด๋ฅผ ์ˆ˜์šฉํ•˜๊ฑฐ๋‚˜ ์กฐ์ •ํ•ด์„œ ์‘๋‹ต

์–‘์ชฝ์ด ์„œ๋กœ ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•œ ์กฐ๊ฑด์— ํ•ฉ์˜ํ•˜๋ฉด ICE Candidate ๊ตํ™˜์„ ํ†ตํ•ด ์‹ค์ œ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฆฝํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

ICE Candidate (Interactive Connectivity Establishment)

P2P ์—ฐ๊ฒฐ์„ ๋งบ๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ๊ฒฝ๋กœ ํ›„๋ณด(IP:PORT)๋ฅผ ๋‚˜์—ดํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค.

 

"candidate:1025593763 1 udp 2122260223 192.168.0.44 51935 typ host generation 0 ufrag JuFu network-id 1 network-cost 10"

์œ„ ๋ฐ์ดํ„ฐ๋Š” ์‹ค์ œ ์ˆ˜์ง‘ํ•œ ICE Candidate ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

 

์—ฐ๊ฒฐ ์œ ํ˜•, IP ์ฃผ์†Œ, PORT ๋ฒˆํ˜ธ, ์šฐ์„ ์ˆœ์œ„, ์ „์†ก ๋ฐฉ์‹ ๋“ฑ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ํ”ผ์–ด๋Š” ๋กœ์ปฌ IP, STUN, TURN ๋“ฑ์—์„œ ๋‹ค์–‘ํ•œ ํ›„๋ณด ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋Œ€๋ฐฉ๊ณผ ์ง์ ‘ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ํ›„๋ณด๋ฅผ ์„œ๋กœ์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ›„๋ณด๋“ค์„ ๋ฐ›์€ ๋’ค, ๊ฐ€์žฅ ์›ํ™œํ•œ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•ด ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฆฝํ•ฉ๋‹ˆ๋‹ค.

 

์„œ๋กœ์˜ SDP๋งŒ ์ฃผ๊ณ  ๋ฐ›์•˜๋‹ค๋ฉด ์—ฐ๊ฒฐ ๋ฐฉ์‹์€ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ์–ด๋””๋กœ ์—ฐ๊ฒฐํ• ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ICE Candidate๋งŒ ์žˆ์œผ๋ฉด ์–ด๋””๋กœ ์—ฐ๊ฒฐํ•˜์ง€๋Š” ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ, ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ• ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ์—๋Š”, ์—ฐ๊ฒฐํ•˜๊ธธ ์›ํ•˜๋Š” ํ”ผ์–ด ๊ฐ„ SDP์™€ ICE Candidate ๊ฐ€ ๋‘˜ ๋‹ค ์ •์ƒ ๊ตํ™˜ ๋˜์–ด์•ผ ์•ˆ์ •์ ์ธ ํ™”์ƒ์ฑ„ํŒ…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

STUN / TURN

์•ž์—์„œ ICE Candidate๋Š” “P2P ์—ฐ๊ฒฐ์„ ๋งบ๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ๊ฒฝ๋กœ ํ›„๋ณด(IP:PORT)๋ฅผ ๋‚˜์—ดํ•œ ์ •๋ณด”๋ผ๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ํ›„๋ณด๋“ค์€ ์–ด๋–ป๊ฒŒ, ์–ด๋””์„œ ์ˆ˜์ง‘๋˜๋Š” ๊ฑธ๊นŒ์š”?

๋ฐ”๋กœ STUN๊ณผ TURN ์„œ๋ฒ„์˜ ๋„์›€์„ ๋ฐ›์•„์•ผ ๊ฐ€๋Šฅํ•œ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

 

“STUN์ด ๋ญ์ฃ ? ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋‚˜์š”?”

STUN (Session Traversal Utilities for NAT)๋Š” ์ž์‹ ์„(NAT ๋’ค์— ์ˆจ์–ด์žˆ๋Š” ์ผ๋ฐ˜ ์œ ์ €) ์™ธ๋ถ€(NAT ๊ฐ€ ๋…ธ์ถœํ•œ ๊ณต์ธ IP:PORT)์—์„œ ๋ดค์„ ๋•Œ ์–ด๋–ค IP์™€ ํฌํŠธ๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

 

์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ๋Œ€๋ถ€๋ถ„ NAT ๋’ค์— ์žˆ์–ด์„œ ๋‚ด๋ถ€ IP๋งŒ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ: 192.168.x.x). WebRTC ์—ฐ๊ฒฐ์„ ์œ„ํ•ด์„  ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ๊ณต์ธ IP:PORT ์ •๋ณด๋ฅผ ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ STUN ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์™ธ๋ถ€ ๊ธฐ์ค€์˜ IP:PORT๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

 

STUN์€ ๋ณ„๋‹ค๋ฅธ ์ธ์ฆ ์—†์ด public STUN ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ตฌ์ถ•ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๋ง์ด ๋˜๊ฒ ๋„ค์š”. ๋น„๊ต์  ๋ฆฌ์†Œ์Šค ๋ถ€๋‹ด์ด ์ ๊ณ  ๋ฌด์ƒ ์ œ๊ณต์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” STUN ์„œ๋ฒ„๋Š” stun.l.google.com:19302 ์ด๊ณ , ๋‹ค๋ฅธ ์„œ๋“œ ํŒŒํ‹ฐ STUN ์„œ๋ฒ„๋“ค๋„ ์—ฌ๋Ÿฟ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

“STUN๋งŒ ์žˆ์œผ๋ฉด ๋  ๊ฒƒ ๊ฐ™์€๋ฐ, TURN ์€ ๋˜ ๋ญ์ฃ ? ์ด๊ฑด ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋‚˜์š”?”

STUN ์„ ํ†ตํ•œ ์™ธ๋ถ€ ๋…ธ์ถœ IP:PORT ๋ฅผ ์–ป๋Š” ์—ฐ๊ฒฐ ์ž์ฒด๋ฅผ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ๋ฐฉํ™”๋ฒฝ ์ด์Šˆ, ๋Œ€์นญ NAT ๊ตฌ์กฐ๋กœ ์ธํ•ด ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ, ์ตœํ›„์˜ ์ˆ˜๋‹จ์ด TURN (Traversal Using Relays around NAT) ์ž…๋‹ˆ๋‹ค.

 

๐Ÿค” ๋Œ€์นญ NAT๋ž€?

๋Œ€์นญ NAT๋Š” ๋งคํ•‘ํ•œ ๊ณต์ธ IP:PORT๋ฅผ ํŠน์ • ๋ชฉ์ ์ง€์— ํ•œ์ •ํ•ฉ๋‹ˆ๋‹ค.
STUN์„ ํ†ตํ•ด์„œ ๋…ธ์ถœ๋œ ๊ณต์ธ IP:PORT์Œ์„ ์•Œ์•„๋ƒˆ๋‹ค๊ณ  ํ•ด๋„, ํ•ด๋‹น IP:PORT๋Š” STUN์„ ์œ„ํ•œ ์ฃผ์†Œ์ด๊ณ  STUN์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ฃผ์†Œ์ง€์—์„œ STUN์„ ํ†ตํ•ด ์–ป์€ ๊ณต์ธ IP:PORT ๋กœ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋ฉด NAT๋Š” ํ•ด๋‹น ์ฃผ์†Œ์˜ ์š”์ฒญ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด, ๋Œ€์นญ NATํ™˜๊ฒฝ์—์„  STUN์œผ๋กœ ์–ป์€ IP:PORT๋Š” "STUN์˜ ์š”์ฒญ๋งŒ" ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ, ํ•ด๋‹น ์ฃผ์†Œ๋กœ STUN์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ์„ ์‹œ๋„ํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

TURN์€ STUN์œผ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐ์ด ์•ˆ ๋˜๋ฉด, ์ค‘๊ณ„ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

TURN ์„œ๋ฒ„๋Š” ์ž์‹ ์˜ IP์™€ ํฌํŠธ๋ฅผ ์ž„๋Œ€ํ•ด์ฃผ๊ณ , ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ์ค‘๊ฐ„์—์„œ ๋Œ€์‹  ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐ์ด ์ˆ˜๋ฆฝ๋˜๊ณ  ํ™”์ƒ์ฑ„ํŒ…์„ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด, ์‹ค์ œ๋กœ P2P๊ฐ€ ์•„๋‹Œ TURN ๊ฒฝ์œ ํ•œ ํ˜•ํƒœ๋กœ ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ์„ ์ฃผ๊ณ  ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ P2P ์—ฐ๊ฒฐ์€ ์‹คํŒจํ–ˆ์ง€๋งŒ, ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜๋Š” ์•ˆ์ •์ ์ธ ์—ฐ๊ฒฐ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š”๊ฑฐ์ฃ .

 

TURN์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ตฌ์ถ•ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์„ ๋•, ์˜คํ”ˆ ์†Œ์Šค์ธ coturn ์„ ๋”ฐ๋กœ ๋ฐฐํฌํ•˜์—ฌ ์ตœํ›„์˜ ์ˆ˜๋‹จ์ธ ๋ฆด๋ ˆ์ด ์—ฐ๊ฒฐ์ด ์ˆ˜ํ–‰๋˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. coturn ์„ ์ง์ ‘ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ ๋ง๊ณ ๋„ ์œ ์šฉํ•œ ๊ธฐ์ˆ ๋“ค์ด ๋งŽ์€ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์œผ๋‹ˆ, ์‹ค์ œ ์„œ๋น„์Šค์— ์ ์šฉํ•˜๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด ํ•œ ๋ฒˆ ์ฐพ์•„๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿ™‚

 

 

๊ทธ๋Ÿผ ์ด์ œ, WebRTC์˜ P2P ํ™”์ƒ์ฑ„ํŒ… ์—ฐ๊ฒฐ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๊ด€๋ จ ํ‚ค์›Œ๋“œ Signaling, NAT, SDP, ICE Candidate, STUN/TURN์„ ์•Œ๊ฒŒ๋์œผ๋‹ˆ, ๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์˜ ํ™”์ƒ์ฑ„ํŒ…์„ ์œ„ํ•œ ์—ฐ๊ฒฐ ๊ณผ์ •์„ ์™„์„ฑ๋œ ๊ทธ๋ฆผ์œผ๋กœ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋จผ์ € STUN ์œผ๋กœ ์–ป์€ ICE Candidate๋กœ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ, Signaling์˜ ํ๋ฆ„์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์ด Signaling Server๋ฅผ ํ†ตํ•ด์„œ SDP๋ฅผ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • caller์˜ SDP = offer
    • callee์˜ SDP = answer
  2. ๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์ด ์„œ๋“œ ํŒŒํ‹ฐ์˜ STUN ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ICE Candidate๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฐ๊ฐ STUN์„ ํ†ตํ•ด ์ˆ˜์ง‘ํ•œ ICE Candidate๋ฅผ Signaling Server ๋ฅผ ํ†ตํ•ด ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์€ ๊ตํ™˜ํ•œ ICE Candidate๋ฅผ ํ†ตํ•ด P2P ์—ฐ๊ฒฐ์— ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

STUN๋งŒ์œผ๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅ ํ•œ ์ƒํ™ฉ์—์„œ TURN์˜ ๋„์›€์„ ๋ฐ›๋Š” Signaling์˜ ํ๋ฆ„์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์ด Signaling Server๋ฅผ ํ†ตํ•ด์„œ SDP(caller๋Š” offer, callee๋Š” answer) ๋ฅผ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์ด ์„œ๋“œ ํŒŒํ‹ฐ์˜ STUN ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ICE Candidate๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฐ๊ฐ STUN์„ ํ†ตํ•ด ์ˆ˜์ง‘ํ•œ ICE Candidate๋ฅผ SDP์ฒ˜๋Ÿผ Signaling Server ๋ฅผ ํ†ตํ•ด ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋•Œ, ์„œ๋กœ ์ฃผ๊ณ ๋ฐ›์€ STUN ๊ธฐ๋ฐ˜ ICE Candidate๋กœ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
  4. ๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ตฌ์ถ•ํ•œ TURN ์„œ๋ฒ„๋ฅผ ํ™œ์šฉํ•˜์—ฌ ICE Candidate๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
    • TURN์„ ํ†ตํ•ด ์ˆ˜์ง‘ํ•œ ICE Candiate๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์‹ค์ƒ P2P๊ฐ€ ์•„๋‹Œ TURN์„ ๊ฒฝ์œ ํ•˜๋Š” ์—ฐ๊ฒฐ์ด ์„ค๋ฆฝ๋ฉ๋‹ˆ๋‹ค.
  5. ๊ฐ๊ฐ TURN์„ ํ†ตํ•ด ์ˆ˜์ง‘ํ•œ ICE Candidate๋ฅผ Signaling Server ๋ฅผ ํ†ตํ•ด ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  6. ๋šฑ์ด์™€ ์Šคํฐ์ง€๋ฐฅ์€ TURN ์˜ ICE Candidate๋ฅผ ํ†ตํ•ด, P2P๊ฐ€ ์•„๋‹Œ relay ๊ธฐ๋ฐ˜ ์—ฐ๊ฒฐ์— ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๐Ÿงน ํ•ต์‹ฌ ์ •๋ฆฌ


  • WebRTC: P2P ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ๊ธฐ์ˆ 
  • Signaling: WebRTC ์—ฐ๊ฒฐ ์ „์— ํ•„์š”ํ•œ SDP์™€ ICE Candidate ๊ตํ™˜
  • SDP: ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฏธ๋””์–ด๋ฅผ ์†ก์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์„ค๋ช…์„œ
  • ICE Candidate: ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” IP:PORT ํ›„๋ณด ๋ชฉ๋ก
  • STUN: ์ž์‹ ์˜ ๊ณต์ธ IP์™€ PORT ์‹๋ณ„
  • TURN : P2P ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ ์ค‘๊ณ„ ์„œ๋ฒ„ ์—ญํ• 

 

 

 

๐Ÿ‘‹๐Ÿป ๋งˆ์น˜๋ฉฐ


์ง€๊ธˆ๊นŒ์ง€ WebRTC์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ๋™์ž‘ ์›๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ์—ฐ๊ฒฐ ๊ณผ์ •๊นŒ์ง€ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ด๋ก ์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ ์‹ค์Šต์„ ์›ํ•˜์‹ ๋‹ค๋ฉด ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ํ™•์ธํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์‹ค์Šต์€ WebRTC & ์Šคํ”„๋ง๋ถ€ํŠธ & ๋ฆฌ์•กํŠธ ๊ธฐ๋ฐ˜ 1๋Œ€ 1 ํ†ตํ™”๊ธฐ๋Šฅ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค

 

 

 

[WebRTC] WebRTC ํ™”์ƒ์ฑ„ํŒ… ์‹ค์Šต (SpringBoot + React)

๐ŸŽ† Preview ๐Ÿ“– ๊ฐœ์š”๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค.WebRTC ์ด๋ก ์— ์ด์–ด์„œ ํ™”์ƒ ์ฑ„ํŒ… ์‹ค์Šต์„ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. [WebRTC] WebRTC ์ฐข์–ด๋ฒ„๋ฆฌ๊ธฐ - ์ด๋ก  ์ •๋ฆฌ๐Ÿ“– ๊ฐœ์š”๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. WebRTC ๊ด€๋ จ ๊ธ€์ด ์ €์˜ ์ฒซ ํฌ์ŠคํŒ…์ด ๋˜์—ˆ๋„ค์š”. ์ด ๋‚ด

phellinus-linteus.tistory.com

 

 

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ถ๊ธˆํ•œ ์ ์— ๋Œ€ํ•œ ์งˆ๋ฌธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

๋ถ€์กฑํ•œ, ์ž˜๋ชป๋œ ์„ค๋ช…์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ™๐Ÿป

 

 

 

๐Ÿ“š Reference


 

Network address translation - Wikipedia

From Wikipedia, the free encyclopedia Technique for traversing IP address spaces without routing Network address translation between a private network and the Internet Network address translation (NAT) is a method of mapping an IP address space into anothe

en.wikipedia.org

 

BlogGeek.me | The leading authority on WebRTC

The leading authority on CPaaS & WebRTCKeep up and be up to speed on the world of communications, WebRTC and CPaaSWebRTC for Business People ('25 Edition)Get reportFreeGet reportFreeTop 7

bloggeek.me

 

WebRTC

An open framework for the web that enables Real-Time Communications (RTC) capabilities in the browser.

webrtc.org

 

'DrillDown > WebRTC' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[WebRTC] WebRTC ํ™”์ƒ์ฑ„ํŒ… ์‹ค์Šต (SpringBoot + React)  (0) 2025.05.30
'DrillDown/WebRTC' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [WebRTC] WebRTC ํ™”์ƒ์ฑ„ํŒ… ์‹ค์Šต (SpringBoot + React)
ian_0430
ian_0430
๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ
  • ian_0430
    BenchPress200
    ian_0430
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (8)
      • ํšŒ๊ณ  (0)
      • ๋ฐฑ์ค€ & ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (1)
      • DrillDown (5)
        • Spring (2)
        • MySQL (1)
        • Java (0)
        • WebRTC (2)
        • SystemDesign (0)
      • Computer Science (1)
        • Network (0)
        • DataStructure (0)
        • Algorithm (0)
        • Database (1)
        • OperatingSystem (0)
      • ๊ธฐํƒ€ (1)
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๊ฒฉ๋ฆฌ์ˆ˜์ค€
    11659๋ฒˆ
    Spring
    ๋ฆฌ์•กํŠธ
    ๊ฒฉ๋ฆฌ ์ˆ˜์ค€
    max-connections
    11659
    min-spare
    ํŒฌํ…€๋ฆฌ๋“œ
    accept-count
    webrtc
    ๋ฐฑ์ค€ 11659๋ฒˆ
    react
    ์Šคํ”„๋ง ๋ถ€ํŠธ ์“ฐ๋ ˆ๋“œ
    ์Šคํ”„๋ง๋ถ€ํŠธ
    REPEATABLE READ
    ์›น์•Œํ‹ฐ์”จ
    ์Šคํ”„๋ง
    Isolation level
    ํ†ฐ์บฃ ์“ฐ๋ ˆ๋“œ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
ian_0430
[WebRTC] WebRTC ์ฐข์–ด๋ฒ„๋ฆฌ๊ธฐ - ์ด๋ก  ์ •๋ฆฌ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”