Skip to content

๐Ÿชต 2. ์–‘๋ฐฉํ–ฅ ์›น ํ†ต์‹ ์˜ ์ง„ํ™”: HTTP๋Š” ๋ฐ”๋ณด~

Taeyeon Yoon edited this page Dec 5, 2024 · 1 revision

image

์ด๋ฒˆ์— ์›น ํ™˜๊ฒฝ์—์„œ์˜ ํด๋ผ์ด์–ธํŠธ - ์„œ๋ฒ„ ๊ฐ„ ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•  ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒจ์„œ ํ•™์Šตํ•˜๋ ค๊ณ  ํ•˜๋Š” ์™€์ค‘์—, ๋จผ์ € ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์— ๋Œ€ํ•ด ์‹ฌ๋„ ์žˆ๋Š” ๋ฐฐ๊ฒฝ๊ณผ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•ด ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.


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

HTTP์˜ ํ•œ๊ณ„์™€ ํ•ด๊ฒฐ ์‹œ๋„

์ด ๊ธ€์—์„  HTTP๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์กฐ๊ฑด์„ ์ „์ œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜น์—ฌ๋‚˜ ๋ชจ๋ฅธ๋‹ค๋ฉด ์ด์ „์— ๋„คํŠธ์›Œํฌ ๊ฐ„๋žตํ•œ ์ •์˜ : IP, TCP/UDP, HTTP(S)์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์ฝ๊ณ  ์˜ค์‹œ๋Š” ๊ฑธ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

HTTP ํ†ต์‹ ์˜ ๊ตฌ์กฐ์  ํ•œ๊ณ„

๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์•ฝ์ธ HTTP/1.1์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋น„์—ฐ๊ฒฐ์„ฑ(Connectionless)

์š”์ฒญ-์‘๋‹ต ํ›„ ์—ฐ๊ฒฐ ์ข…๋ฃŒ.

HTTP/1.1์€ ์š”์ฒญ์ด ์˜ค๋ฉด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ ํ›„ ์—ฐ๊ฒฐ์„ ๋Š๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ ์š”์ฒญ์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ํ•ญ์ƒ ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ๋งบ๊ณ  ๋Š๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‚ญ๋น„๋˜๋Š” ๊ตฌ์กฐ์ด๋ฉฐ, ์ž์ฃผ ํ†ต์‹ ํ•ด์•ผ ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

๋‹จ๋ฐฉํ–ฅ์„ฑ

ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋Œ€ํ•œ ์„œ๋ฒ„ ์‘๋‹ต๋งŒ ๊ฐ€๋Šฅ.

HTTP/1.1์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์ž„์˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ์€ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•œ๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ๋ณ„๋„์˜ ํด๋ง(polling) ๋ฐฉ์‹ ๋“ฑ์„ ํ†ตํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด์•ผ ํ•˜๋Š” ๋น„ํšจ์œจ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๋ฌด์ƒํƒœ์„ฑ(Stateless)

์ด์ „ ์š”์ฒญ๊ณผ ํ˜„์žฌ ์š”์ฒญ ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ์—†์Œ.

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


์œ„์™€ ๊ฐ™์€ ํŠน์ง•๋“ค์€ ์ดˆ๊ธฐ ์ •์ ์ธ ์›น ํŽ˜์ด์ง€ ์ œ๊ณต์—๋Š” ์ ํ•ฉํ–ˆ์œผ๋‚˜, ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์‹ค์‹œ๊ฐ„ ํ˜‘์—… ๋„๊ตฌ ๋“ฑ ์ƒํ˜ธ์ž‘์šฉ์ด ๋นˆ๋ฒˆํ•˜๊ณ  ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ค‘์š”ํ•œ ํ˜„๋Œ€์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ํ•œ๊ณ„๋ฅผ ๋“œ๋Ÿฌ๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, 1.1์˜ ๋‹จ์ ์„ ์—†์• ๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ HTTP/2์™€ HTTP/3๋กœ๋„ ์„œ๋ฒ„ ์ž„์˜ ์š”์ฒญ ๋ถˆ๊ฐ€, ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์œ ์ง€์— ๋Œ€ํ•œ ๋น„ํšจ์œจ์  ๋“ฑ์— ๋Œ€ํ•œ ๋‹จ์ ์ด ์—†์–ด์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด WebSocket ๋“ฑ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์œ„ํ•œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ๋ฐ ํ•œ๊ณ„

