๐Ÿ“Œ ์ด ๊ธฐ์ˆ ์„ ๊ณต๋ถ€ํ•œ ๊ณ„๊ธฐ!

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

๊ทธ๋Ÿฐ๋ฐ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐฑ์—”๋“œ ์ž…์žฅ์—์„œ ๊ตฌํ˜„ํ•ด์•ผํ•  ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋Š” ๋ฐ, ๋ฐฑ์—”๋“œ๋Š” ๋ญ˜ ํ•ด์•ผ์ค˜์•ผ ํ•˜๋Š” ์ง€๋ถ€ํ„ฐ ๋ชฐ๋ผ์„œ ๋งŽ์ด ํ—ท๊ฐˆ๋ ธ๋‹ค. ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ๋ฐฑ์—”๋“œ๋Š” WebRTC์— ํ•„์š”ํ•œ ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ๋˜์—ˆ๊ณ  ๋”ฐ๋กœ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค (๋ฐฑ์—”๋“œ ์ž…์žฅ์—์„œ๋งŒ ์ •๋ฆฌ)

 


๐Ÿ“WebRTC Signaling ์„œ๋ฒ„๋ฅผ ์„ค๋ช…ํ•˜๋ ค๋ฉด.. 

์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๋ฅผ ์†Œ๊ฐœํ•˜๋ ค๋ฉด WebRTC๋ฅผ ์†Œ๊ฐœํ•ด์•ผํ•˜๊ณ , WebRTC๋ฅผ ์†Œ๊ฐœํ•˜๋ ค๋ฉด Websocket์„ ์†Œ๊ฐœํ•ด์•ผํ•˜๊ณ , Websocket์„ ์†Œ๊ฐœํ•˜๋ ค๋ฉด HTTP๋ฅผ ์•Œ์•„์•ผํ•œ๋‹ค. 

 

HTTP๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„๊ฐ€ ์†Œํ†ตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๋กœ ์ธํ„ฐ๋„ท ๋ฐ์ดํ„ฐ ๊ตํ™˜์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ Http๋Š” ์š”์ฒญ ๋ฐฉ์‹์„ ๋ณด๋ฉด ๋‹จ๋ฐฉํ–ฅ์ด๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๊ณ  ๊ทธ๋ฆฌ๊ณ  ๋!

์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€๋„ ์•Š๊ณ  ๊ธˆ๋ฐฉ ์šฐ๋ฆฌ๊ฐ€ ๋ญํ–ˆ๋Š”์ง€๋„ ์žŠ์–ด๋ฒ„๋ฆฌ๋Š” stateless ๋ฌด์ƒํƒœ๋กœ ๋Œ์•„๊ฐ„๋‹ค. ์‹ฌ์ง€์–ด ๋ธŒ๋ผ์šฐ์ €์˜ ์š”์ฒญ์—๋งŒ ๋ฐ˜์‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ๋ฐ˜ํ–ฅ์ด๋ผ ์‹ค์‹œ๊ฐ„์— ์ ํ•ฉํ•˜์ง€ ์•Š์•„ ๋ญ๊ฐ€ ์ƒˆ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ–ˆ๋Š”์ง€ ๋ณด๋ ค๋ฉด ๊ณ„-์† ๋ญ๊ฐ€ ์ƒˆ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ˆ ํ•˜๋ฉด์„œ ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•ด์•ผํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์‹ค์‹œ๊ฐ„์„ฑ์— HTTP๊ฐ€ ์ ํ•ฉํ•˜์ง€ ์•Š์ž Websocket์ด ๋“ฑ์žฅํ–ˆ๋‹ค.
Websocket์€ ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„๊ฐ„์˜ ์—ฐ๊ฒฐ์ด ์œ ์ง€ํ•œ๋‹ค. ์„œ๋กœ ๊ณ„์† ์—ฐ๊ฒฐํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ํ†ต์‹ ์ด๋ผ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฌผ๋ก ์ด๊ณ  ์„œ๋ฒ„๋„ ์š”์ฒญ์—†์ด ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋ฐ”๋กœ๋ฐ”๋กœ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ  ๊ทธ ์—ฐ๊ฒฐ์€ ๋ˆ„๊ตฐ๊ฐ€ ๋Š๊ธฐ ์ „๊นŒ์ง€ ๊ณ„์† ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์›น์†Œ์ผ“๋„ ์ค‘๊ฐœ์ž์ธ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์„œ๋ฒ„๊ฐ€ ์ผ์ผ์ด ์ƒ๋Œ€๋ฐฉ์„ ํฌ์›Œ๋”ฉํ•ด์„œ ๋‚ด์šฉ์„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์ „๋‹ฌํ•ด์•ผํ•˜๋‹ค ๋ณด๋‹ˆ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ, ๋น„์šฉ๋“ฑ์˜ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

