๊ณ ๊ฐ์ผํฐ ์ฑํ ๊ณผ ์๋ฆผ, ๋ฐฐ๋ฌ ์ค์๊ฐ ์ ๋ณด ์ ๊ณต์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋๊ฐ - 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
-
๋ฉ์์ง ํ๋ ์ ๊ตฌ์กฐ
๋ฉ์์ง๋ ์ฌ๋ฌ 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: ์ ์กํ ๋ฐ์ดํฐ
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