웹소켓의 특징은 HTTP/HTTPS로 연결을 맺고, HTTP 포트(80)이나 HTTPS 포트(443)을 통해 통신한다는 점입니다. 또한, 한번 연결을 맺으면 직접 닫을때까지 연결이 유지됩니다.
Connection: Upgrade
keep-alive
를 명시해서 연결이 이어지도록 합니다.Upgrade
를 기입하여 요청함으로써, 연결을 유지하면서 다른 프로토콜을 사용할 것이라는 신호를 보냅니다.Upgrade: websocket
Sec-WebSocket-Key: YWJjZGVmZ3JhYmRlcWFmZQ==
Sec-WebSocket-Version:13
<웹소켓 연결 요청 예시>
GET ws://example.com HTTP/1.1
Host: localhost:28282
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: YWJjZGVmZ3JhYmRlcWFmZQ==
서버는 HTTP 요청에 대한 응답을 합니다. 프로토콜 Upgrade에 대한 요청이 성공하면, 101 상태코드와 함께 어느 프로토콜로 변경되는지에 대한 정보를 헤더에 기입해 보내주어야합니다.
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: NmI2YTJiNzc4ZTA3NjBkYmMzOGQzOWVjMDQ5YjhlZDIxNmRkMzViNw==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: NmI2YTJiNzc4ZTA3NjBkYmMzOGQzOWVjMDQ5YjhlZDIxNmRkMzViNw==
Sec-WebSocket-Key
값과 258EAFA5-E914-47DA-95CA-C5AB0DC85B11
를 붙여서 SHA-1로 해싱한 후, base64 인코딩을 해서 나온 값을 해당 헤더에 첨부해 보냅니다.Sec-WebSocket-Key
와 Sec-WebSocket-Accept
를 첨부하는 이유는, 클라이언트와 서버가 서로 웹소켓 프로토콜을 지원하는지 확인하기 위함입니다. 만약, 한쪽이 프로토콜을 지원하지 않는다면 웹소켓 데이터를 단순한 HTTP 요청으로 취급하기 때문에 잠재적인 보안 이슈가 발생할 수 있습니다.WebSocket은 http 프로토콜을 따르는 것이 아니라, WebSocket이라는 새로운 프로토콜을 따릅니다. 따라서, ws:
이나 wss:
와 같은 scheme을 사용합니다.
https://sookocheff.com/post/networking/how-do-websockets-work/