๐ข ๋ค์ด๊ฐ๋ฉฐ
์ง์ฅ์์ ์๋ ์
๋ฐ์ดํธ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ผ์ด ์๊ฒผ๋ค.
๋๊ตฐ๊ฐ ์น์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ ๋
๋ค๋ฅธ PC๋ฅผ ์ฌ์ฉ ์ค์ธ ์ฌ๋์ ํ๋ฉด์๋ ํด๋น ๋ฐ์ดํฐ๊ฐ ์๋์ผ๋ก ์ค์๊ฐ ์
๋ฐ์ดํธ ๋๊ฒํ๋ ๊ธฐ๋ฅ์ด์๋ค.
๋๋ ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด 5์ด๋ง๋ค ํ๋ฒ ์ฉ ๋ฐ์ดํฐ์ ์์ ๋ ์๊ฐ๋ฅผ DB์์ ๊ฐ์ ธ์๊ณ ,
DB์์ ๊ฐ์ ธ์จ ์์ ๋ ์๊ฐ์ด ๊ธฐ์กด ์์ ๋ ์๊ฐ๊ณผ ๋ค๋ฅด๋ค๋ฉด ํ๋ฉด์ด refresh ๋๋๋ก ๊ตฌํํ๋ค.
(๊ตฌํํ ๋ ๋ชฐ๋๋๋ฐ, ์ด๋ ๊ฒ ์ผ์ ์ฃผ๊ธฐ๋ก ํต์ ํ์ฌ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ Polling ์ด๋ผ๊ณ ํ๋จ๋ค.)
๊ทธ๋ฐ๋ฐ ๋๋ฆฌ๋๊ป์ ์ด๋ ๊ฒ ํ๋ ๊ฒ๋ ํ๋ฆฐ ๊ฑด ์๋์ง๋ง ์น ์์ผ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ๋ง์ํด์ฃผ์
จ๋ค.
๋๋ ์น ์์ผ์ ๋ํด ์ ํ ์์ง ๋ชปํ๋ค...
๊ทธ๋์ ๋ถ๋ด๋ถ๋ด ๊ณต๋ถํ๊ณ Polling ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ ์ฝ๋๋ฅผ ์น ์์ผ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ๋ค!
์ด๋ฒ ํฌ์คํ ์์ ๊ณต๋ถํ๋ ์น ์์ผ์ ๋ํด์ ์ ๋ฆฌํด ๋ณผ ๊ฒ์ด๋ค.
โก ์น ์์ผ
์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ๋ฉ์์ง ๊ตํ์ ์ํ ํต์ ๊ท์ฝ(ํ๋กํ ์ฝ)
โก ์น ์์ผ์ ํน์ง
์๋ฐฉํฅ ํต์ (Full-Duplex)
๋ฐ์ดํฐ ์ก์์ ์ ๋์์! ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ.
ํต์์ ์ธ HTTP ํต์ ์ client ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒฝ์ฐ์๋ง Server๊ฐ ์๋ต์ ํ๋ ๋จ๋ฐฉํฅ ํต์ ์ด์ง๋ง,
์น ์์ผ์ ์๋ฐฉํฅ ํต์ ์ด ๊ฐ๋ฅํ๋ค.
์ค์๊ฐ ๋คํธ์ํน (Real Time Networking)
์น ํ๊ฒฝ์์ ์ฐ์๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๋
ธ์ถํ๋ ๊ฒ.
ex. ์ฑํ
, ์ฃผ์
โก ์น ์์ผ์ด ๋์ค๊ธฐ ์ ๊น์ง์ ํต์ ๋ฐฉ์
์น ์์ผ์ด ๋์ค๊ธฐ ์ ,
์๋ฐฉํฅ ํต์ ๊ณผ ์ค์๊ฐ ๋คํธ์ํน์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฐฉ๋ฒ๋ค์ ์์๋ณด์.
Polling
๐ข ๋ค์ด๊ฐ๋ฉฐ ๋ถ๋ถ์์ ์ธ๊ธํ๋ ๋ด๊ฐ ์ด๊ธฐ์ ๊ตฌํํ ๋ฐฉ์์ด๋ค.
์ผ์ ํ ์ฃผ๊ธฐ๋ก ์๋ฒ์ ์์ฒญ(Request)์ ๋ณด๋ด๋ ๋ฐฉ๋ฒ.setTimeout
, setInterval
๋ฑ์ผ๋ก ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ์๋ฒ์ ์์ฒญ(Request)์ ๋ณด๋ด๋ฉด ๋๋ค.
(๋๋ setInterval
์ ์ฌ์ฉํ์๋ค.)
๋ถํ์ํ Request ์ Connection์ ์์ฑํ์ฌ ์๋ฒ์ ๋ถ๋ด์ ์ฃผ๊ฒ๋๋ค.
์์ฒญ ์ฃผ๊ธฐ๊ฐ ์งง์ ์๋ก ๋ถํ๊ฐ ์ปค์ง๋ค.
'์ผ์ ์ฃผ๊ธฐ๋ง๋ค' ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ค์๊ฐ์ด๋ผ๊ณ ๋ณด๊ธฐ์ ์ ๋งคํ๋ค.
์์ฒญ ์ฃผ๊ธฐ๊ฐ ์งง์ผ๋ฉด ์ค์๊ฐ ์ฒ๋ผ ๋ณด์ด๊ฒ ์ง๋ง, ์ค์ ๋ก ์ค์๊ฐ์ ์๋๋ค.
HTTP ํต์ ์ ํ๊ธฐ ๋๋ฌธ์ Request, Response ํค๋๊ฐ ๋ถํ์ํ๊ฒ ํฌ๋ค.
- Polling ๋ฐฉ์์ ์ ํํ๋ ๊ฒฝ์ฐ
- ์๋ต์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ง ์์๋ ๋๋ ๊ฒฝ์ฐ
- ๋ค์์ ์ฌ์ฉ์๊ฐ ๋์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ex. facebook ์น ์ฑํ , google ๋ฉ์ ์ , msn ์น ๋ฉ์ ์
Long Polling
Polling๊ณผ ๋น์ทํ๊ฒ ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ์์ฒญ์ ๋ณด๋ด์ง๋ง ์๋ฒ๊ฐ ์๋ต์ ๋ฐ๋ก ์ ๋ฌํ์ง ์๋ ๋ฐฉ์์ด๋ค.
์์ฒญ์ ๋ณด๋์ ๋, ์๋ฒ๊ฐ ์๋ต์ ๋ฐ๋ก ๋ณด๋ด์ง ์๊ณ ํน์ ์ด๋ฒคํธ๋ ํ์์์์ด ๋ฐ์ํ์ ๋ ์๋ต์ ์ ๋ฌํ๋ ๋ฐฉ์.
์๋ต์ ๋ฐ์ ํด๋ผ์ด์ธํธ๋ ๋ค์ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ค.
๋ถํ์ํ ์์ฒญ์ ๋ณด๋ด์ง ์์ Polling ๋ณด๋ค ์ข์๋ณด์ด์ง๋ง,
Long Polling ๋ ๋์ ๋ค๋ฐ์ ์ธ ์์ฒญ๊ณผ ์๋ต์ด ์๊ธฐ๋ฉด ๋ถํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
HTTP ํต์ ์ ํ๊ธฐ ๋๋ฌธ์ Request, Response ํค๋๊ฐ ๋ถํ์ํ๊ฒ ํฌ๋ค.
- Long Polling ๋ฐฉ์์ ์ ํํ๋ ๊ฒฝ์ฐ
- ์๋ต์ ์ค์๊ฐ์ผ๋ก ๋ฐ์์ผํ๋ ๊ฒฝ์ฐ
- ์ ์ ์์ ์ฌ์ฉ์๊ฐ ๋์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
Streaming
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์๋ต์ ๋ด๋ ค์ฃผ๋, ์๋ต์ ์๋ฃ์ํค์ง ์๊ณ ๊ณ์ ์ฐ๊ฒฐ์ ์ ์งํ๋ ๋ฐฉ์.
Long Polling์ ๋นํด ์๋ต๋ง๋ค ๋ค์ ์์ฒญ์ ํ์ง ์์๋ ๋๋ฏ๋ก ํจ์จ์ ์ด์ง๋ง,
์ฐ๊ฒฐ ์๊ฐ์ด ๊ธธ์ด์ง ์๋ก ์ฐ๊ฒฐ ์ ํจ์ฑ ๊ด๋ฆฌ์ ๋ถ๋ด์ด ๋ฐ์ํ๋ค.
HTTP ํต์ ์ ํ๊ธฐ ๋๋ฌธ์ Request, Response ํค๋๊ฐ ๋ถํ์ํ๊ฒ ํฌ๋ค.
โก ์น ์์ผ ๋์ ๊ณผ์
์น ์์ผ ๋์ ๊ณผ์ ์ ํฌ๊ฒ ์ธ๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
์ ์ด๋ฏธ์ง์ ๋นจ๊ฐ ์ ๋ฐ์ค์ ํด๋นํ๋ Opening Handshake
์ ์ด๋ฏธ์ง์ ๋
ธ๋ ์ ๋ฐ์ค์ ํด๋นํ๋ Data transfer
์ ์ด๋ฏธ์ง์ ๋ณด๋ผ ์ ๋ฐ์ค์ ํด๋นํ๋ Closing Handshake
๐ค Handshake
Opening Handshake ์ Closing Handshake ๋ ์ผ๋ฐ์ ์ธ HTTP TCP ํต์ ์ ๊ณผ์ ์ค ํ๋์ด๋ค.
(ํธ๋์์ดํน ๋ฐ HTTP TCP์ ๋ํ ๊ฐ๋
์ ์ด ๊ฒ์๊ธ์์ ๋ค๋ฃฌ ์ ์๋ค. ์ฐธ๊ณ !)
์ ์ ์์ฒญ์ HTTP ๋ก ํ ๋ค, ์น์์ผ ํ๋กํ ์ฝ๋ก ๋ณ๊ฒฝ๋๋ค. (WS)
์น์์ผ ํ๋กํ ์ฝ๋ก ๋ณ๊ฒฝ๋๊ธฐ ์ํ HTTP ํค๋๋ ์๋์ฒ๋ผ ๊ตฌ์ฑ๋์ด ์๋ค.
(ws://localhost:8080/chat
์ผ๋ก ์ ์ํ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํ๋ค.)
๐ค ์์ฒญ(Request) ํค๋
GET /chat HTTP/1.1
Host: localhost:8080
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://localhost:9000
GET /chat HTTP/1.1
์น์์ผ์ ํต์ ์์ฒญ์์,
HTTP ๋ฒ์ ์ 1.1 ์ด์์ด์ด์ผํ๊ณ GET ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
Upgrade
ํ๋กํ ์ฝ์ ์ ํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํค๋.
์น์์ผ ์์ฒญ์์๋ ๋ฐ์ค์ websocket ์ด๋ผ๋ ๊ฐ์ ๊ฐ์ง๋ฉฐ,
์ด ๊ฐ์ด ์๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ์ด๋ฉด cross-protocol attack ์ด๋ผ๊ณ ๊ฐ์ฃผํ์ฌ ์น ์์ผ ์ ์์ ์ค์ง์ํจ๋ค.
Connection
ํ์ฌ์ ์ ์ก์ด ์๋ฃ๋ ํ ๋คํธ์ํฌ ์ ์์ ์ ์งํ ๊ฒ์ธ๊ฐ์ ๋ํ ์ ๋ณด.
์น ์์ผ ์์ฒญ ์์๋ ๋ฐ๋์ Upgrade ๋ผ๋ ๊ฐ์ ๊ฐ์ง๋ค.
Upgrade ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ๊ฐ์ด ์๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ์ด๋ฉด ์น์์ผ ์ ์์ ์ค์ง์ํจ๋ค.
Sec-WebSocket-Key
์ ํจํ ์์ฒญ์ธ์ง ํ์ธํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํค ๊ฐ
Sec-WebSocket-Protocol
์ฌ์ฉํ๊ณ ์ ํ๋ ํ๋ ์ด์์ ์น ์์ผ ํ๋กํ ์ฝ ์ง์ .
ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ
Sec-WebSocket-Version
ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ๊ณ ์ ํ๋ ์น์์ผ ํ๋กํ ์ฝ ๋ฒ์ .
ํ์ฌ ์ต์ ๋ฒ์ 13
Origin
CORS ์ ์ฑ
์ผ๋ก ๋ง๋ค์ด์ง ํค๋.
Cross-Site Websocket Hijacking๊ณผ ๊ฐ์ ๊ณต๊ฒฉ์ ํผํ๊ธฐ ์ํจ.
๐ค ์๋ต(Response) ํค๋
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
HTTP/1.1 101 Switching Protocols
101์ HTTP์์ WS๋ก ํ๋กํ ์ฝ ์ ํ์ด ์น์ธ ๋์๋ค๋ ์๋ต์ฝ๋์ด๋ค.
Sec-WebSocket-Accept
์์ฒญ ํค๋์ Sec-WebSocket-Key์ ์ ๋ํฌ ์์ด๋๋ฅผ ๋ํด์ SHA-1๋ก ํด์ฑํ ํ base64๋ก ์ธ์ฝ๋ฉํ ๊ฒฐ๊ณผ์ด๋ค.
์น ์์ผ ์ฐ๊ฒฐ์ด ๊ฐ์๋์์์ ์๋ฆฐ๋ค.
๐ค Data Transfer
Opening HandShake์์ ์น์ธ์ด ๋๊ณ ๋๋ฉด,
์น ์์ผ ํ๋กํ ์ฝ๋ก ๋
ธ๋์ ๋ฐ์ค ๋ถ๋ถ์ธ Data transfer ์ด ์งํ๋๋ค.
์ฌ๊ธฐ์ ๋ฐ์ดํฐ๋ ๋ฉ์์ง๋ผ๋ ๋จ์๋ก ์ ๋ฌ๋๋ค.
๋ฉ์์ง
์ฌ๋ฌ ํ๋ ์(frame)์ด ๋ชจ์ฌ์ ๊ตฌ์ฑ๋๋ ํ๋์ ๋
ผ๋ฆฌ์ ์ธ ๋ฉ์์ง ๋จ์
ํ๋ ์
ํต์ ์์ ๊ฐ์ฅ ์์ ๋จ์์ ๋ฐ์ดํฐ.
์? ๊ฐ์ฅ ์์ ๋จ์์ ๋ฐ์ดํฐ๋ ํจํท์ด๋ผ๊ณ ๋ถ๋ฅด์ง ์๋? ๋ผ๊ณ ์๊ฐํ ์ ์๋ค.
๋ฌผ๋ก ๋ง๋ ๋ง์ด๋ค.
ํจํท์ ์ ๋คํธ์ํฌ ํต์ ๊ณผ์ ์์ ๊ฐ์ฅ ์์ ๋จ์์ ๋ฐ์ดํฐ๋ฅผ ๋ปํ๊ณ ,
ํ๋ ์์ ๋ฐ์ดํฐ ๋งํฌ๊ณ์ธต(์ด๋๋ท)์์ ์ฃผ๊ณ ๋ฐ๋ ๊ฐ์ฅ ์์ ๋จ์๋ฅผ ์๋ฏธํ๋ค.
์์ ํค๋ + payload ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
โก Socket.io
์น์์ผ์ HTML5์ ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ ์ค๋๋ ๋ฒ์ ์ ์น ๋ธ๋ผ์ฐ์ ๋ ์น ์์ผ์ ์ง์ํ์ง ์๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ๊ธฐ์ ์ค ํ๋๊ฐ Socket.io์ด๋ค.
์๋ฐฉํฅ ํต์ ์ ํ๊ธฐ ์ํด ์น ์์ผ ๊ธฐ์ ์ ํ์ฉํ๋ Node.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
์น์์ผ, ํด๋ง, ์คํธ๋ฆฌ๋ฐ ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ ํ๋์ API๋ก ์ถ์ํํ ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ข
๋ฅ์ ์๊ด ์์ด ์ค์๊ฐ ์น์ ๊ตฌํํ ์ ์๋ค.
์ด๋ฒ ํฌ์คํ ์์ ์น์์ผ์ ๊ฐ๋ ์ ๋ํด ์์๋ณด์๋ค.
๋๊ธ, ํํธ, ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ ๋๋ค๐ผ
์ฐธ์กฐ ๋ฌธ์
'๋คํธ์ํฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
HTTP/HTTPS๋? TCP, UDP, HandShake ๊ฐ๋ ์ ๋ฆฌ (4) | 2022.07.25 |
---|---|
OSI 7๊ณ์ธต - ๋ฌผ๋ฆฌ ๊ณ์ธต์ด๋? (๋ฌผ๋ฆฌ๊ณ์ธต์์ ์ด๋ค์ง๋ ์ผ) (0) | 2022.03.07 |
ํ๋กํ ์ฝ์ด๋? OSI 7๊ณ์ธต, TCP/IP 4๊ณ์ธต์ด๋? (0) | 2022.03.04 |