Websocket์ ์ปดํจํฐ ๋คํธ์ํฌ์ฉ ํต์ ๊ท์ฝ์ ํ๋์ด๋ค.
(์ธํฐ๋ท์ ํ์คํ ๋จ์ฒด์ธ W3C(World Wide Web Consortium)๊ฐ API ์ฑ
์ ์ ๋งก๊ณ , IETF๊ฐ Websocket ํ๋กํ ์ฝ ์ฑ
์ ์ ๋งก์์ผ๋ก์จ, ์น์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ์ ํต์ ์ ์ํ ๊ท์ ์ ์ ์ํ ์๋ฐฉํฅ ํต์ ์ฉ ๊ธฐ์ ๊ท์ฝ)
WebSocket ์๋ฒ์ ์ฐ๊ฒฐํ ๋ค์ ์ฐ๊ฒฐ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ ๋ฐ๊ธฐ ์ํ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค์ด๋ค.
(์ฆ, Websocket(์น ์์ผ) API๋ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ (ํด๋ผ์ด์ธํธ)์ ์๋ฒ ๊ฐ์ ์๋ฐฉํฅ(์ค์๊ฐ) ํต์ ์ธ์
์ ์ด ์์๊ฒํ๋ ๊ธฐ์ )
์ด API๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ต์ ์ํด ์๋ฒ๋ฅผ ํด๋ง(polling, ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ์์ฒญํ๋ ๋ฐฉ์ <-> ํธ์(push))ํ์ง ์๊ณ ๋ ์๋ฒ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์๋ต์ ๋ฐ์ ์ ์๋ค.
๐ธ Websocket ๋ฑ์ฅ๋ฐฐ๊ฒฝ
์ด๊ธฐ ์น(WEB)์ ๋ชฉ์ ์ ๋ฌธ์์ ๋ฌ๊ณผ ํ์ดํผ๋งํฌ๋ฅผ ํตํ ๋ฌธ์์ฐ๊ฒฐ์ด๋ค. ์น์ ์ํ HTTPํ๋กํ ์ฝ์ ์ด๋ฌํ ๋ชฉ์ ์ ๋ถํฉํ๋ ๋ชจ๋ธ์ด๋ค.
ํ์ง๋ง ์น(WEB)์ด ๋ฐ์ ํ ์๋ก ๋์ฑ ๋์ ์ด๊ณ ์ํธ์์ฉ์ ์ธ ๊ธฐ๋ฅ์ด ์๊ตฌ๋จ์ ๋ฐ๋ผ ์นํ๊ฒฝ์ด ๊ฐ๋ฐ๋์๋ค.
๊ทธ ์ค ์นํ๊ฒฝ์์ ์ค์๊ฐ ์๋ฐฉํฅ ํต์ ์ ์ํ ์คํ์ด Websocket์ด๋ค.
Websocket์ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ง์์ ์ผ๋ก ์ฐ๊ฒฐ๋ TCP๋ผ์ธ์ ํตํด ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ํ๋ HTML5์ ์๋ก์ด ์ฌ์์ด๋ค.
๋ฐ๋ผ์ Websocket์ ์ด์ฉํ๋ฉด ์ผ๋ฐ์ ์ธ TCP์์ผ๊ณผ ๊ฐ์ด ์ฐ๊ฒฐ์งํฅ ์๋ฐฉํฅ ์ ์ด ์ค ํต์ ์ด ๊ฐ๋ฅํ๋ค.
๐ ์ด๋ฅผ ํ์ฉํ ๋ถ์ผ๋ก๋ ์ฑํ
, ๊ฒ์, ์ค์๊ฐ ์ฃผ์ ์ฐจํธ์ ๊ฐ์ ์ค์๊ฐ์ด ์๊ตฌ๋๋ ์์ฉํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐ์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํ
ํ ์ ์๋ค.
๐ฆ
REST API
๊ฐ ๊ฐ์ง ํ๊ณ์ ์ผ๋ก ์ธํด Websocket API๊ฐ ๋ฑ์ฅํ๊ฒ ๋์๋ค.REST API๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ก๋๋ ๊ฒ์ ํญ์ ๋๊ตฐ๊ฐ๊ฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๊ฒ์ ๊ฒฐ๊ณผ์ด๋ค.
ex) ๋ธ๋ผ์ฐ์ ๋ฐฉ๋ฌธ ์ฌ๋ก (์น์ฌ์ดํธ ์ฃผ์ ์ ๋ ฅ
>์ํฐ
>์นํ์ด์ง ๋ธ
)
์ฆ, ์ํฐ๋ฅผ ์น๋ ํ์๊ฐ ์๋ฒ๋ก๋ถํฐ ์นํ์ด์ง์ ์ฝํ ์ธ ๋ฅผ ๋ฌ๋ผ๊ณ ์์ฒญํ๋ ํ์์ด๋ค. ์ํฐ๋ฅผ ์น์ง ์์ผ๋ฉด ์นํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต๋ฐ์ง ๋ชปํ๋ค.ex) ์นํ์ด์ง ์๋ก๊ณ ์นจ ์ฌ๋ก (์น์ฌ์ดํธ ๋ฐฉ๋ฌธ ํ ์๋ก๊ณ ์นจ์ ํ๊ธฐ ์ ๊น์ง๋ ํ๋ฉด์ ๋ณํ๊ฐ ์๋ค)
์ฆ, ์ด๋ฒคํธ ๋์ ๋ฑ์ด ์์ผ๋ฉด ์๋์ผ๋ก ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ๋ฐ์์ฌ ์ ์๋ค.ex) ์ค์๊ฐ์ผ๋ก ์ ๋ณด๊ฐ ์ ๋ฐ์ดํธ ๋์ด์ผํ๋ ๋ถ์ผ(์ฃผ์ ๋ฑ) -> ์์ฒญ ํ์ ์์ด ์ค์๊ฐ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ ๋๊ธฐ ์ํด์๋ ๋ฌดํ ์๋ก๊ณ ์นจ์ ๋ฐ๋ณตํด์ผ ํ ๊ฒ์ด๋ค.
๐ REST API์ ํ๊ณ๋
1) ์ ๋ณด๊ฐ ๋ณํ ๋, ๊ทธ๋๋ง๋ค ์ค์๊ฐ์ผ๋ก ๋ฐ์๋ณด๊ธฐ ํ๋ค๋ค๋ ์
2) ํ ๋ฒ์ ์์ฒญ์ด ํ ๋ฒ์ ์๋ต์ผ๋ก ๋๋๋ค.
(์ฆ, ํ ๋ฒ ์์ฒญํ๋ฉด ๊ทธ ๋ค๋ก ๊ณ์ํด์ ์์์ ์ ๋ฐ์ดํธ ํด์ฃผ๋ ๋ฐฉ์์ API๊ฐ ํ์ํ๋ค)๊ทธ๋์ ๋ฑ์ฅํ API๊ฐ Websocket API(= ๊ตฌ๋ ํ API)์ด๋ค.
- ๋ฐ์ดํฐ ์์ฒญ์(ํด๋ผ์ด์ธํธ)์ ๋ฐ์ดํฐ ์ ๊ณต์(์๋ฒ) ๊ฐ์ ์ฑ๋์ด ์ด๋ฆฌ๊ฒ ๋๋ค.
- ์ฑ๋์ด ์ด๋ฆฌ๊ธฐ ์ , ์์ฒญ์๋ ์ ๊ณต์๋ก๋ถํฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ ์ถ์์ง ๋ฏธ๋ฆฌ ์๋ ค์ค์ผ ํ๋ค.
- ์ฑ๋์ด ์ด๋ฆฐ ํ, ์ ๊ณต์๋ ์์ฒญ์๊ฐ ์๊ตฌํ๋ ๋ฐ์ดํฐ๋ค์ ์ ๋ฌํ๊ธฐ ์์ํ๋ค.
- ์ด ์ฑ๋์ด ๋ซํ์ง ์๋ ํ ๋ฐ์ดํฐ๋ ๋ฌดํ ๋ค์ด์ฌ ์ ์๋ค.
(์ฑ๋ํ์ฑ = ๋ฐ์ดํฐ ๋ฌดํ ์ ๊ณต)
๐ธ Websocket์ด ํ์ํ ๊ฒฝ์ฐ
๐ธ Websocket ์๋ฒ์ ์ข ๋ฅ
๐ธ ๊ธฐ์กด ํต์ ๋ฐฉ๋ฒ๊ณผ Websocket์ ๊ฒฐ์ ์ ์ฐจ์ด๋?
ํ๋กํ ์ฝ
์ ์๋ค. WebSocket ํ๋กํ ์ฝ์ ์ ์ํ๋ฆฝ์ HTTP๋ฅผ ์ฌ์ฉํ์ง๋ง, ๊ทธ ํ์ ํต์ ์ WebSocket ๋
์์ ํ๋กํ ์ฝ๋ก ์ด๋ฃจ์ด์ง๋ค. http://www.sample.com/
๊ณผ ๊ฐ์ ํ์์ด ์๋๋ผ ws://www.sample.com/
๊ณผ ๊ฐ์ ํ์์ด ๋๋ค.[๋ถ์ ๋ฐ์ค] : Opening Hanadshake
[๋
ธ๋ ๋ฐ์ค] : Data transfer
[๋ณด๋ผ ๋ฐ์ค] : Closing Handkshake
์น์์ผ์ HTTP๋ก Handshake๋ฅผ ํ ํ, ws๋ก ํ๋กํ ์ฝ์ ๋ณํํ์ฌ, ์น์์ผ ํ๋ ์์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ค.
์น์์ผ์ ์๋ฐฉํฅ ํต์ (full-duplex)์ ์ง์ํ๋ฉฐ, ๊ทธ๋์ ์์ฒญ๊ณผ ์๋ต์ ๊ตฌ๋ถํ์ง ์๋๋ค.
(1) Opening Handshake
์น์์ผ ํด๋ผ์ด์ธํธ์์ ํธ๋์์ดํฌ ์์ฒญ(HTTP Upgrade)์ ์ ์กํ๊ณ ์ด์ ๋ํ ์๋ต์ผ๋ก ํธ๋ ์ ฐ์ดํฌ ์๋ต์ ๋ฐ๋๋ฐ, ์ด๋ ์๋ต ์ฝ๋๋ 101์ด๋ค.
101
์ 'ํ๋กํ ์ฝ ์ ํ'์ ์๋ฒ๊ฐ ์น์ธํ์์ ์๋ฆฌ๋ ์ฝ๋์ด๋ค.์ด ๊ณผ์ ์์ ์์ฒญ๊ณผ ์๋ต์ ํค๋๋ ์๋์ ๊ฐ๋ค.
ws://localhost:8080/chat
์ผ๋ก ์ ์ํ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ .GET /chat HTTP/1.1 Host: localhost:8080 Upgrade: websocket // ํ๋กํ ์ฝ์ ์ ํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํค๋. // ์น์์ผ ์์ฒญ ์์๋ ๋ฐ๋์ websocket์ด๋ผ๋ ๊ฐ์ ๊ฐ์ง๋ฉฐ, ์ด ๊ฐ์ด ์๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ์ด๋ฉด cross-protocol attack์ด๋ผ๊ณ ๊ฐ์ฃผํ์ฌ ์น์์ผ ์ ์์ ์ค์ง์ํจ๋ค. Connection: Upgrade // ํ์ฌ์ ์ ์ก์ด ์๋ฃ๋ ํ ๋คํธ์ํฌ ์ ์์ ์ ์งํ ๊ฒ์ธ๊ฐ์ ๋ํ ์ ๋ณด. // ์น์์ผ ์์ฒญ ์์๋ ๋ฐ๋์ Upgrade๋ผ๋ ๊ฐ์ ๊ฐ์ง๋ฉฐ, Upgrade์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ๊ฐ์ด ์๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ์ด๋ฉด ์น์์ผ ์ ์์ ์ค์ง์ํต๋๋ค. Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== // ์ ํจํ ์์ฒญ์ธ์ง ํ์ธํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํค ๊ฐ. Sec-WebSocket-Protocol: chat, superchat // ์ฌ์ฉํ๊ณ ์ ํ๋ ํ๋ ์ด์์ ์น ์์ผ ํ๋กํ ์ฝ ์ง์ . // ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ. Sec-WebSocket-Version: 13 // ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ๊ณ ์ ํ๋ ์น์์ผ ํ๋กํ ์ฝ ๋ฒ์ . // ํ์ฌ ์ต์ ๋ฒ์ 13 Origin: http://localhost:9000 // ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ ๋ณด์์ ์ํด ์ด ํค๋๋ฅผ ๋ณด๋ธ๋ค(Cross-Site WebSocket Hijacking์ ๊ฐ์ ๊ณต๊ฒฉ์ ํผํ๊ธฐ ์ํด์). // ๋๋ถ๋ถ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ด ํค๋๊ฐ ์๋ ์์ฒญ์ ๊ฑฐ๋ถํ๋ฉฐ, ์ด๋ฌํ ์ด์ ๋ก CORS์ ์ฑ ์ด ๋ง๋ค์ด์ง ๊ฒ์ด๋ค. // ์ด ์ธ์๋ ์ฌ๋ฌ ๋ฉ์์ง๋ ์๋ธ ํ๋กํ ์ฝ, Referer๋ Cookie์ ๊ฐ์ ๊ณตํต ํค๋, ์ธ์ฆ ํค๋ ๋ฑ์ ์ถ๊ฐํด ๋ณด๋ผ ์๋ ์๋ค.
(2) Data Transfer
ํธ๋์์ดํฌ๋ฅผ ํตํด ์น์์ผ ์ฐ๊ฒฐ์ด ์๋ฆฝ๋๋ฉด, ๋ฐ์ดํฐ ์ ์ก ํํธ๊ฐ ์์๋๋ค. ์ฌ๊ธฐ์์๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ '๋ฉ์์ง'๋ผ๋ ๊ฐ๋ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ฐ, ์ฌ๊ธฐ์ ๋ฉ์์ง๋ ํ ๊ฐ ์ด์์ 'ํ๋ ์'์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
(ํ๋ ์์ ํ ์คํธ(UTF-8) ๋ฐ์ดํฐ, ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ, ์ปจํธ๋กค ํ๋ ์(ํ๋กํ ์ฝ ๋ ๋ฒจ์ ์ ํธ) ๋ฑ์ด ์๋ค)ํธ๋ ์ ฐ์ดํฌ๊ฐ ๋๋ ์์ ๋ถํฐ ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ ์๋ก๊ฐ ์ด์ ์๋์ง ํ์ธํ๊ธฐ ์ํด heartbeat ํจํท์ ๋ณด๋ด๋ฉฐ, ์ฃผ๊ธฐ์ ์ผ๋ก ping์ ๋ณด๋ด ์ฒดํฌํ๋ค. ์ด๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์์ธก์์ ์ค์ ๊ฐ๋ฅํฉ๋๋ค.
(3) Close Handshake
ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋ ์ปค๋ฅ์ ์ ์ข ๋ฃํ๊ธฐ ์ํ ์ปจํธ๋กค ํ๋ ์์ ์ ์กํ ์ ์๋ค. ์ด ์ปจํธ๋กค ํ๋ ์์ Closing Handshake๋ฅผ ์์ํ๋ผ๋ ํน์ ํ ์ปจํธ๋กค ์ํ์ค๋ฅผ ํฌํจํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ ๊ทธ๋ฆผ์์๋ ์๋ฒ๊ฐ ์ปค๋ฅ์ ์ ์ข ๋ฃํ๋ค๋ ํ๋ ์์ ๋ณด๋ด๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ์ด์ ๋ํ ์๋ต์ผ๋ก Close ํ๋ ์์ ์ ์กํ๋ค. ๊ทธ๋ฌ๋ฉด ์น์์ผ ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋๋ค.
์ฐ๊ฒฐ ์ข ๋ฃ ์ดํ์ ์์ ๋๋ ๋ชจ๋ ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ๋ ๋ฒ๋ ค์ง๋ค.