๐Ÿ‘’

๊ณ ๊ฐ์„ผํ„ฐ ์ฑ„ํŒ…๊ณผ ์•Œ๋ฆผ, ๋ฐฐ๋‹ฌ ์‹ค์‹œ๊ฐ„ ์ •๋ณด ์ œ๊ณต์€ ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”๊ฐ€ - WebSocket

Web Socket์ด๋ž€

Web Socket์€ ์ „์ด์ค‘ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ(Full duplex)๋กœ์จ, ์ฑ„ํŒ…, ์•Œ๋ฆผ, ์Œ์„ฑ ๋˜๋Š” ํ™”์ƒ ํ†ตํ™” ๊ฐ™์€ ์‹ค์‹œ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•œ ํ†ต์‹  ๋ฐฉ์‹์ด๋‹ค. ์›น ์†Œ์ผ“์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์— ์–‘๋ฐฉํ–ฅ ๋Œ€ํ™”ํ˜• ํ†ต์‹  ์„ธ์…˜์„ ์—ด ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ฒ„์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ์œ„ํ•ด ์„œ๋ฒ„๋ฅผ Pollingํ•˜์ง€ ์•Š์•„๋„ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

WebSocket ๊ตฌ์„ฑ์š”์†Œ

WebSocket Protocol

  • ํ”„๋กœํ† ์ฝœ: ws:// (port: 80), wss:// (port: 443)
  • ํ•ธ๋“œ์‰์ดํฌ
    • Request: ํด๋ผ์ด์–ธํŠธ๊ฐ€ Websocket ์„œ๋ฒ„์— HTTP ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
    • Header: Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒ์„ฑํ•œ Base64 ์ธ์ฝ”๋”ฉ๋œ ์ž„์˜์˜ ๋ฌธ์ž์—ด Sec-WebSocket-Version: WebSocket ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „ (์ตœ์†Œ 13)
    • Response: 101 Switching Protocols
image.png
  • ๋ฉ”์‹œ์ง€ ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ

    ๋ฉ”์‹œ์ง€๋Š” ์—ฌ๋Ÿฌ frame์œผ๋กœ ์ „์†ก ๋œ๋‹ค. ๊ฐ frame์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • FIN bit: ๋ฉ”์‹œ์ง€์˜ ๋งˆ์ง€๋ง‰ ํ”„๋ ˆ์ž„์ธ์ง€ ์—ฌ๋ถ€(1bit)
    • Reserved bits: ํ›„์† ํ™•์žฅ์„ ์œ„ํ•ด ์˜ˆ์•ฝ๋œ bits(3bit)
    • OpCode: ๋ฉ”์‹œ์ง€์˜ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ฝ”๋“œ(text, binary, close ๋“ฑ) (4bit)
    • Mask: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ maskingํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€(1bit)
    • Masking Key(ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „์†กํ•˜๋Š” ๊ฒฝ์šฐ): 4bytes์˜ key(masking์ด ์ ์šฉ๋œ ๊ฒฝ์šฐ)
    • Payload Length: payload์˜ ๊ธธ์ด (7, 7+16, 7+64 bit ์ค‘ ์„ ํƒ)
    • Payload Data: ์ „์†กํ•  ๋ฐ์ดํ„ฐ
    image.png

WebSocket API

์†Œ์ผ“์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•œ๋‹ค.

const socket = new WebSocket("ws://suitee.me");

์†Œ์ผ“์˜ ์ด๋ฒคํŠธ

  • open - ์ปค๋„ฅ์…˜์ด ์ œ๋Œ€๋กœ ๋งŒ๋“ค์–ด ์กŒ์„ ๋•Œ ๋ฐœ์ƒ
  • message - ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒ
  • error - ์—๋Ÿฌ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ๋ฐœ์ƒ
  • close - ์ปค๋„ฅ์…˜์ด ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒ

์ •์ƒ์ ์ธ ์ƒ๋ช…์ฃผ๊ธฐ์˜ ์†Œ์ผ“์€ open-message-close์˜ ์ˆœ์„œ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.

์†Œ์ผ“์˜ ๋ฉ”์„œ๋“œ

  • send(data): ์„œ๋ฒ„์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†ก
  • close(code, reason): ์—ฐ๊ฒฐ์„ ๋‹ซ์Œ

์†Œ์ผ“์˜ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์ฝ”๋“œ

  • 1000 - ์ •์ƒ ์ข…๋ฃŒ๋ฅผ ์˜๋ฏธ
  • 1006 - ์ปค๋„ฅ์…˜์ด ์œ ์‹ค๋˜์—ˆ์Œ์„ ์˜๋ฏธ
  • 1001 - ์—ฐ๊ฒฐ ์ฃผ์ฒด ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋– ๋‚จ์„ ์˜๋ฏธ
  • 1009 - ๋ฉ”์‹œ์ง€๊ฐ€ ๋„ˆ๋ฌด ํผ์„ ์˜๋ฏธ
  • 1011 - ์„œ๋ฒ„ ์ธก์—์„œ ๋น„์ •์ƒ์ ์ธ ์—๋Ÿฌ ๋ฐœ์ƒ

vs HTTP - ์‹ค์‹œ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€์ 

HTTP๋Š” Request-Response ํ”„๋กœํ† ์ฝœ๋กœ์จ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— Request๋ฅผ ์š”์ฒญํ•˜๊ณ  Response๋ฅผ ์ œ๊ณต ๋ฐ›์„๋•Œ๊นŒ์ง€ Pollingํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ํ†ต์‹ ์ด ์ข…๋ฃŒ๋œ๋‹ค. HTTP๊ฐ€ ์—ด๋ ค์žˆ๋Š” ๋™์•ˆ์—๋Š” ๋ฐ˜์ด์ค‘ ํ†ต์‹ ๋งŒ ๊ฐ€๋Šฅํ•˜์—ฌ ํ†ต์‹ ์ด ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ง„ํ–‰๋œ๋‹ค. *HTTP/2, HTTP/3์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ณ  ์ด ์ƒํƒœ์—์„œ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋™์‹œ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.(Multiflexing) ํ•˜์ง€๋งŒ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…๊ณผ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ๊ฐ™์€ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ์šฉ๋„๋Š” ์•„๋‹ˆ๋‹ค.

HTTP

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

Web Socket

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

Appendix

https://ko.javascript.info/websocket https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API https://sendbird.com/ko/developer/tutorials/websocket-vs-http-communication-protocols

yoon.homme
yoon.homme

๊ธฐ์ˆ ๊ณผ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์˜ ํž˜์ด ์„ธ์ƒ์„ ๋ฐ”๊พผ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

ํŽธ๋ฆฌํ•œ ์„ธ์ƒ์œผ๋กœ ๋‚˜์•„๊ฐ€๊ธฐ ์œ„ํ•ด ๊ณ ๋ฏผํ•˜๊ณ  ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.