๊ทธ๋Ÿผ ์ค‘๊ฐœ์ž๊ฐ€ ์—†์–ด์ง€๊ณ  ๋ธŒ๋ผ์šฐ์ €๋“ค ๋ผ๋ฆฌ๋งŒ ์—ฐ๊ฒฐํ•˜๋ฉด ์–ด๋–จ๊นŒ?
์ด๊ฒŒ ๋ฐ”๋กœ WebRTC๊ฐ€ ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ด๋ฆ„๋„ Web Real Time Communication์˜ ์•ฝ์ž์ธ ์ด์œ ๊ฐ€ ์„œ๋ฒ„ ์—†์ด ์„œ๋กœ ๋ฉ”์„ธ์ง€, ์Œ์„ฑ, ์˜์ƒ๋“ฑ์„ ์ฃผ๊ณ  ๋ฐ›์•„ ์ค‘๊ฐœ์ž์ธ ์„œ๋ฒ„๊ฐ€ ์—†์œผ๋‹ˆ ์†๋ ฅ์ด ๋นจ๋ผ ์‹ค์‹œ๊ฐ„์— ์ ํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๐Ÿ“WebRTC (Web Real-Time Communication) ๋ž€?

์›น๊ณผ ์•ฑ์—์„œ ๋ณ„ ๋‹ค๋ฅธ ๋“œ๋ผ์ด๋ฒ„๋‚˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—†์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์–ด ์นด๋ฉ”๋ผ์™€ ๋งˆ์ดํฌ๋ฅผ ์‚ฌ์šฉํ•ด P2P(Peer to Peer) ์‹ค์‹œ๊ฐ„ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ๊ฐ€๋Šฅ์„ ํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ 

 

WebRTC๋Š” ๋ณ„๊ฐœ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜๋Š” ๋“ฑ์˜ ๊ท€์ฐฎ์€ ์ž‘์—…๋„ ํ•„์š”์—†์ด ๋ธŒ๋ผ์šฐ์ €๋งŒ ์žˆ์œผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๋‹ค.
๊ฒŒ๋‹ค๊ฐ€ ์„œ๋ฒ„๋Š” ๊ณ„์† ์ „๋‹ฌํ•ด์ค˜์•ผ ํ•˜๋Š” ์—ญํ• ์—์„œ ๋น ์ง€๋‹ˆ ์„œ๋ฒ„๊ฐ€ ๊ฐ€์ ธ์•ผํ•˜๋Š” ๋ถ€๋‹ด์ด ์ค„์–ด ์ข‹๋‹ค. 

๊ทธ๋Ÿผ ์ž ๊น ์—ฌ๊ธฐ์„œ ์„œ๋ฒ„๊ฐ€ ํ• ์ผ์ด ์—ฌ๊ธฐ์„œ ์–ด๋”˜๋ฐ? 

๋ฐ”๋กœ WebRTC ์‹œ์ž‘์ง€์ ์—์„œ ์„œ๋ฒ„๊ฐ€ ํ•ด์ค˜์•ผ ํ• ์ผ์ด ์žˆ๋‹ค.  WebRTC๋Š” ๊ทธ๋ƒฅ ์ด๋ค„์ง€๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ฒ˜์Œ์œผ๋กœ ์„œ๋กœ์— ๋Œ€ํ•ด ์†Œ๊ฐœ๋ฅผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๊ณ ,  ์ด ๋ถ€๋ถ„์— ์žˆ์–ด์„œ๋Š” ์„œ๋ฒ„๊ฐ€ ์ค‘๊ฐœ์ž๋กœ์„œ์˜ ์—ญํ• ์„ ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๋ผ๊ณ  ํ•œ๋‹ค.

 

