[네트워크] 실시간 통신 기술 - ws:// 와 wss:// 차이와 WebSocket 동작 원리
이전에 Polling, Long Polling, WebSocket의 차이를 정리하면서
WebSocket은 “연결을 유지하면서 실시간 통신을 하는 방식”이라고 설명했다.
그런데 조금 더 깊게 들어가보면 궁금한 점이 생긴다.
- WebSocket은 어떻게 연결되는 걸까?
- 왜 처음에는 HTTP로 시작할까?
- 연결 이후에는 왜 HTTP가 아닐까?
- ws:// 와 wss:// 는 무슨 차이일까?
이번 글에서는 WebSocket이 실제로 연결되는 과정과 내부 동작 방식을 정리해보려고 한다.
1. 처음부터 WebSocket인 것은 아니다
많이 헷갈리는 부분인데,
WebSocket 연결은 처음부터 WebSocket 프로토콜로 시작하지 않는다.
처음에는 일반 HTTP 요청으로 시작한다.
즉:
클라이언트 → 서버 : HTTP 요청
으로 연결을 시작한 뒤,
이 연결을 WebSocket으로 “업그레이드(Upgrade)” 하는 방식이다.
왜 굳이 HTTP로 시작할까?
이유는 간단하다.
기존 웹 환경과 호환성을 유지하기 위해서다.
브라우저는 기본적으로 HTTP 통신을 기반으로 동작한다.
그래서:
- 기존 웹 서버
- 프록시 서버
- 방화벽
- 네트워크 인프라
와 자연스럽게 연결되기 위해 처음에는 HTTP를 사용한다.
즉, WebSocket은 기존 HTTP 위에서 시작되는 확장 프로토콜이라고 볼 수 있다.
2. WebSocket Handshake 과정
WebSocket 연결 과정에서 가장 중요한 부분이 Handshake다.
클라이언트가 서버에게:
“나 WebSocket으로 통신하고 싶은데 가능해?”
라고 요청하고,
서버가 허용하면 연결이 업그레이드된다.
클라이언트 요청
브라우저는 서버에 다음과 비슷한 HTTP 요청을 보낸다.
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: abc123
Sec-WebSocket-Version: 13
여기서 중요한 건:
Upgrade: websocket
이다.
이 헤더가:
"HTTP 연결을 WebSocket으로 바꾸고 싶다"
라는 의미다.
서버 응답
서버가 WebSocket 연결을 허용하면 다음과 같이 응답한다.
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
여기서 핵심은:
101 Switching Protocols
이다.
즉:
"좋아. 이제부터 HTTP 말고 WebSocket 프로토콜로 통신하자"
라는 의미다.
이 순간부터 연결이 WebSocket으로 전환된다.
3. 연결 이후에는 왜 HTTP가 아닐까?
Handshake 이후에는 더 이상 HTTP Request/Response 구조를 사용하지 않는다.
원래 HTTP는 이런 구조다.
요청 → 응답 → 연결 종료
하지만 WebSocket은:
연결 유지
가 핵심이다.
즉, 한 번 연결되면 끊지 않고 계속 데이터를 주고받는다.
그래서 이후에는 HTTP 헤더를 반복해서 보내지 않는다.
HTTP 방식의 문제점
만약 채팅을 HTTP만으로 처리한다고 가정하면:
메시지 보낼 때마다
HTTP 요청 + HTTP 헤더 전송
이 계속 반복된다.
즉:
- 요청 생성
- 헤더 전송
- 응답 대기
- 연결 관리
같은 비용이 계속 발생한다.
실시간 서비스에서는 굉장히 비효율적이다.
WebSocket은 왜 빠를까?
WebSocket은 최초 연결 이후에는 헤더를 반복적으로 보내지 않는다.
즉:
연결 1번
→ 이후 데이터만 계속 전송
하는 구조다.
그래서:
- 네트워크 오버헤드 감소
- 빠른 데이터 전송
- 실시간 처리 가능
같은 장점이 생긴다. 채팅이나 게임에서 WebSocket을 많이 사용하는 이유도 이 때문이다.
4. ws:// 와 wss:// 차이
WebSocket 주소를 보면 보통 두 가지가 있다.
ws://
wss://
ws://
일반 WebSocket 연결이다.
HTTP와 비슷하게 암호화되지 않은 연결이다.
즉:
HTTP ↔ ws
관계라고 볼 수 있다.
wss://
SSL/TLS 기반으로 암호화된 WebSocket 연결이다.
HTTPS의 WebSocket 버전이라고 생각하면 이해하기 쉽다.
즉:
HTTPS ↔ wss
관계다.
왜 wss:// 를 많이 사용할까?
요즘 대부분 사이트는 HTTPS 기반이다.
브라우저 보안 정책 때문에 HTTPS 사이트에서는 보통 ws:// 연결을 차단한다.
즉:
HTTPS 페이지
→ wss:// 사용 권장
이다.
실제 서비스에서는 대부분 wss:// 를 사용한다고 보면 된다.
5. WebSocket은 TCP 기반이다
이 부분도 꽤 중요하다.
WebSocket은 TCP 위에서 동작한다.
즉:
WebSocket
→ TCP 기반
→ 연결 지향 방식
이다.
그래서:
- 데이터 순서 보장
- 신뢰성 보장
- 패킷 유실 최소화
같은 특징을 가진다.
반대로 UDP 기반처럼 빠르지는 않지만 안정적이다.
6. WebSocket의 한계
WebSocket은 강력하지만 단점도 있다.
연결 유지 비용
사용자마다 연결을 계속 유지해야 한다.
즉 사용자가 많아질수록:
- 메모리 사용 증가
- 서버 연결 수 증가
문제가 발생할 수 있다.
서버 구조 복잡도 증가
실시간 채팅 같은 서비스를 여러 서버로 운영하면:
사용자 A는 1번 서버
사용자 B는 2번 서버
처럼 연결될 수 있다.
이 경우 서버끼리 메시지를 공유해야 한다.
그래서 실제 서비스에서는 Redis Pub/Sub 같은 구조를 함께 사용하는 경우가 많다.
정리
WebSocket은 단순히 “실시간 통신 기술”이라기보다,
HTTP의 한계를 보완하기 위해 등장한 지속 연결 기반 프로토콜에 가깝다.
핵심 흐름을 정리하면:
1. HTTP 요청으로 시작
2. Upgrade 요청
3. Handshake 수행
4. WebSocket 연결 전환
5. 연결 유지 상태로 양방향 통신
그리고 가장 중요한 특징은:
서버와 클라이언트가
자유롭게 데이터를 주고받을 수 있다
는 점이다.
처음에는 단순히 “WebSocket은 실시간 통신용” 정도로만 알고 있었는데,
실제로는 HTTP에서 시작해서 프로토콜을 업그레이드한다는 점이 꽤 흥미로웠다.
특히 왜 HTTP 기반 방식(Polling, Long Polling)이 비효율적이었는지,
왜 WebSocket이 등장하게 되었는지를 같이 이해하니까 전체 흐름이 훨씬 자연스럽게 연결되는 느낌이었다.