WebSocket
- HTTP처럼, TCP를 기반으로 한 OSI 7(Application) Layer 프로토콜의 한 종류이다.
- 웹 클라이언트와 서버 간에 양방향 전 이중 통신을 하고자 할 때 사용한다.
- 주식 차트와 같은 실시간 서비스 혹은 채팅 서비스 APP 등에 주로 사용된다.
- server push notification 서비스 구현에도 사용되곤 하나,
이 때는 SSE(Server Sent Event)를 두고 고려해볼 수 있다.
- HTML5에 들어서 웹 표준 기술이 되었다.
- 이전에는, 다소 비효율적인 방법인 polling 등을 통해
실시간 및 양방향 서비스를 구현하곤 했다.
- URL 형식은
ws://
, wss://
따위이다.
- HTTP/S가 아니지만, 80/443번 포트를 사용하도록 설계되었다.
- 메시지의 header가 작아, overhead(간접적인 자원)를 줄일 수 있다.
HTTP vs WebSocket
- request-response 관점이 아니라, connection open-close 및 message send-receive 관점이다.
- WebSocket connection이 open되기 위해선,
우선 최초에는 클라이언트의 HTTP request로 시작하여
프로토콜을 upgrade 하자는 handshake를 하며,
서버의 응답에 따라 이후로 WebSocket 통신이 가능해진다.
- 클라이언트의 request에 따라 서버는 response만 할 수 있는 방식이 아니라,
서버가 원하는 때에도 송신할 수 있다.
- 이를 위해, HTTP와는 달리 connection을 유지한다.
즉, stateful하다고 할 수 있다.
Socket.IO
- client와 server간에 실시간 양방향 통신 구현을 지원하는 라이브러리이다.
- 웹 브라우저마다 지원하는 WebSocket 버전이 다르며,
오래된 브라우저의 경우에는 아예 이 프로토콜을 지원하지 않는 경우도 있다.
그러므로, 웹 브라우저와 서버의 종류 및 버전에 따라,
WebSocket 프로토콜 뿐만 아니라 HTTP polling, streaming, flash socket 등
이 중 하나의 방법을 사용하여, 브라우저에 관계없이 실시간 통신이 가능하게 해준다.
- polling 방식으로 하게 되면,
클라이언트 측에서 메시지를 보낼 땐 POST, 받을 땐 GET하여 실시간 통신한다.
즉, 메시지를 주고 받음에 따라 network탭에 HTTP 통신이 매번 발생한다.
- WebScoket 방식으로 하게 되면,
최초에 handshake를 할 때는 HTTP(polling)로 하고, upgrade: WebSocket 이후에는
HTTP가 아니라 WebSocket으로 양방향 통신을 하게 된다.
- 메시지 내역은 ‘Messages’에서 확인할 수 있다.
- 다음과 같은 다양한 기능을 지원한다.
- 소켓 연결 실패 시, fallback을 통해 자동으로 재연결 시도를 하는 기능이 있다.
- room을 이용해, 일부 클라이언트에게만 메시지 전송이 가능하다.