WebSocketμ΄λ? κ°λ κ³Ό λμ κ³Όμ (+socket.io, Polling, Streaming...)
π’ λ€μ΄κ°λ©°
μ§μ₯μμ μλ μ
λ°μ΄νΈ κΈ°λ₯μ ꡬνν μΌμ΄ μκ²Όλ€.
λκ΅°κ° μΉμ λ°μ΄ν°λ₯Ό μμ νμ λ
λ€λ₯Έ 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λ‘ μΆμνν κ²μ΄λ€.
μλ°μ€ν¬λ¦½νΈλ₯Ό μ΄μ©νμ¬ λΈλΌμ°μ μ’
λ₯μ μκ΄ μμ΄ μ€μκ° μΉμ ꡬνν μ μλ€.
μ΄λ² ν¬μ€ν μμ μΉμμΌμ κ°λ μ λν΄ μμ보μλ€.
λκΈ, ννΈ, νΌλλ°±μ μΈμ λ νμμ λλ€πΌ
μ°Έμ‘° λ¬Έμ