WebSocket: 실시간 양방향 통신 프로토콜

shjk·2025년 4월 7일

개요

WebSocket은 클라이언트와 서버 간의 양방향 통신(full-duplex)을 지원하는 네트워크 프로토콜이다. HTTP 프로토콜 기반의 기존 통신 방식이 요청-응답(request-response) 모델을 따르는 반면, WebSocket은 지속적인 연결(persistent connection)을 통해 실시간 데이터 송수신이 가능하다.

프로토콜 개요

WebSocket은 다음과 같은 단계로 작동한다.

  1. HTTP Upgrade 요청
    클라이언트는 최초에 일반적인 HTTP 요청으로 WebSocket 연결을 시도한다. 이 요청에 포함되는 헤더는 다음과 같다.

    GET /chat HTTP/1.1
    Host: example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Sec-WebSocket-Version: 13
  2. 서버의 응답 및 프로토콜 업그레이드
    서버가 이를 수락하면, 아래와 같은 형식으로 응답하여 WebSocket 프로토콜로 업그레이드된다.

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  3. 연결 이후
    연결이 성립되면, 별도의 요청 없이 양방향 통신이 가능해진다. 클라이언트와 서버는 서로에게 메시지를 푸시 방식으로 전송할 수 있다.

특징

특징설명
Full-Duplex 통신클라이언트와 서버 간에 동시에 데이터를 주고받을 수 있음
Persistent Connection최초 연결 이후 연결이 지속되며, 오버헤드가 줄어듦
Low Latency요청-응답 없이 데이터 송수신이 가능하므로 지연 시간 감소
Header Overhead 감소HTTP 요청 대비 메시지 헤더 크기가 매우 작음

WebSocket과 HTTP의 비교

항목HTTPWebSocket
연결 방식요청-응답 (Half-duplex)지속 연결 (Full-duplex)
통신 방향단방향양방향
성능높은 오버헤드낮은 오버헤드
실시간성낮음높음

사용 예시

  • 채팅 애플리케이션
  • 실시간 게임
  • 주식 시세 전송
  • 협업 툴 (Google Docs 등)
  • 실시간 알림 시스템

WebSocket 메시지 구조

WebSocket은 전송되는 데이터 단위를 프레임(Frame)으로 처리한다.

  • 텍스트 프레임: UTF-8 인코딩 문자열
  • 바이너리 프레임: Blob 또는 ArrayBuffer
  • 컨트롤 프레임: 연결 종료, Ping/Pong 등

브라우저 지원

대부분의 현대 브라우저(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);
};

서버 구현 예시 (Go)

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 기반 웹 애플리케이션의 한계를 극복하기 위해 등장한 효율적인 실시간 통신 프로토콜이다. 기존의 요청-응답 방식이 가지는 지연 문제를 해결하고, 서버의 이벤트를 클라이언트에 푸시할 수 있는 구조를 통해 높은 실시간성과 효율성을 제공한다. 따라서, 채팅 시스템, 게임 서버, 실시간 데이터 시각화와 같은 다양한 분야에서 필수적으로 사용되고 있다.

profile
백엔드 개발자

0개의 댓글