์ด๋Ÿฌํ•œ HTTP์˜ ๊ตฌ์กฐ์  ํ•œ๊ณ„๋กœ ์ธํ•ด ์‹ค์‹œ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์ด ์ค‘์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋‹ค์–‘ํ•œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์ด ์‹œ๋„๋์Šต๋‹ˆ๋‹ค. ์ด ํ•ญ๋ชฉ์—์„œ๋Š” ๊ทธ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ๊ณผ ๋‹จ์  ๋ฐ ํ•œ๊ณ„๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Ajax Polling & Long Polling

์„œ๋ฒ„์— ์ฃผ๊ธฐ์ ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์‘๋‹ตํ•˜๋Š” ๋ฐฉ์‹ > ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ

๋‹จ๋ฐฉํ–ฅ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์˜ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, (Ajax) Polling๊ณผ Long Polling์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‘˜์˜ ์ฐจ์ด๋Š” ์‘๋‹ต ์ง€์—ฐ ๋ฐฉ์‹์— ์žˆ์Šต๋‹ˆ๋‹ค.

  • (Ajax) Polling: ์š”์ฒญ ํ›„ ์ฆ‰์‹œ ์‘๋‹ต, ์ฃผ๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์— ์ƒˆ๋กœ์šด ์š”์ฒญ ์ „์†ก.
  • Long Polling: ์š”์ฒญ ํ›„ ์„œ๋ฒ„๊ฐ€ ์ƒˆ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ์‘๋‹ต ์ง€์—ฐ(Persisted). ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‘๋‹ต์„ ๋ณด๋‚ด๊ณ  ์—ฐ๊ฒฐ์„ ๋Š์€ ํ›„, ํด๋ผ์ด์–ธํŠธ๋Š” ๋‹ค์‹œ ์š”์ฒญ ์‹œ์ž‘.

๋ฌธ์ œ์ 

๋‹จ์ ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ถˆํ•„์š”ํ•œ HTTP ์˜ค๋ฒ„ํ—ค๋“œ: ๋‘˜ ๋ชจ๋‘ ์š”์ฒญ ์‹œ๋งˆ๋‹ค HTTP ํ—ค๋”์™€ ๊ธฐํƒ€ ๋ถ€๊ฐ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ผ ๋„คํŠธ์›Œํฌ ์ž์›์ด ๋‚ญ๋น„.
  • ์„œ๋ฒ„ ์ž์› ๋‚ญ๋น„
    • Ajax Polling: ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์–ด๋„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์š”์ฒญ => ์„œ๋ฒ„์—๊ฒŒ ๋ถˆํ•„์š” ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ ๋ฐœ์ƒ.
    • Long Polling: Ajax Polling ๋‹ค์†Œ ๊ฐœ์„ . But, ๋งŽ์€ ์—ฐ๊ฒฐ ์œ ์ง€ => ์„œ๋ฒ„ ๋ถ€๋‹ด ์ฆ๊ฐ€.
  • ์‹ค์‹œ๊ฐ„์„ฑ์˜ ํ•œ๊ณ„
    • Ajax Polling: ์„ค์ •๋œ ๊ฐ„๊ฒฉ๋งˆ๋‹ค ์š”์ฒญ => ๊ทธ ์‚ฌ์ด ์‹ค์‹œ๊ฐ„์„ฑ ๋ณด์žฅ X.
    • Long Polling: ์ฆ‰๊ฐ์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๊ฐ€๋Šฅ, But ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ๋ณต์žก.
  • ํ™•์žฅ์„ฑ ๋ฌธ์ œ: ๋งŽ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋™์‹œ์— ์š”์ฒญํ•  ๊ฒฝ์šฐ ์„œ๋ฒ„์— ํฐ ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•ด ํ™•์žฅ์„ฑ ํ•˜๋ฝ.

Server-Sent Events (SSE)

์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ์˜ ๋‹จ๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•˜๋Š” ์›น ํ‘œ์ค€ ๊ธฐ์ˆ 

