웹소켓 (WebSocket)
한눈에 보기
웹소켓은 하나의 TCP 연결에서 클라이언트와 서버가 양방향으로 메시지를 주고받는 프로토콜이다. 폴링과 비교하고 핸드셰이크, 프레임, 재접속과 확장 전략을 정리했다.
최종 업데이트 2026.09.17
웹소켓(WebSocket)은 하나의 TCP 연결 위에서 클라이언트와 서버가 서로에게 자유롭게 메시지를 보낼 수 있게 하는 양방향 통신 프로토콜이다. HTTP 요청과 응답의 일회성 구조로는 채팅, 실시간 시세, 협업 편집처럼 서버가 먼저 데이터를 밀어 줘야 하는 서비스를 만들기 어렵기 때문에 등장했다. 최초 연결은 HTTP 핸드셰이크로 시작하지만 업그레이드 이후에는 HTTP와 무관한 자체 프레임 형식으로 통신한다.
HTTP 폴링 방식과의 비교
웹소켓 이전에는 실시간처럼 보이게 하는 우회 기법을 썼다. 각 방식의 원리와 한계를 이해하면 웹소켓의 존재 이유가 분명해진다.
| 방식 | 동작 원리 | 한계 |
|---|---|---|
| 폴링(Polling) | 클라이언트가 일정 주기로 새 데이터가 있는지 반복 요청한다 | 변경이 없어도 요청이 발생해 트래픽이 낭비되고, 주기만큼 지연이 생긴다 |
| 롱 폴링(Long Polling) | 서버가 새 데이터가 생길 때까지 응답을 보류했다가 전달하고, 클라이언트는 즉시 재요청한다 | 지연은 줄지만 요청마다 연결과 헤더 오버헤드가 반복된다 |
| 웹소켓 | 연결을 한 번 맺은 뒤 양쪽이 아무 때나 프레임을 보낸다 | 연결 상태 관리, 재접속, 수평 확장 설계가 필요하다 |
HTTP는 요청 한 번에 응답 한 번이라는 반이중 구조이고 매 요청마다 헤더가 붙지만, 웹소켓은 전이중(full-duplex) 구조에 프레임 헤더가 수 바이트 수준으로 작다. 메시지 빈도가 높고 지연에 민감할수록 웹소켓의 이점이 커진다.
핸드셰이크와 프로토콜 업그레이드
웹소켓 연결은 다음 단계로 수립된다.
- 클라이언트가 일반 HTTP GET 요청에
Upgrade: websocket헤더와 무작위 값인Sec-WebSocket-Key를 담아 보낸다. - 서버가 이 키에 표준에 정의된 고정 문자열을 이어 붙여 SHA-1 해시를 만들고 Base64로 인코딩한 값을
Sec-WebSocket-Accept로 돌려준다. 이 검증으로 상대가 웹소켓을 이해하는 서버임을 확인한다. - 서버가 상태 코드 101(Switching Protocols)로 응답하면 이후 이 TCP 연결은 웹소켓 프레임 전용으로 전환된다.
GET /chat HTTP/1.1
Host: api.devfit.dev
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
업그레이드 이후에는 텍스트 프레임, 바이너리 프레임, 그리고 연결 유지를 위한 핑(ping)과 퐁(pong), 종료를 알리는 클로즈(close) 같은 제어 프레임이 오간다. 주소 체계는 ws:// 와 TLS를 사용하는 wss:// 를 쓰며, 운영 환경에서는 중간 프록시 문제와 도청 방지를 위해 wss를 사용하는 것이 표준적인 선택이다. 한 가지 주의할 점은 웹소켓 핸드셰이크에는 CORS의 프리플라이트가 적용되지 않으므로, 서버가 Origin 헤더를 직접 검증해야 교차 사이트 웹소켓 하이재킹을 막을 수 있다는 것이다.
SSE, Socket.IO와의 차이
실시간 통신 기술을 고를 때 자주 비교되는 대상이 서버 전송 이벤트(SSE, Server-Sent Events)와 Socket.IO다.
| 항목 | 웹소켓 | SSE | Socket.IO |
|---|---|---|---|
| 통신 방향 | 양방향 | 서버에서 클라이언트로 단방향 | 양방향 |
| 프로토콜 | 독자 프로토콜(RFC 6455) | HTTP 위의 이벤트 스트림 | 웹소켓 기반 라이브러리, 폴링 폴백 내장 |
| 데이터 형식 | 텍스트와 바이너리 | 텍스트(UTF-8)만 | 텍스트와 바이너리 |
| 자동 재연결 | 직접 구현 | 브라우저가 기본 제공 | 라이브러리가 제공 |
| 부가 기능 | 없음(직접 구현) | 이벤트 이름, Last-Event-ID 재개 | 룸, 네임스페이스, 메시지 확인 |
서버가 일방적으로 알림이나 진행 상황을 흘려보내기만 하면 되는 경우에는 SSE가 더 단순하고 HTTP 인프라를 그대로 활용할 수 있어 유리하다. Socket.IO는 웹소켓 그 자체가 아니라 웹소켓을 우선 사용하되 실패 시 롱 폴링으로 폴백하고, 재연결과 룸(room) 브로드캐스트 같은 편의 기능을 얹은 라이브러리라는 점을 구분해서 말할 수 있어야 한다. 따라서 Socket.IO 클라이언트는 표준 웹소켓 서버와 직접 통신할 수 없다.
실무 예시와 운영 시 고려 사항
브라우저에서는 표준 WebSocket API로 간단히 연결할 수 있다.
const socket = new WebSocket("wss://api.devfit.dev/chat");
socket.addEventListener("open", () => {
socket.send(JSON.stringify({ type: "join", room: "interview" }));
});
socket.addEventListener("message", (event) => {
const data = JSON.parse(event.data);
console.log("수신:", data);
});
socket.addEventListener("close", () => {
// 지수 백오프로 재연결을 시도한다
});
운영 단계에서는 다음을 함께 설계해야 한다. 첫째, 연결이 끊겼을 때를 대비한 하트비트(ping/pong)와 지수 백오프 재연결 로직이 필요하다. 둘째, 웹소켓은 서버에 연결 상태를 남기는 스테이트풀 통신이므로 서버를 여러 대로 늘리면 Redis Pub/Sub 같은 메시지 브로커로 서버 간 브로드캐스트를 중계해야 한다. 셋째, 로드 밸런서와 리버스 프록시가 Upgrade 헤더를 통과시키도록 설정하고 유휴 타임아웃을 하트비트 주기보다 길게 잡아야 한다. 넷째, 인증은 핸드셰이크 시점의 쿠키나 최초 메시지의 토큰으로 처리하고 연결 수명 동안의 만료 정책도 정해 두어야 한다.
면접에서 이렇게 물어본다
- HTTP 폴링, 롱 폴링, 웹소켓의 동작 차이를 트래픽과 지연 관점에서 비교해 보라.
- 웹소켓 핸드셰이크 과정을 설명하고 Sec-WebSocket-Key가 왜 필요한지 말해 보라.
- SSE와 웹소켓 중 하나를 선택해야 한다면 어떤 기준으로 판단하겠는가.
- Socket.IO는 웹소켓과 무엇이 다르며, 표준 웹소켓 서버와 호환되지 않는 이유는 무엇인가.
- 웹소켓 서버를 수평 확장할 때 생기는 문제와 해결 방법을 설명해 보라.
웹에서 같이 읽기
- 웹 인증 방식 총정리 (Authentication)웹 서비스의 인증은 요청을 보낸 사용자가 누구인지 확인하는 절차다. HTTP는 무상태 프로토콜이므로 로그인 이후 요청마다 사용자를 식별할 수단이 필요하며, 세션, 토큰, API 키, OAuth를 비교해 각 방식의 적합한 상황을 정리한다.
- 쿠키와 세션 (Cookie, Session)쿠키는 서버가 브라우저에 저장하도록 지시하는 작은 키와 값의 쌍이고, 세션은 쿠키를 운반 수단으로 삼아 사용자별 상태를 서버 저장소에 보관하는 기법이다. 두 개념의 동작 원리와 보안 속성, 위협 대응을 다룬다.
- CSR과 SSR (Client Side Rendering, Server Side Rendering)CSR은 브라우저가 자바스크립트로 화면을 그리는 방식, SSR은 서버가 완성된 HTML을 내려보내는 방식이다. 초기 로딩, SEO, 서버 부하 관점의 차이와 SSG, ISR을 포함한 혼합 전략까지 정리한다.
- CSRF와 XSS (Cross Site Request Forgery, Cross Site Scripting)XSS는 공격자의 스크립트를 피해자 브라우저에서 실행시키는 공격이고, CSRF는 로그인된 브라우저를 속여 피해자 명의의 요청을 보내는 공격이다. 두 공격이 악용하는 신뢰 관계의 차이와 방어 수단을 정리한다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기