웹소켓은 서버와 클라이언트 사이의 양방향 통신을 구현할수 있는 기능이다. 웹소켓은 Stateful 통신이다.
HTTP는 Stateless다. Keep-alive로 인하여 커넥션을 재사용하더라도 중간에 로드벨런서에 의해 최초 요청과 다른 서버가 응답을 하더라도 문제가 없다. SSE도 id를 일원화하여 관리할수 있다면 요청을 다루는 서버가 변경되어도 문제가 없다.
하지만 웹소켓은 stateful하기 때문에 클라이언트와 서버는 연결을 유지해야한다. 그렇기 때문에 연결이 끊어졌을 겨우에 대한 적절한 처리와 인프라 구성이 필요하다.
GET /websocket HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xxxxxxxxxx==
Origin: <http://example.com>
Sec-WebSocket-Protocol: chat, my-format
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: 클라이언트가 랜덤하게 선택한 16바이트 값을 base64로 인코딩한 문자열Sec-WebSocket-Version: 웹 소켓 프로토콜 버전 (현재: 13)Sec-WebSocket-Protocol: (옵션) 웹소켓에서 오가는 데이터의 프로토콜 (포멧)HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: xxxxxx==
Sec-WebSocket-Protocol: my-format
Sec-WebSocket-Accept: Sec-WebSocket-Key 뒤에 "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 문자열을 붙인 뒤 SHA-1 해시를 계산한 값을 base64로 인코딩한 값이다. 웹 소켓 요청이
Sec-WebSocket-Protocol: 서버가 선택한 웹소켓 데이터의 포멧