975. 웹소켓 (WebSocket) - 실시간 양방향 전이중(Full-Duplex) 통신 HTTP 오버헤드 억제 프로토콜 핸드셰이크 지속 연결 웹 채팅/게임 아키텍처
핵심 인사이트: 웹(HTTP)은 기본적으로 쿨가이다. 클라이언트가 "야 뉴스 줘!"(요청) 하면 서버가 "옛다 뉴스!"(응답) 던져주고는 곧바로 전화를 뚝 끊어버린다(Stateless). 근데 주식 호가창이나 채팅방은 0.1초마다 새 메시지가 들어온다. 이걸 HTTP로 하려면 브라우저가 0.1초마다 멱살 잡고 "새 채팅 있어? 있어?" 미친 듯이 새로고침(폴링)을 누르며 서버를 과로사시켜야 한다. "야! HTTP의 끊고 튀는 쿨병을 고쳐! 처음에만 HTTP로 핑퐁 인사(핸드셰이크)를 한 다음, 선을 끊지 말고 영원히 뻥 뚫어놔! 그리고 서버가 원할 때 언제든 클라이언트한테 채팅을 확 밀어 던지게 양방향(Full-Duplex) 파이프를 박아버려!" 웹에서 실시간 채팅과 롤(LoL) 같은 게임을 가능케 한 기적의 파이프, 웹소켓이다.
Ⅰ. 기존 HTTP 통신의 치명적 한계 (실시간성의 부재) 🌟
- 단방향 통신 (Half-Duplex 느낌): 무조건 클라이언트(웹 브라우저)가 먼저 "요청(Request)"을 해야만, 서버가 "응답(Response)"을 줄 수 있습니다. 서버가 나에게 먼저 "야 주식 올랐어!"라고 밀어줄(Push) 방법이 아예 없습니다.
- 눈물겨운 꼼수들 (AJAX, Polling, Long Polling):
- 브라우저가 1초에 한 번씩 "새 카톡 왔어요?" 계속 새로고침을 해서 서버에 물어봅니다(폴링).
- 매번 무거운 HTTP 헤더(껍데기)를 1KB씩 싣고 물어보느라, 실제 대화(1바이트)보다 쓰레기 통신(오버헤드)이 100배 커서 서버 대역폭이 찢어집니다.
Ⅱ. 웹소켓 (WebSocket)의 개념 🌟
- 개념: HTML5 표준의 일부로, 브라우저와 웹 서버 사이에 한 번 연결을 맺으면 끊지 않고(지속 연결), TCP 기반의 완벽한 양방향 전이중(Full-Duplex) 통신 채널을 형성하여 서버가 원할 때 언제든 데이터를 클라이언트로 쏠 수 있게(Push) 해주는 실시간 프로토콜입니다. (
ws://또는 보안 적용된wss://접두사를 씁니다.)
Ⅲ. 웹소켓의 동작 마법 (프로토콜 체인지) 🌟 핵심 🌟
1단계: HTTP의 탈을 쓴 악수 (Handshake)
- 웹소켓은 별도의 이상한 포트를 안 씁니다. 무적의 방화벽 통과를 위해 일반 웹 포트(80번, 443번)를 그대로 씁니다.
- 브라우저가 서버에 평범한 HTTP 요청을 던집니다. 단, 헤더에 폭탄선언을 박습니다.
Connection: UpgradeUpgrade: websocket
- 해석: "서버야, 우리 지금까지 하던 HTTP 단방향 통신 재미없지? 이거 웹소켓 양방향 통신망으로 업그레이드(교체)하자! 콜?"
2단계: 파이프 뚫기 (Switching Protocols)
- 서버가 동의하면 상태 코드
101 Switching Protocols를 반환합니다. - 이 순간, 두 컴퓨터를 잇고 있던 무겁고 답답한 HTTP 프로토콜의 영혼은 증발해 버리고, 그 자리에 가볍고 날쌘 '웹소켓' 프로토콜의 피가 흐르는 고속 터널이 영원히 뚫리게 됩니다.
3단계: 양방향 무제한 폭격 (Full-Duplex)
- 이제 파이프가 뻥 뚫렸습니다. 더 이상 "새 카톡 있어?" 묻지 않아도 됩니다.
- 친구가 카톡을 보내면, 서버가 알아서(Push) 열려있는 터널로 0.01초 만에 내 화면에 "ㅋㅋㅋ" 메시지를 쏴버립니다.
- HTTP의 거대한 1KB짜리 헤더(껍데기) 다 버리고, 고작 2~10바이트 수준의 초경량 프레임 단위로 데이터를 주고받기 때문에, 증권사 주식 호가창이 미친 듯이 깜빡여도 서버가 1도 부담을 안 느끼는 궁극의 효율이 달성됩니다.
Ⅳ. 적용 및 경쟁자
- 적용: 웹 브라우저 기반의 실시간 채팅, 주식 HTS, 캔디크러쉬 같은 멀티플레이어 웹 게임 등 지연시간 0.1초가 생명인 곳의 절대 군주입니다.
- 경쟁자 (SSE, Server-Sent Events):
- 채팅처럼 양방향이 아니라, "주식 시세"처럼 오직 '서버에서 브라우저로 한 방향으로만 쏟아내는(Push)' 거라면 무거운 웹소켓 대신 HTTP 규격에 내장된 단방향 푸시 기술인 **SSE(965번 참조)**를 쓰는 것이 배터리와 성능 면에서 유리합니다. (트레이드오프 선택)
📢 섹션 요약 비유: 기존 HTTP 통신(폴링)은 친구랑 문자로 대화하는데 매번 **'등기 우편'**을 고집하는 짓입니다. "철수야 뭐해?" 편지를 봉투에 넣고 우표(무거운 HTTP 헤더)를 붙여서 우체통에 넣고, 답장이 올 때까지 멍때립니다(오버헤드 지옥). **웹소켓(WebSocket)**은 첫 번째 등기 우편 안에 '종이컵 실 전화기'를 하나 동봉해서 보내는 짓(Upgrade 요청)입니다. 철수가 그걸 뜯어서 귀에 대는 순간(101 응답), 우편 배달은 끝납니다. 이제부터 둘은 팽팽하게 연결된 실 전화기(양방향 터널)를 통해, 편지 봉투나 우표 없이 입만 뻥끗하면 0.01초 만에 서로의 목소리가 직통으로 전달됩니다. 내가 묻기도 전에 철수가 "야 밥 먹자!" 소리치면 즉각 내 귀에 박히는(서버 푸시) 실시간 웹 통신 아키텍처의 혁명입니다.