WebSocket은 클라이언트와 서버 간의 양방향 통신(full-duplex)을 지원하는 네트워크 프로토콜이다. HTTP 프로토콜 기반의 기존 통신 방식이 요청-응답(request-response) 모델을 따르는 반면, WebSocket은 지속적인 연결(persistent connection)을 통해 실시간 데이터 송수신이 가능하다.
WebSocket은 다음과 같은 단계로 작동한다.
HTTP Upgrade 요청
클라이언트는 최초에 일반적인 HTTP 요청으로 WebSocket 연결을 시도한다. 이 요청에 포함되는 헤더는 다음과 같다.
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
서버의 응답 및 프로토콜 업그레이드
서버가 이를 수락하면, 아래와 같은 형식으로 응답하여 WebSocket 프로토콜로 업그레이드된다.
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
연결 이후
연결이 성립되면, 별도의 요청 없이 양방향 통신이 가능해진다. 클라이언트와 서버는 서로에게 메시지를 푸시 방식으로 전송할 수 있다.
| 특징 | 설명 |
|---|---|
| Full-Duplex 통신 | 클라이언트와 서버 간에 동시에 데이터를 주고받을 수 있음 |
| Persistent Connection | 최초 연결 이후 연결이 지속되며, 오버헤드가 줄어듦 |
| Low Latency | 요청-응답 없이 데이터 송수신이 가능하므로 지연 시간 감소 |
| Header Overhead 감소 | HTTP 요청 대비 메시지 헤더 크기가 매우 작음 |
| 항목 | HTTP | WebSocket |
|---|---|---|
| 연결 방식 | 요청-응답 (Half-duplex) | 지속 연결 (Full-duplex) |
| 통신 방향 | 단방향 | 양방향 |
| 성능 | 높은 오버헤드 | 낮은 오버헤드 |
| 실시간성 | 낮음 | 높음 |
WebSocket은 전송되는 데이터 단위를 프레임(Frame)으로 처리한다.
대부분의 현대 브라우저(Chrome, Firefox, Safari, Edge)는 WebSocket을 기본적으로 지원한다. 클라이언트에서의 사용 예시는 다음과 같다.
const socket = new WebSocket("wss://example.com/ws");
socket.onopen = () => {
socket.send("Hello Server");
};
socket.onmessage = (event) => {
console.log("Received:", event.data);
};
var upgrader = websocket.Upgrader{}
func handleConnection(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Upgrade error:", err)
return
}
defer conn.Close()
for {
_, msg, err := conn.ReadMessage()
if err != nil {
log.Println("Read error:", err)
break
}
log.Println("Received:", string(msg))
conn.WriteMessage(websocket.TextMessage, []byte("Echo: "+string(msg)))
}
}
WebSocket은 HTTP 기반 웹 애플리케이션의 한계를 극복하기 위해 등장한 효율적인 실시간 통신 프로토콜이다. 기존의 요청-응답 방식이 가지는 지연 문제를 해결하고, 서버의 이벤트를 클라이언트에 푸시할 수 있는 구조를 통해 높은 실시간성과 효율성을 제공한다. 따라서, 채팅 시스템, 게임 서버, 실시간 데이터 시각화와 같은 다양한 분야에서 필수적으로 사용되고 있다.