Skip to content

WebSocket / SSE (Server-Sent Events)

웹 애플리케이션에서 클라이언트와 서버 간 양방향 통신, 혹은 실시간 데이터 푸시를 구현하기 위해 주로 사용하는 두 가지 기술이다. 각각의 특징과 장단점이 명확하므로, 서비스 요구사항에 맞춰 적절한 기술을 선택해야 한다.

1. WebSocket (웹소켓)

웹소켓은 하나의 TCP 접속을 통해 양방향(Full-Duplex) 통신 채널을 제공하는 컴퓨터 통신 프로토콜이다. 일반적인 HTTP 요청-응답 모델과 달리, 한 번 연결을 수립하면 클라이언트와 서버 모두가 원할 때 데이터를 보낼 수 있다.

특징 및 동작 방식

  • 연결 과정: 초기에는 HTTP 프로토콜을 통해 Handshake 과정을 거친다. 클라이언트가 HTTP Request 헤더에 Upgrade: websocket을 포함하여 요청하면, 서버가 101 상태 코드(Switching Protocols)로 응답하여 프로토콜을 웹소켓으로 전환한다.
  • 양방향 통신(Full-Duplex): 연결 후에는 HTTP 오버헤드 없이 양쪽에서 실시간으로 데이터를 주고받는다.
  • 포맷: 데이터는 프레임(Frame) 단위로 쪼개어 텍스트(Text) 또는 바이너리(Binary) 데이터(예: 이미지, 오디오) 형태로 교환된다.
  • 장점: HTTP 헤더가 매번 전송되지 않아 네트워크 오버헤드가 적다. 채팅, 멀티플레이어 게임, 주식 티커처럼 실시간 양방향 통신이 필수인 환경에 적합하다.
  • 단점: 서버와 클라이언트 간의 연결 상태를 유지해야 하므로, 연결 관리에 따른 서버 자원(메모리, 파일 디스크립터) 소모가 크고, 로드 밸런싱이나 확장이 HTTP 통신보다 까다롭다.

2. SSE (Server-Sent Events)

SSE는 클라이언트가 한 번 서버와 연결을 맺으면, 서버에서 클라이언트로만 단방향(One-Way) 데이터를 푸시하는 기술이다. 별도의 프로토콜 없이 순수 HTTP(HTTP/1.1 또는 HTTP/2)를 기반으로 동작한다.

특징 및 동작 방식

  • 연결 과정: 클라이언트가 서버에 Accept: text/event-stream 헤더와 함께 HTTP GET 요청을 보낸다. 서버는 Content-Type: text/event-stream으로 응답하며 연결을 열어둔 채 스트림 형태로 데이터를 계속 전송한다.
  • 단방향 통신: 서버 -> 클라이언트 방향으로만 데이터를 전송한다. 클라이언트가 서버로 메시지를 보내려면 별도의 HTTP 요청(AJAX 등)을 해야 한다.
  • 자동 재연결: 웹 브라우저의 EventSource API를 통해 연결이 끊어지면 자동으로 재연결을 시도한다. (웹소켓에는 이 기능이 내장되어 있지 않아 직접 구현해야 함)
  • 장점: HTTP 프로토콜을 그대로 사용하므로 기존 방화벽이나 인프라(로드 밸런서 등)를 그대로 활용하기 좋고, 구현이 상대적으로 단순하다. 뉴스 피드, 실시간 알림 등 서버에서 클라이언트로 일방향 푸시만 필요한 경우에 효율적이다.
  • 단점: 양방향 통신이 불가능하며, 브라우저에 따라 동시 연결 수 제한(HTTP/1.1 기준 브라우저당 보통 6개)이 있다. 텍스트 포맷(UTF-8)만 지원한다.

3. 요약 비교

특징WebSocketSSE (Server-Sent Events)
통신 방향양방향 (Full-Duplex)단방향 (서버 -> 클라이언트)
프로토콜WebSocket (ws://, wss://)HTTP (http://, https://)
데이터 포맷텍스트, 바이너리 모두 지원텍스트 기반 (UTF-8)
연결 지속(재접속)수동 구현 필요브라우저 내장(자동 재연결)
주요 활용 사례채팅방, 실시간 멀티플레이어 게임, 협업 툴SNS 피드, 주식 시세 알림(단방향), 푸시 알림