Polling์˜ ํ•œ๊ณ„๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  WebSocket๋ณด๋‹ค ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. SSE๋Š” ๊ธฐ์กด HTTP ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ง€์†์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

์ž‘๋™ ๋ฐฉ์‹

// ํด๋ผ์ด์–ธํŠธ ์ธก ์ฝ”๋“œ
const eventSource = new EventSource('/api/events');

eventSource.onmessage = (event) => {
  console.log('์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ:', event.data);
};

// ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ (Node.js ์˜ˆ์‹œ)
app.get('/api/events', (req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
  });

  // ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์ „์†ก
  setInterval(() => {
    res.write(`data: ${JSON.stringify({ time: new Date() })}\n\n`);
  }, 1000);
});
  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP ์—ฐ๊ฒฐ์„ ์ƒ์„ฑ
  2. ์„œ๋ฒ„๋Š” ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋ฉฐ text/event-stream ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก
  3. ์ž๋™ ์žฌ์—ฐ๊ฒฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ œ๊ณต

์žฅ์ 

  1. ๋‹จ์ˆœํ•œ ๊ตฌํ˜„

    • ์ผ๋ฐ˜ HTTP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
    • WebSocket๋ณด๋‹ค ์„œ๋ฒ„ ๊ตฌํ˜„์ด ๊ฐ„๋‹จ
    • ๊ธฐ์กด HTTP ์ธํ”„๋ผ ํ™œ์šฉ ๊ฐ€๋Šฅ (ํ”„๋ก์‹œ, ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๋“ฑ)
  2. ์ž๋™ ์žฌ์—ฐ๊ฒฐ

    • ์—ฐ๊ฒฐ์ด ๋Š์–ด์กŒ์„ ๋•Œ ์ž๋™์œผ๋กœ ์žฌ์—ฐ๊ฒฐ ์‹œ๋„
    • ๋งˆ์ง€๋ง‰ ์ด๋ฒคํŠธ ID๋ฅผ ์ถ”์ ํ•˜์—ฌ ๋ˆ„๋ฝ๋œ ๋ฉ”์‹œ์ง€ ๋ณต๊ตฌ ๊ฐ€๋Šฅ
  3. ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ

    • ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›
    • ํด๋ฆฌํ•„์„ ํ†ตํ•œ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ์ œ๊ณต

ํ•œ๊ณ„

  1. ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ 

    • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ๋งŒ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ€๋Šฅ
    • ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์€ ๋ณ„๋„์˜ HTTP ์š”์ฒญ ํ•„์š”
  2. ์—ฐ๊ฒฐ ์ˆ˜ ์ œํ•œ

    • ๋ธŒ๋ผ์šฐ์ €๋‹น ๋™์‹œ ์—ฐ๊ฒฐ ์ˆ˜ ์ œํ•œ ์กด์žฌ
    • ๋„๋ฉ”์ธ๋‹น ์—ฐ๊ฒฐ ์ œํ•œ์œผ๋กœ ์ธํ•œ ํ™•์žฅ์„ฑ ์ œ์•ฝ
  3. ์ œํ•œ๋œ ๋ฐ์ดํ„ฐ ํ˜•์‹

    • ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋งŒ ์ „์†ก ๊ฐ€๋Šฅ
    • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์ „์†ก ๋ถˆ๊ฐ€

์ ํ•ฉํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€

  • ์‹ค์‹œ๊ฐ„ ์ฃผ์‹ ์‹œ์„ธ, ๋‰ด์Šค ํ”ผ๋“œ
  • ์†Œ์…œ ๋ฏธ๋””์–ด ์—…๋ฐ์ดํŠธ
  • ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ์ง„ํ–‰ ์ƒํ™ฉ ์—…๋ฐ์ดํŠธ

SSE๋Š” ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ์˜ ๋‹จ๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ํ•„์š”ํ•˜๊ณ , ๊ตฌํ˜„์˜ ๋‹จ์ˆœ์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค. WebSocket๋ณด๋‹ค ๊ฐ€๋ฒผ์šฐ๋ฉด์„œ๋„ Polling๋ณด๋‹ค ํšจ์œจ์ ์ธ ์ค‘๊ฐ„์ž์  ์œ„์น˜๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ์ดˆ๊ธฐ ์‹œ๋„์˜€๋˜ ๋‘ Polling ํ˜•์ œ๋“ค์€ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ํ™•์ธ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ์ง€๋งŒ, ์ง€์†์ ์ธ ์„œ๋ฒ„ ์—ฐ๊ฒฐ๊ณผ ์‹ค์‹œ๊ฐ„์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

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

