WebSocket은 TCP 소켓 연결을 통해 클라이언트와 서버 간의 양방향 통신을 가능하게 합니다. 일반적인 HTTP 통신에서는 클라이언트가 요청을 보내고 서버가 응답을 반환하는 방식으로 동작합니다. 반면 WebSocket은 클라이언트가 연결을 초기화한 후 지속적으로 열린 연결을 유지하며 양측이 데이터를 자유롭게 보낼 수 있습니다.
최신 브라우저는 대부분 웹 소켓을 지원하며, 노드는 ws
나 Socket.IO
같은 패키지를 통해 웹 소켓 사용 가능합니다.
WebSocket 통신은 처음에 HTTP 요청을 통해 시작됩니다. 이 과정은 "핸드셰이크"라고 불립니다. 클라이언트는 서버에 WebSocket 연결을 요청하는데, 이 과정은 다음과 같습니다.
클라이언트의 업그레이드 요청
Upgrade
헤더가 포함된 특별한 HTTP GET 요청을 보냅니다.Connection: Upgrade
, Upgrade: websocket
등이 명시됩니다.GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
서버의 응답
101 Switching Protocols
라는 상태 코드와 함께 WebSocket 연결을 승인합니다.Sec-WebSocket-Key
를 기반으로 새로운 값을 계산해 Sec-WebSocket-Accept
헤더로 반환합니다. 이를 통해 클라이언트는 서버의 응답이 유효한지 확인할 수 있습니다.HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
핸드셰이크가 완료되면 WebSocket 연결이 확립되며, 이 시점부터는 클라이언트와 서버가 기존의 HTTP 요청/응답 사이클을 벗어나 양방향으로 데이터를 주고받을 수 있게 됩니다.