R+7

[TIL] 차근차근 CS (7) - 웹소켓 본문

TIL

[TIL] 차근차근 CS (7) - 웹소켓

prgmd 2026. 7. 16. 11:13

Today I Learned

웹소켓(WebSocket)이란 하나의 TCP 접속 위에서 클라이언트와 서버 간 지속적인 양방향(Full Duplex) 실시간 통신을 가능케 하는 네트워크 기술이다. 양방향이기 때문에 클라이언트 측의 요청(request)이 따로 없어도 서버가 데이터를 보낼 수 있고, 한 번 연결이 성립되면 명시적으로 연결을 끊기 전까지 실시간으로 연결이 유지된다(stateful). 연결을 설정하는 초기 단계에만 HTTP 통신을 사용하고 그 후로는 데이터를 프레임 단위로 교환하기 때문에 오버헤드를 방지할 수도 있다.

 

※ 왜 HTTP는 무거운가?: 무상태성(stateless)을 지향하기 때문에 매 요청마다 필수 메타 데이터를 헤더에 통째로 담아 보내야 하기 때문에 담기는 정보가 매우 많고, 이를 매 통신마다 TCP 핸드셰이크를 반복적으로 해가며 보내야 하기 때문(단방향). 따라서 웹 페이지 로딩이나 이미지 요청 같이 단발성 작업에 최적화된 모델의 경우에 사용. 또한 Cache-Control, ETag 등의 헤더를 통해 CDN 레벨에서 캐싱 인프라를 제공하기 때문에 로딩 속도를 극적으로 단축시킬 수도 있다.

 

동작 원리는 다음과 같다.

  • 오프닝 핸드셰이크: 클라이언트가 표준 HTTP 요청을 서버로 보냄. 헤더에 Upgrade: websocket, Connection: Upgrade 값을 포함해 서버에게 웹소켓 통신 전환을 요청.
  • 서버가 해당 요청을 지원하고 수락시 HTTP 101 Switching Protocols 상태 코드로 응답.
  • HTTP 프로토콜이 웹소켓 프로토콜로 전환. ws:// (암호화된 버전은 wss://) 스키마를 사용해 양방향 통신이 시작됨.
  • 통신 완료시 클라이언트나 서버 둘 중 하나가 종료(close) 프레임 전송. 연결 닫음.

웹소켓의 용도는 주로 실시간 채팅, 라이브 스트리밍, 실시간 데이터 피드 등이 있다. 실시간 채팅의 경우, 각 사용자가 채팅 서버와 단일 웹소켓 연결을 맺고 이를 유지하면서 이용하는 시스템. 만약 10,000명이 채팅창에 접속해 있다면 10,000개의 세션(웹소켓 통로)이 동시에 열린 상태가 된다.

 

사용자 A가 메시지를 입력해 서버로 전송(push)하면, 서버가 해당 채팅방에 연결되어 있는 다른 사용자 B, C들의 웹소켓 세션을 식별한다. 이후 바로 사용자 A의 요청 없이도 메시지를 브로드캐스팅. 이 때 중요한 건, 상대방이 메시지를 보냈는지 확인을 위해 주기적으로 서버에 묻는 Polling 과정을 없애고, 상대방이 입력 중, 읽음 상태까지 지연 없이 양방향으로 교환할 수 있게 해준다.

 

라이브 스트리밍의 경우 UDP 기반 WebRTC를 주로 사용하는 편이고, 실시간 상호작용 처리를 위해 웹소켓을 병행 연결하는 편이다. 사용자가 입력한 라이브 채팅, 실시간 시청자수 증감, 후원 알림, 좋아요 버튼 등 이벤트를 전체 시청자 화면에 동기화한다. WebRTC 시그널링의 경우 WebRTC 환경에서 P2P 연결을 맺기 전, Peer 간 통신 규격이나 네트워크 경로 정보(SDP, ICE Candidate 등)를 교환하는 초기 통로로 사용한다.


Today I Listend to