HTTP/1.1 에서 WebSocket 으로
겉보기의 마법을 걷어 내면 WebSocket 핸드셰이크는 핵심 헤더 네 개를 담은 HTTP/1.1 GET 요청이야. 바로 Upgrade: websocket, Connection: Upgrade, Sec-WebSocket-Key, Sec-WebSocket-Version: 13 이지. 서버는 이 헤더를 알아보고 파생 값을 계산한 뒤 101 Switching Protocols 로 응답해.
Sec-WebSocket-Accept 해시
클라이언트는 무작위 논스를 base64 로 인코딩해 Sec-WebSocket-Key 로 보내. 서버는 여기에 고정된 매직 GUID(258EAFA5-E914-47DA-95CA-C5AB0DC85B11) 를 이어 붙이고 SHA-1 해시를 계산한 다음, 그 결과를 다시 base64 로 인코딩해 Sec-WebSocket-Accept 로 돌려줘. 서버가 WebSocket 프로토콜을 실제로 이해한다는 증거라서 일반 HTTP 서버가 우연히 핸드셰이크를 끝낼 수 없어.
선택형 핸드셰이크 헤더
Sec-WebSocket-Protocol 은 graphql-ws나 mqtt 같은 하위 프로토콜을 협상할 때 써. Sec-WebSocket-Extensions 는 확장 기능을 협상하며, 가장 흔한 예가 압축을 위한 permessage-deflate 야. Origin 은 연결을 요청한 페이지를 나타내니 서버에서 반드시 검증해야 해.