WebSocket은 클라이언트와 서버 간의 실시간 양방향 통신을 가능하게 하는 전이중(full-duplex) 통신 프로토콜이다.
HTTP는 요청(request)과 응답(response) 기반의 단방향 통신 구조로 클라이언트가 서버에 요청을 보내기 전에는, 서버는 클라이언트에게 메시지를 전달할 수 없다.
따라서 실시간 채팅과 같이 서버가 먼저 데이터를 보내야 하는 상황에서는 비효율적
HTTP 기반 채팅에서는 사용자가 새 메시지를 보았는지 확인하려면 클라이언트가 주기적으로 서버에 요청(polling)을 보내야 하며, 이는 성능 낭비를 초래한다.
이때 WebSocket 통신에서는 url 주소가 http://로 시작하는 http 프로토콜과 달리 we:// 로 시작한다
항목 | HTTP | WebSocket |
---|---|---|
프로토콜 | 요청/응답 기반, 단방향 | 전이중(Full-Duplex), 양방향 |
연결 지속성 | 요청마다 새로 연결 | 연결 유지 |
실시간성 | 낮음 (Polling 필요) | 높음 (서버 → 클라이언트 즉시 전송 가능) |
전송 효율성 | 헤더 포함 반복 전송으로 오버헤드 큼 | 초기 연결 이후엔 경량 메시지 프레임 사용 |
URI | http\:// / https\:// | ws:// / wss:// |
http를 사용하고도 실시간 요청처럼 보이게 하는 방식. 클라이언트가 주기적으로 요청을 보내 업데이트를 확인하는 방법이다, 다만 지속적인 서버 request로 서버 과부하 발생 가능성이 높다.
sse(server-sent events) 기술은 HTTP 기반의 실시간 통신이다. sse 통신 기술은 서버에서 클라이언트로의 단방향 통신이며 클라이언트에서 서버로 요청하려면 일반적인 http request를 전송해야한다.
주로 실시간 업데이트가 필요한 애플리케이션에서 사용(특히, 사용자에 알림을 주기 위한 목적으로 많이 활용)
STOMP(Simple Text Oriented Messaging Protocol)는 WebSocket 위에서 동작하는 간단한 텍스트 기반 메시징 프로토콜
.
웹소켓으로 클라이언트 A와 B가 1대1 통신을 한다고 하자 클라이언트 A가 메세지를 보내면 서버는 A를 포함한 B에 메세지를 전송 여기 까지는 정상 작동 이때 B가 클라이언트 C와 1대 채팅을 한다고 하면 이 그룹을 묶어서 선별적으로 서버가 데이터를 전송하는 것은 어렵기 때문에 stomp 사용
핸드셰이크
클라이언트 ↔ 서버 간 WebSocket 연결을 맺고, STOMP 프로토콜로 업그레이드
구독(Subscribe)
클라이언트가 SUBSCRIBE
프레임으로
특정 목적지(destination), 예를 들어 /topic/room1
을 구독
발행(Send)
클라이언트가 SEND
프레임으로
목적지에 메시지 전송 → 브로커가 받아서 내부 큐/토픽에 저장
전달(Message)
브로커가 /topic/room1
을 구독 중인 모든 클라이언트로
MESSAGE
프레임을 전송
웹소켓 서버를 여러 대 띄우면, 클라이언트 A → 서버1
,클라이언트 B → 서버2
로 연결될 수 있다.
그런데 서버1에만 있는 A의 메시지를 서버2에 있는 B가 받으려면,서버 간에 “누가 누구를 구독 중인지” 공유가 필요하다.
위와 같은 문제를 해결하기 위해 redis의 pub/sub 기능을 사용