WebSocket은 TCP 프로토콜을 기반으로 하는 전이중(Full-Duplex) 통신 프로토콜로, 웹 클라이언트와 서버 간에 실시간 양방향 통신을 가능하게 한다. 기존의 HTTP 방식이 요청-응답(Request-Response) 구조로 매 요청마다 연결을 새롭게 설정하는 데 비해, WebSocket은 연결을 지속적으로 유지하여 데이터를 자유롭게 주고받을 수 있다.
WebSocket 연결은 다음과 같은 과정으로 수립된다.
Handshake 과정
클라이언트가 서버에 연결을 요청할 때 HTTP 프로토콜로 초기 Handshake가 이루어진다. 이 과정에서 클라이언트는 WebSocket 프로토콜 업그레이드를 요청하며, 서버가 이를 승인하면 연결이 성립된다.
Handshake 예시:
클라이언트 요청:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
서버 응답:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Accept 헤더 값은 클라이언트가 보낸 Sec-WebSocket-Key에 정해진 문자열(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)을 붙인 후, SHA-1 해시 처리하고 Base64로 인코딩한 값이다.
연결 유지
Handshake가 완료된 후, 연결은 TCP 기반으로 지속적으로 유지된다. 이는 불필요한 HTTP 헤더 전송을 없애 네트워크 오버헤드를 감소시킨다.
데이터 전송 (메시지 전송)
WebSocket에서 데이터는 프레임(Frame) 단위로 전송되며, 데이터 유형(텍스트 또는 바이너리)을 명시한다. 프레임 구조는 효율적인 데이터 송수신과 제어를 지원한다.
연결 종료
연결 종료는 양측 모두가 할 수 있으며, Close 프레임을 송신하여 연결을 정상적으로 종료한다.
WebSocket 프레임은 다음과 같은 구조를 가진다.
실시간 양방향 통신
서버와 클라이언트가 동시에 데이터를 전송할 수 있어 채팅, 알림, 실시간 데이터 업데이트 등의 서비스 구현에 적합하다.
낮은 오버헤드
연결을 유지하여 HTTP 헤더의 반복 전송을 방지함으로써 네트워크 부하를 최소화한다.
확장성
프로토콜은 확장 가능하며 다양한 서브 프로토콜을 정의하여 추가 기능을 지원할 수 있다.
WebSocket의 대표적 활용 사례는 다음과 같다.
상태 관리
연결 유지로 인해 서버가 많은 동시 접속을 처리하려면 메모리와 자원 관리가 필수적이다.
브라우저 호환성
오래된 브라우저에서는 WebSocket을 지원하지 않을 수 있으며, 이때는 폴백(Fallback) 메커니즘(예: Long Polling)을 사용해야 한다.
결론적으로, WebSocket은 HTTP의 한계를 극복하고 실시간 상호작용 애플리케이션 개발에 강력한 도구로 자리 잡고 있다. 다만 효율적인 자원 관리 및 상태 유지에 대한 설계를 반드시 고려하여 사용해야 한다.