WebSocket 이란?

Jiseong Choi·2025년 4월 21일

네트워크

목록 보기
1/1
post-thumbnail

이번 포스트에서는 이전에 프로젝트를 진행하면서 사용하였던 WebSocket 프로토콜에 대해 자세히 알아보려고 한다!

✨ WebSocket이란?

WebSocket은 클라이언트(보통은 웹 브라우저)와 서버 간에 하나의 TCP 연결을 유지하면서 양방향 통신을 가능하게 해주는 프로토콜이다.

  • HTTP처럼 TCP 위에서 동작하지만, 요청-응답이 아닌 전이중(Full Duplex) 통신을 지원한다.
  • 단 한 번의 연결로 양방향으로 자유롭게 데이터를 주고받을 수 있다.
  • 2011년 RFC 6455를 통해 표준으로 제정되었다.

🧠 WebSocket은 전송 계층 프로토콜일까?

정확히 말하면, WebSocket은 전송 계층(Transport Layer) 프로토콜이 아니다.

WebSocket은 TCP(전송 계층)를 기반으로 동작하는 애플리케이션 계층(Application Layer) 프로토콜이다.
즉:

  • TCP는 데이터를 신뢰성 있게 전송하는 전송 계층 프로토콜
  • WebSocket은 그 위에서 메시지 프레이밍, 양방향 통신, 핸드셰이크 등 고수준 통신 규약을 정의하는 애플리케이션 계층 프로토콜

OSI 7계층 기준으로 보면:

계층예시WebSocket
7 - 애플리케이션HTTP, FTP, WebSocket✅ WebSocket 위치
4 - 전송TCP, UDP⚙️ WebSocket이 사용하는 기반

따라서 WebSocket은 전송 계층을 '사용'할 뿐, 그 자체는 애플리케이션 계층에 속한다.


🧠 WebSocket이 왜 필요한가?

HTTP는 클라이언트가 요청해야 서버가 응답할 수 있는 단방향 통신 구조이다.
따라서 서버가 클라이언트에게 먼저 데이터를 보낼 수 없다.

이를 극복하기 위한 방식으로는 다음과 같은 것들이 있었다:

방식설명한계
Polling클라이언트가 일정 주기로 서버에 요청실시간성 부족, 서버 과부하
Long Polling서버가 응답을 지연하다가 새 데이터가 생기면 응답지연 시간, 다중 연결 유지 필요
SSE (Server Sent Events)서버에서 클라이언트로 단방향 스트리밍클라이언트 → 서버 전송 불가

⬇️ 이 모든 방식은 HTTP의 틀을 억지로 비틀어 쓴 방식이다.

✅ WebSocket은 이 한계를 완전히 극복한 기술이다.


⚖️ WebSocket 프로토콜 구조 (RFC 6455)

1. Handshake (초기 연결)

WebSocket은 HTTP 기반으로 연결을 시작한다. 이 과정을 Handshake라고 한다.

📉 클라이언트 요청 예시:

GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket - 'WebSocket으로 프로토콜을 바꾸고 싶다'라는 명시적인 요청
Connection: Upgrade - 'Upgrade 요청을 실제로 적용하'라는 지시
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

📊 서버 응답 예시:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  • 이 과정을 통해 HTTP → WebSocket 프로토콜로 업그레이드된다.
  • 보안 연결은 wss://를 사용하며, TLS(SSL) 기반이다.

2. 메시지 프레임 구조

WebSocket은 메시지를 프레임 단위로 분할해서 전송한다.

  • 프레임 - 애플리케이션 계층에서 데이터를 전송하는 단위

프레임은 크게 다음과 같은 종류가 있다:

  • ✉️ 텍스트 프레임: UTF-8 인코딩된 문자열
  • 📂 바이너리 프레임: ArrayBuffer, Blob 등
  • ⚖️ 제어 프레임: ping, pong, close

💡 프레임은 WebSocket 자체의 논리적 단위이며,
실제로는 TCP 위에서 전송되고 TCP는 내부적으로 이를 여러 개의 IP 패킷으로 나눠 전송할 수 있다.