๐Ÿ“WebRTC์— ํ•„์š”ํ•œ ์‹œ๊ทธ๋„๋ง(Signalling) ์ด๋ž€?

์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ์— ์žˆ๋Š” ๋ฏธ๋””์–ด ํฌ๋งท ๋“ฑ์„ ์ƒํ˜ธ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด ํ˜‘์˜ ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š” ๋ฐ ์ด๋ฅผ ์‹œ๊ทธ๋„๋ง ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ ๋ณ€ํ™˜ ๋ฐ ๋ฐฉํ™”๋ฒฝ์— ๋Œ€์‘ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ํ˜‘์˜๊ณผ์ •์—์„œ ์ค‘๊ฐ„ ๋‹จ๊ณ„ ์—ญํ• ์„ ํ•˜๋Š” ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๋ฅผ ๋ฐฑ์—”๋“œ๊ฐ€ ๊ตฌํ˜„ํ•ด์ค˜์•ผํ•œ๋‹ค!

 

 

๐Ÿ“WebRTC ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„์˜ "๋Œ€๋žต์ ์ธ" ํ๋ฆ„์„ ๋งŒํ™”๋กœ ๊ทธ๋ ค๋ด„!

 

 

๐Ÿ“ ์‹œ๊ทธ๋„๋ง ๋‹ค์ด์–ด๊ทธ๋žจ

https://github.com/satanas/simple-signaling-server

 

 

๐Ÿ“ ์šฉ์–ด ์„ค๋ช…

 

โœ’ WebSocket

๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›ํ•˜๋Š” API ์ข…๋ฅ˜๋กœ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๋ฉ”์„ธ์ง€ ๊ตํ™˜์„ ์œ„ํ•œ ํ†ต์‹  ๊ทœ์•ฝ (ํ”„๋กœํ† ์ฝœ). ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ๋ฒˆ Request/Response๋ฅผ ๋ณด๋‚ด๋ฉด ์‚ฌ๋ผ์ง€๋Š” HTTP์˜ stateless ์†์„ฑ๊ณผ ๋‹ฌ๋ฆฌ ์—ฐ๊ฒฐ์ง€ํ–ฅ ์–‘๋ฐฉํ–ฅ ์ „์ด์ค‘ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ ํ”„๋กœํ† ์ฝœ๋กœ ์—ฐ๊ฒฐ์„ ์ง€์†ํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ์ฃผ๋กœ ๋ฐ์ดํ„ฐ์˜ ๋น ๋ฅธ ์—…๋ฐ์ดํŠธ, ์‹ค์‹œ๊ฐ„์„ ์œ„ํ•ด ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. 

 

โœ’ Session

๋ธŒ๋ผ์šฐ์ €(ํด๋ผ์ด์–ธํŠธ)์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น์„œ๋ฒ„์— ์ ‘์†ํ•œ ์‹œ์ ๋ถ€ํ„ฐ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ๋๋‚ผ ๋•Œ๊นŒ์ง€ ๊ฐ™์€ ์‚ฌ์šฉ์ž๋กœ ๋ถ€ํ„ฐ ์˜ค๋Š” ์š”์ฒญ์„ ํ•˜๋‚˜์˜ ์ƒํƒœ๋กœ ๋ณด๋ฉด์„œ, ๊ทธ ์ƒํƒœ๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ธฐ์ˆ .  ์›น ์„œ๋น„์Šค์—์„œ ๋ธŒ๋ผ์šฐ์ € ๋‹น ํ•˜๋‚˜์˜ Session์„ ๊ฐ–๋Š”๋‹ค.

 

โœ’ offer ์™€ answer

WebRTC ๋ฉ”์„ธ์ง€๋Š” ์•„๋‹ˆ์ง€๋งŒ SDP๋ผ๋Š” ํฌ๋งท์œผ๋กœ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋จผ์ € offer(์ œ์•ˆ)๋ฅผ ๋ณด๋‚ด๋ฉด ์ด์— ๋Œ€ํ•œ ๋Œ€๋‹ต์œผ๋กœ answer(์‘๋‹ต)๋ฅผ ๋ณด๋‚ด๋ฉฐ ์„œ๋กœ SDP๋ฅผ ๊ตํ™˜ํ•œ๋‹ค. 

 