WebSocket์˜ ๋“ฑ์žฅ

WebSocket ํ”„๋กœํ† ์ฝœ์˜ ํƒ„์ƒ ๋ฐฐ๊ฒฝ

2008๋…„ TCP ์—ฐ๊ฒฐ ๊ด€๋ จ ๋…ผ์˜์—์„œ, Michael Carter๊ฐ€ ์ฃผ๋„ํ•ด WebSocket ํ”„๋กœํ† ์ฝœ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. '์›น ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ๋ฌธ์ œ๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ' ์˜€์ฃ . HTML5 ํ‘œ์ค€ํ™” ๊ณผ์ •์—์„œ WebSocket์€ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์œผ๋กœ ์ž๋ฆฌ์žก์•˜๊ณ , 2011๋…„ RFC 6455๋กœ ํ‘œ์ค€ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

WebSocket๊ณผ HTTP ํ†ต์‹  ๋น„๊ต

1. Single TCP Connection (๋‹จ์ผ TCP ์—ฐ๊ฒฐ)

  • HTTP ํ”„๋กœํ† ์ฝœ ์œ„์—์„œ Handshaking ์ตœ์ดˆ ์ˆ˜ํ–‰.
  • ์ตœ์ดˆ ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ ํ›„ ๋™์ผํ•œ ์—ฐ๊ฒฐ ์žฌ์‚ฌ์šฉ.
    1. Upgrade: websocket ํ—ค๋”๋กœ ์š”์ฒญ.
    2. Connection: Upgrade ํ—ค๋”๋กœ ์‘๋‹ต ๋ฐ ์—ฐ๊ฒฐ.
  • HTTP์ฒ˜๋Ÿผ ๋งค ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ ๋งบ์ง€ ์•Š์Œ.
  • ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ์— ๋”ฐ๋ฅธ ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ ์ตœ์†Œํ™”.

HTTP๋Š” ์š”์ฒญ๋งˆ๋‹ค 3-way handshake๊ฐ€ ํ•„์š”ํ–ˆ์ง€๋งŒ, WebSocket์€ ์ตœ์ดˆ 1ํšŒ handshake ํ›„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

2. Full-Duplex Communication (์ง„์งœ์ง„์งœ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ )

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ „์†ก ๊ฐ€๋Šฅ.
  • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์—†์ด๋„ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ€๋Šฅ.
  • ์ฆ‰, ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ, ์ฑ„ํŒ… ๋“ฑ์— ์ด์ƒ์ .
// ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ž๋ฐœ์  ๋ฉ”์‹œ์ง€ ์ „์†ก ์˜ˆ์‹œ
webSocket.send(
  JSON.stringify({
    type: 'notification',
    message: '์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.',
  }),
);