즉, WebSocket 프레임은 TCP 세그먼트를 통해 전송되며,
세그먼트가 패킷으로 캡슐화되어 전송
되는 구조이다.

3. 연결 유지 및 종료

  • ping/pong 프레임을 통해 연결이 살아있는지 확인한다.
  • 클라이언트나 서버는 close 프레임을 통해 연결을 종료할 수 있다.

🔄 Ping / Pong 프레임이란?

  • ping: 연결이 유효한지 확인하기 위해 클라이언트 또는 서버가 보낸다.
  • pong: ping에 대한 응답으로 자동 혹은 수동으로 전송된다.
  • 주로 유휴 연결 상태를 확인하거나, 타임아웃 감지를 위한 헬스체크 용도로 사용된다.

예시 흐름:

  • 서버 → ping → 클라이언트
  • 클라이언트 → pong 자동 응답 (라이브러리에서 처리)

ping/pong 프레임은 RFC6455에 따라 제어 프레임(control frame)에 속하며, 응답이 오지 않으면 연결을 종료하거나 재연결할 수 있는 근거가 된다.


💻 브라우저에서의 WebSocket 사용법 (MDN 기준)

const socket = new WebSocket("wss://example.com/socket");

socket.addEventListener("open", () => {
  console.log("WebSocket 연결 완료");
  socket.send("Hello, server!");
});

socket.addEventListener("message", (event) => {
  console.log("서버로부터 메시지:", event.data);
});

socket.addEventListener("close", () => {
  console.log("연결 종료");
});

socket.addEventListener("error", (err) => {
  console.error("에러 발생:", err);
});
  • ws:// 또는 wss://로 URL을 시작한다.
  • 연결이 열리면 메시지를 자유롭게 주고받을 수 있다.

⚠️ WebSocket의 한계와 주의사항

1. 상태 유지 비용이 높다

  • 연결 유지 기반이라 서버 리소스를 많이 차지한다. (메모리, 커넥션 수 등)
  • 수천~수만 사용자 연결 시 서버 확장을 고려할 필요가 있다. (e.g. Redis adapter, sticky session)

2. HTTP/2, HTTP/3과의 통합이 제한적

  • WebSocket은 HTTP/1.1에 최적화 되어있다.
  • HTTP/2/3에서는 멀티플렉싱과의 충돌로 비표준 확장에 의존해야 한다.

3. 프록시/방화벽 간섭

  • 사내망이나 공공 네트워크에서 WebSocket 업그레이드 요청이 차단될 수 있다.

4. 인증 처리 복잡성

  • WebSocket은 자체 인증 체계 없다.
  • JWT나 세션 토큰 등을 handshake 시 직접 처리해야 한다.

5. 기존 HTTP 인프라와 통합 어려움

  • REST 미들웨어, 로깅 시스템과 호환하려면 별도 설계 필요하다.

✅ WebSocket이 적합한 상황

  • 실시간 채팅, 메신저
  • 주식, 코인, 환율 실시간 시세 서비스
  • 온라인 게임 (빠른 동기화 필요)
  • 문서 협업 툴 (실시간 동시 편집)
  • IoT 디바이스 데이터 스트리밍
  • 실시간 알림 시스템 (push notification)

단순 API, 낮은 빈도의 요청이라면 오히려 REST가 효율적일 수 있다.


📝 정리

  • WebSocket은 HTTP보다 실시간성과 효율성이 뛰어나다.
  • 연결 유지 비용이 낮고, 헤더 오버헤드도 적다.
  • 인증 처리 시 Handshake에 토큰을 함께 전송하거나 query, headers 활용이 가능하다.
  • 모바일 환경에서는 자동 재연결 로직ping/pong 감지가 중요하다.
  • 실시간 채팅, 게임, 주식 시세, IoT 등에서 필수 기술이다.

🔗 참고한 문서들

profile
나 혼자 공부하고, 끄적이는 공간. (Node.JS / Back-End Developer)

0개의 댓글