โœ’ SDP (Session Description Protocol)

Peer๊ฐ€ ๊ฐ€์ง„ ์„ธ์…˜์˜ ์ •๋ณด๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. 

ํฌํ•จ๋œ ์ •๋ณด
SDP๋ฅผ ์ƒ์„ฑํ•œ Peer์˜ ์‹๋ณ„์ž (์œ ์ €์ด๋ฆ„, ์„ธ์…˜์•„์ด๋””, ์„ธ์…˜ ๋ฒ„์ ผ, ๋„คํŠธ์›Œํฌ ํƒ€์ž…, ์ฃผ์†Œ ํƒ€์ž…, ์œ ๋‹ˆ์บ์ŠคํŠธ ์ฃผ์†Œ ๋“ฑ),
๋ฏธ๋””์–ด๋ผ์ธ (๋ฏธ๋””์–ด ํƒ€์ž…(์Œ์„ฑ์ธ์ง€ ์˜์ƒ์ธ์ง€๋“ฑ), ํฌํŠธ ๋ฒˆํ˜ธ, ๋ฏธ๋””์–ด ํ˜•์‹(์ฝ”๋ฑ) ๋“ฑ),
์‹ค์‹œ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ์ฃผ๊ณ  ๋ฐ›์„ IP, RTCP์— ์‚ฌ์šฉ๋  IP, ICE ํŒŒ๋ผ๋ฏธํ„ฐ, DTLS ํŒŒ๋ผ๋ฏธํ„ฐ, BUNDLEํ–‰์— ์‚ฌ์šฉ๋˜๋Š” ์‹๋ณ„์ž,
๋ฐด๋“œ์œ„๋“œ์Šค, ๋ฏธ๋””์–ด ๋ฐฉํ–ฅ, opus ์ฝ”๋ฑ ๋“ฑ๋“ฑ

 

โœ’ ICE (Interactive Connectivity Establishment) candidate

์›น ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์˜ ์ง์ ‘์ ์ธ Peer to Peer๋ฅผ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ. SDP๊ฐ€ ๋ฏธ๋””์–ด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ค€๋‹ค๋ฉด ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๊ฒƒ์„ ICE candidate๋ผ๊ณ  ํ•œ๋‹ค. ๊ฐ๊ฐ์˜ Peer๋Š” ๊ฐ€์žฅ ์ข‹์€ ํ›„๋ณด์—์„œ ๋‚˜์œ ํ›„๋ณด ์ˆœ์„œ๋กœ ์ œ์•ˆํ•˜๋ฉฐ ์„œ๋กœ๊ฐ€ ๋งž๋Š” ์ตœ์ ์˜ ์ฃผ์†Œ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.

 

 

๐Ÿ“ ๊ตฌํ˜„ ์ฝ”๋“œ

 

GitHub - littlezero48/Study-Storage: ๐Ÿ“’ ๋‹ค์–‘ํ•œ ๊ณต๋ถ€ ํ”์ ์„ ๋‚จ๊ธฐ๋Š” ๊ณณ

๐Ÿ“’ ๋‹ค์–‘ํ•œ ๊ณต๋ถ€ ํ”์ ์„ ๋‚จ๊ธฐ๋Š” ๊ณณ. Contribute to littlezero48/Study-Storage development by creating an account on GitHub.

github.com

 

 


์ฐธ๊ณ  ์ž๋ฃŒ:

 

[WebRTC] Signaling Server ( ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„ )

WebRTC์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ดค๋Š”๋ฐ WebRTC๋ฅผ ์œ ๊ธฐ์ ์œผ๋กœ ์ž˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค. Signaling - Always needed NAT Traversal - need for production Media - depends on the app ์ด๋ฒˆ ํฌ์ŠคํŠธ๋Š” Sign

withseungryu.tistory.com

 

WebRTC ์—ฐ๊ฒฐ์„ฑ ๋ฐ NAT ํ†ต๊ณผ ๊ธฐ๋ฒ•

WebRTC Connectivity and NAT Traversal

lovejaco.github.io

 

+ Recent posts