์œ„์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ๋œ webSocket ๊ฐ์ฒด์˜ send ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์—†์ด๋„ ์‘๋‹ต์„ ์•„์ฃผ ๊ฐ€๋ณ๊ฒŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. Minimal Protocol Overhead (์ตœ์†Œํ•œ์˜ ํ”„๋กœํ† ์ฝœ ์˜ค๋ฒ„ํ—ค๋“œ)

  • ๋งค์šฐ ์ž‘์€ ํ—ค๋” ํฌ๊ธฐ. (2-14 ๋ฐ”์ดํŠธ)
  • HTTP์˜ ๋ฌด๊ฑฐ์šด ํ—ค๋”์™€ ๋น„๊ตํ•ด ๋ฐ์ดํ„ฐ ์ „์†ก ํšจ์œจ์„ฑ ๋†’์Œ.
  • HTTP ํ—ค๋” ์˜ˆ์‹œ. (์•ฝ 200๋ฐ”์ดํŠธ)
    GET /api/data HTTP/1.1
    Host: example.com
    User-Agent: Mozilla/5.0 ...
    Accept: */*
    Connection: keep-alive
    Cookie: session=abc123...
    
  • WebSocket ํ”„๋ ˆ์ž„ ํ—ค๋” ์˜ˆ์‹œ. (2-14๋ฐ”์ดํŠธ)
    FIN RSV1-3 Opcode
    MASK Payload len
    [Extended payload length]
    [Masking key]
    

4. Standardized Error Handling (ํ‘œ์ค€ํ™”๋œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ)

  • ์—ฐ๊ฒฐ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ๋‚ด์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜.
  • ping/pong ํ”„๋ ˆ์ž„์„ ํ†ตํ•œ ์—ฐ๊ฒฐ ์ƒ์กด ํ™•์ธ.
  • ์ž๋™ ์žฌ์—ฐ๊ฒฐ ๊ตฌํ˜„ ์šฉ์ด.
class WebSocketClient {
  constructor(url) {
    this.url = url;
    this.reconnectAttempts = 0;
    this.connect();
  }

  connect() {
    this.ws = new WebSocket(this.url);

    // ์—ฐ๊ฒฐ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง
    this.ws.onclose = (event) => {
      if (event.code !== 1000) {
        // ๋น„์ •์ƒ ์ข…๋ฃŒ
        this.reconnect();
      }
    };

    // ์ฃผ๊ธฐ์ ์ธ ping/pong ์ฒดํฌ
    this.heartbeat = setInterval(() => {
      if (this.ws.readyState === WebSocket.OPEN) {
        this.ws.send('ping');
      }
    }, 30000);
  }

  reconnect() {
    if (this.reconnectAttempts < 5) {
      setTimeout(() => {
        this.reconnectAttempts++;
        this.connect();
      }, 1000 * Math.pow(2, this.reconnectAttempts));
    }
  }
}

๊ทธ ์™ธ WebSocket ํ”„๋กœํ† ์ฝœ์˜ ์„œ๋ธŒํ”„๋กœํ† ์ฝœ ์ง€์› ๋ฐ ์ปค์Šคํ…€ ํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„๋„ ๊ฐ€๋Šฅํ•˜๊ณ , Text ๋ฐ Binary ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฉ”์‹œ์ง€ ํฌ๋งท๋„ ์ง€์›์ด ๋ฉ๋‹ˆ๋‹ค. WebSocket์€ ์ด๋Ÿฌํ•œ ํŠน์ง•๋“ค์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ํ˜„๋Œ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ถฉ์กฑ์‹œ์ผœ ํฐ ๋ฐœ์ „์„ ์ด๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค.

WebSocket์˜ ๋‹จ์ 

WebSocket์€ ์‹ค์‹œ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํฐ ๋ฐœ์ „์„ ์ด๋ฃจ์—ˆ์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‹จ์  ๋•Œ๋ฌธ์— WebRTC์™€ ๊ฐ™์€ P2P ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์ด ๊ฐœ๋ฐœ๋์Šต๋‹ˆ๋‹ค.

1. ์ค‘์•™ ์„œ๋ฒ„ ์˜์กด์„ฑ

Client A โ†’ Server โ†’ Client B

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

2. ์‹ค์‹œ๊ฐ„ ๋ฏธ๋””์–ด ์ „์†ก์— ํ•œ๊ณ„

// WebSocket์œผ๋กœ ๋น„๋””์˜ค ์ŠคํŠธ๋ฆผ ์ „์†ก ์‹œ๋„ ์˜ˆ์‹œ
const ws = new WebSocket('wss://example.com');

// ๋น„ํšจ์œจ์ ์ธ ๋ฏธ๋””์–ด ๋ฐ์ดํ„ฐ ์ „์†ก
videoStream.getTracks().forEach((track) => {
  track.addEventListener('sample', (event) => {
    ws.send(event.sample.buffer); // ๋ฌด๊ฑฐ์šด ๋ฏธ๋””์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„ ๊ฒฝ์œ ๋กœ ์ „์†ก
  });
});

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

๋‹ค์‹œ ๋งํ•ด, ๊ทธ ๋ฌด๊ฑฐ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ตœ์ ํ™”๋„ ์—†์ด ์„œ๋ฒ„ ๊ฒฝ์œ ๋ฅผ ๊ฑฐ์นœ๋‹ค๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋น„ํšจ์œจ์ ์ด๋ผ๋Š” ๊ฒ๋‹ˆ๋‹ค.

3. ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ ๋ณ€ํ™”์— ๋Œ€ํ•œ ์œ ์—ฐ์„ฑ ๋ถ€์กฑ

class WebSocketConnection {
  constructor() {
    this.ws = null;
    this.reconnectAttempts = 0;
  }

  connect() {
    this.ws = new WebSocket('wss://example.com');

    // ๋„คํŠธ์›Œํฌ ๋ณ€ํ™” ๋Œ€์‘์ด ์ œํ•œ์ 
    this.ws.onclose = () => {
      // ๋‹จ์ˆœ ์žฌ์—ฐ๊ฒฐ ์‹œ๋„๋งŒ ๊ฐ€๋Šฅ
      this.reconnect();
    };
  }

  // ์ œํ•œ์ ์ธ ๋„คํŠธ์›Œํฌ ๋Œ€์‘
  reconnect() {
    if (this.reconnectAttempts < 5) {
      setTimeout(() => {
        this.connect();
      }, 1000 * Math.pow(2, this.reconnectAttempts));
    }
  }
}

WebSocket์€ TCP ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ์–ด, ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ ๋ณ€ํ™”์— ๋Œ€ํ•œ ์ ์‘๋ ฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ๋„คํŠธ์›Œํฌ๊ฐ€ Wi-Fi์—์„œ LTE๋กœ ์ „ํ™˜๋  ๊ฒฝ์šฐ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.


์ด๋Ÿฌํ•œ WebSocket์˜ ๋‹จ์ ๋“ค์€ ๋‹ค์Œ ์„ธ๋Œ€์˜ ํ•„์š”์„ฑ์„ ๊ฐ•์กฐํ•˜๋Š” ์ด์œ ๊ฐ€ ๋์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์„œ๋ฒ„ ํ†ต์‹ ์ด ํ•„์š”์—†๋Š” ์›น์ด๋‚˜ ๊ณ ํ’ˆ์งˆ ์‹ค์‹œ๊ฐ„ ๋ฏธ๋””์–ด ์ „์†ก์ด ํ•„์š”ํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋‹จ์ ๋“ค์ด ๋”๋”์šฑ ๋ถ€๊ฐ๋์Šต๋‹ˆ๋‹ค.

WebRTC์˜ ๋“ฑ์žฅ ๋ฐ ํ˜์‹ 

2010๋…„๋Œ€ ์ดˆ๋ฐ˜, Google์€ ์›น์—์„œ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ P2P ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœํ† ์ฝœ์„ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœํ† ์ฝœ์ด ๋ฐ”๋กœ **WebRTC(Web Real-Time Communication)**์ž…๋‹ˆ๋‹ค.

WebRTC ํƒ„์ƒ ๋ฐฐ๊ฒฝ ๋ฐ ๋ฐœ์ „

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

WebRTC๋Š” WebSocket์ด ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ ๋ฌธ์ œ๋“ค์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ณ ํ’ˆ์งˆ ๋ฏธ๋””์–ด ์ „์†กํ•˜๋Š” ๊ธฐ์ˆ ๊ณผ P2P ํ†ต์‹ ์„ ์ง€์›ํ•˜๋Š” WebRTC๋Š” ์›น ์ƒ์—์„œ์˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ๋กœ ์ฃผ๋ชฉ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

  • ํ”Œ๋Ÿฌ๊ทธ์ธ ์˜์กด์„ฑ ์ œ๊ฑฐ: ๊ธฐ์กด์—๋Š” Flash๋‚˜ Silverlight ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๊ตฌํ˜„, ํ•˜์ง€๋งŒ ์ถ”๊ฐ€ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๋ณด์•ˆ ๋ฌธ์ œ ๋ฐœ์ƒ ์ฆ๊ฐ€.
  • ์ค‘์•™ ์„œ๋ฒ„ ๊ฒฝ์œ ๋กœ ์ธํ•œ ์ง€์—ฐ: ์ค‘์•™ ์„œ๋ฒ„๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ค‘๊ณ„๋กœ ์ธํ•ด ์ง€์—ฐ ๋ฐœ์ƒ, ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ ์ฆ๊ฐ€. ์„œ๋ฒ„ ์—†์ด ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ์ง์ ‘ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ ํ”„๋กœํ† ์ฝœ์ด ํ•„์š”ํ•ด์กŒ์Œ.
  • ๋†’์€ ๋Œ€์—ญํญ ๋น„์šฉ: ๊ณ ํ’ˆ์งˆ ๋ฏธ๋””์–ด ์ „์†ก์„ ์œ„ํ•œ, ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฏธ๋””์–ด ์ „์†ก ์ตœ์ ํ™” ๊ธฐ๋Šฅ ํ•„์š”.

WebRTC์˜ ๊ณต๊ฐœ์™€ ๋ฐœ์ „

๊ทธ๋ž˜์„œ 2011๋…„, Google์€ Global IP Solutions์„ ์ธ์ˆ˜ํ•˜๊ณ  WebRTC ํ”„๋กœ์ ํŠธ๋ฅผ ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ณต๊ฐœํ•˜๋ฉด์„œ ๋ณธ๊ฒฉ์ ์ธ ๊ฐœ๋ฐœ์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. WebRTC๋Š” ๊ธฐ์กด์˜ ์ค‘์•™ ์„œ๋ฒ„ ๋ฐฉ์‹(e.g. Client โ†’ Server โ†’ Client)์„ **P2P ๋ฐฉ์‹(e.g. Client โ†โ†’ Client)**์œผ๋กœ ๋ฐœ์ „์‹œ์ผœ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ํšจ์œจํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. (๋ฌผ๋ก  ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๊ธด ํ•˜์ง€๋งŒ์š”)

WebRTC ํŠน์ง•

  1. ์ž๋™ํ™”๋œ ๋„คํŠธ์›Œํฌ ์ฒ˜๋ฆฌ

    • ICE(Interactive Connectivity Establishment) ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•œ ์ตœ์  ๊ฒฝ๋กœ ์ž๋™ ์„ ํƒ.
    • NAT ํ†ต๊ณผ ์ž๋™ ์ฒ˜๋ฆฌ.
      • ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ์—ฐ๊ฒฐ์„ ์›ํ™œํ•˜๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ.
    • ๋„คํŠธ์›Œํฌ ๋ณ€ํ™”์— ๋™์  ๋Œ€์‘.
  2. ์ตœ์ ํ™”๋œ ๋ฏธ๋””์–ด ์ฒ˜๋ฆฌ

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

    • ๊ธฐ๋ณธ์ ์œผ๋กœ DTLS/SRTP ์•”ํ˜ธํ™”.
    • ์ธ์ฆ์„œ ๊ธฐ๋ฐ˜ ๋ณด์•ˆ.
    • ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ ๋ฐฉ์ง€.
  4. ๋ธŒ๋ผ์šฐ์ € ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›

    • ํ”Œ๋Ÿฌ๊ทธ์ธ ์—†๋Š” ์‹ค์‹œ๊ฐ„ ํ†ต์‹ 
    • ํ‘œ์ค€ํ™”๋œ API.
    • Chrome, Firefox, Safari ๋“ฑ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ๊ฐ€๋Šฅ.

WebRTC๋Š” ์ด์™€ ๊ฐ™์€ ํŠน์ง•๋“ค ๋•๋ถ„์— ์‹ค์‹œ๊ฐ„ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ํ•„์š”๋กœ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํ™”์ƒ ํšŒ์˜, ํŒŒ์ผ ๊ณต์œ , ์‹ค์‹œ๊ฐ„ ๊ฒŒ์ž„ ๋“ฑ)์—์„œ ํšจ์œจ์ ์ธ P2P ์—ฐ๊ฒฐ๊ณผ ๊ณ ํ’ˆ์งˆ ๋ฏธ๋””์–ด ์ „์†ก์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘์š”ํ•œ ๊ธฐ์ˆ ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค.

๋งŒ๋Šฅ๊ฐ™์•„ ๋ณด์ด์ง€๋งŒ ๋‹จ์ ๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๋ฐ NAT ๋ฌธ์ œ(ICE๋กœ ์™„ํ™” ๊ฐ€๋Šฅ), ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ ๊ด€๋ จ ์„ฑ๋Šฅ ๋ฌธ์ œ, ๋ณต์žกํ•œ ๊ตฌํ˜„ ๋ฐ ์„ค์ •, P2P ์—ฐ๊ฒฐ์— ์˜ํ•œ ํ™•์žฅ์„ฑ ๋ฌธ์ œ(SFU๋‚˜ MCU๋กœ ์™„ํ™” ๊ฐ€๋Šฅ), ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ € ๋ฏธ์ง€์› ๋“ฑ์˜ ๋‹จ์ ์ด ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์ง€๊ธˆ๊นŒ์ง€ ์›น ํ†ต์‹ ์˜ ๋ณ€ํ™”๋ฅผ ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค. HTTP์˜ ํ•œ๊ณ„๋ถ€ํ„ฐ P2P ํ†ต์‹ ๊นŒ์ง€ ๋ง์ด์ฃ . ๊ธ€์„ ์ž˜ ๋ณด์‹  ๋…์ž๋‹˜์ด๋ผ๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ๊ฐ๊ฐ์˜ ๊ธฐ์ˆ ์€ ์žฅ๋‹จ์ ์ด ์žˆ์–ด ๋‚˜์—๊ฒŒ ๋งž๋Š” ๊ธฐ์ˆ ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

1. HTTP์˜ ํ•œ๊ณ„ ๊ทน๋ณต

์ˆ˜๋ฐ• ๊ฒ‰ํ•ฅ๊ธฐ, ๋ฐ˜์ชฝ์งœ๋ฆฌ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ .

  • ๋ฌธ์„œ ๊ณต์œ  ์ค‘์‹ฌ์˜ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์—์„œ ์‹œ์ž‘.
  • Polling๊ณผ Long Polling์œผ๋กœ ์‹ค์‹œ๊ฐ„์„ฑ ๋ชจ๋ฐฉ.
  • ํ•˜์ง€๋งŒ ๊ทผ๋ณธ์ ์ธ ํ•œ๊ณ„ ์กด์žฌ.

2. WebSocket์˜ ๋“ฑ์žฅ

์„œ๋กœ์˜ ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๊ฐœํ•ด์ฃผ๋Š” ์•„๋น  ์„œ๋ฒ„.

  • ์ง„์ •ํ•œ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ์‹คํ˜„.
  • ๋‹จ์ผ ์—ฐ๊ฒฐ์„ ํ†ตํ•œ ํšจ์œจ์„ฑ ํ–ฅ์ƒ.
  • ์‹ค์‹œ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ฐ˜ ๋งˆ๋ จ.
  • ๊ทธ๋Ÿฌ๋‚˜ ์„œ๋ฒ„ ์ค‘์‹ฌ ์•„ํ‚คํ…์ฒ˜์˜ ํ•œ๊ณ„ ์กด์žฌ.

3. WebRTC์˜ ํ˜์‹ 

  • P2P ๊ธฐ๋ฐ˜์˜ ํด๋ผ์ด์–ธํŠธ ์ง์ ‘ ํ†ต์‹  ์‹คํ˜„.
  • ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆฌ๋ฐ ์ตœ์ ํ™”.
  • ๋ณด์•ˆ๊ณผ ์„ฑ๋Šฅ์˜ ๊ท ํ˜•.

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

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์ง์ ‘ WebRTC๋ฅผ ์จ๋ณด๋ฉฐ ๋”ฅ๋‹ค์ด๋ธŒํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Œ€ํ•ด์ฃผ์„ธ์š”!@@

์ฐธ๊ณ 

๐Ÿ˜Ž ์›จ๋ฒ ๋ฒ ๋ฒ ๋ฒฑ

๐Ÿ‘ฎ๐Ÿป ํŒ€ ๊ทœ์น™

๐Ÿ’ป ํ”„๋กœ์ ํŠธ

๐Ÿชต ์›จ๋ฒ ๋ฒฑ ๊ธฐ์ˆ ๋กœ๊ทธ

๐Ÿช„ ๋ฐ๋ชจ ๊ณต์œ 

๐Ÿ”„ ์Šคํ”„๋ฆฐํŠธ ๊ธฐ๋ก

๐Ÿ“— ํšŒ์˜๋ก

Clone this wiki locally