Backend
home
📩

Web Socket (10분 테코톡)

생성 일시
2025/06/15 16:33
태그
SpringBoot
게시일
2025/06/16
최종 편집 일시
2025/06/15 17:10

웹 소켓이란?

두 프로그램 간의 메시지를 교환하기 위한 통신 방법 중의 하나이다.
W3C와 IETF에 의해 자리잡은 표준 프로토콜 중의 하나이다.
W3C: 월드 와이드 웹을 위한 표준을 개발하고 장려하는 조직
IETF: 인터넷의 운영, 관리, 개발에 대해 협의하고 프로토콜과 구조적인 사안들을 분석하는 인터넷 표준화 작업 기구

웹 소켓의 특징

양방향 통신(Full-Duplex)
데이터 송수신을 동시에 처리할 수 있는 통신 방법
클라이언트와 서버가 서로에게 원할 때 데이터를 주고 받을 수 있다.
통상적인 Http 통신은 Client가 요청을 보내는 경우에만 Server가 응답하는 단방향 통신이다.
실시간 네트워킹(Real Time-Networking)
웹 환경에서 연속된 데이터를 빠르게 노출시킨다.
ex) 채팅, 주식, 비디오 데이터
여러 단말기에 빠르게 데이터를 교환한다.

웹 소켓 이전의 비슷한 기술

Polling

서버로 일정 주기 요청 송신
real-time 통신에선 언제 통신이 발생할지 예측이 불가능하기에 불필요한 request와 connection이 생성된다.
real-time 통신이라고 부르기 애매할 정도의 실시간성을 가진다.

Long Polling

서버에 요청 보내고 이벤트가 생겨 응답 받을 때까지 연결 종료를 하지 않는다.
응답을 받으면 끊고 다시 재요청을 한다. ⇒ 많은 양의 메시지가 쏟아질 경우 polling과 같다.

Streaming

서버에 요청을 보내고 끊기지 않은 연결상태에서 끊임없이 데이터를 수신한다.
클라이언트에서 서버로의 데이터 송신이 어렵다.
결과적으로 이 모든 방법이 HTTP를 통해 통신하기 때문에 Request, Response 둘 다 Header가 불필요하게 크다는 단점이 있다.

웹 소켓 동작 방법

핸드 쉐이킹 - 요청

HTTP 버전: 1.1
Host: 웹소켓 서버의 주소
Upgrade: 현재 클라이언트, 서버, 전송 프로토콜 연결에서 다른 프로토콜로 업그레이드 또는 변경하기 위한 규칙
Connection: Upgrade 헤더 필드가 명시되었을 경우, 송신자는 반드시 Upgrade 옵션을 지정한 Connection 헤더 필드도 전송
Sec-WebSocket-Key: 길이가 16바이트인 임의로 선택된 숫자를 base64로 인코딩 한 값
클라이언트와 서버 간의 신원을 인증한다.
Origin: 클라이언트로 웹 브라우저를 사용하는 경우에 필수항목으로, 클라이언트의 주소
Set-WebSocket-Protocol:
클라이언트가 요청하는 여러 서브프로토콜을 의미
공백문자로 구분되며 순서에 따라 우선권이 부여
서버에서 여러 프로토콜 혹은 프로토콜 버전을 나눠서 서비스할 경우에 필요한 정보

핸드 쉐이킹 - 응답

101 Switching Protocols가 Response로 오면 웹소켓이 연결되었다는 의미
Set-WebSocket-Accept: 클라이언트로부터 받은 Sec-WebSocket-Key를 사용하여 계산된 값
만일 이 값이 클라이언트에서 계산한 값과 일치하지 않으면 연결 수립 X

데이터 전송

데이터 보안을 위해 SSL을 적용한 프로토콜
Message: 여러 frame이 모여서 구성하는 하나의 논리적 메시지 단위
frame: communication에서 가장 작은 데이터 단위, 작은 헤더 + payload로 구성
웹 소켓 통신에 사용되는 데이터는 UTF8 인코딩
0x00 (보내고 싶은 데이터) 0xff

간단 정리

프레임 헤더 구조

웹 소켓 프로토콜의 특징

최초 접속에서만 http 프로토콜 위에서 handshaking을 하기 때문에 http header를 사용한다.
웹소켓을 위한 별도의 포트는 없으며, 기존 포트(http-80, https-443)을 사용한다.
프레임으로 구성된 메시지라는 논리적 단위로 송수신한다.
메시지에 포함될 수 있는 교환 가능한 메시지는 텍스트와 바이너리이다.

웹 소켓의 한계

Socket.io, SockJS

웹소켓 ⇒ HTML5
그렇다면 HTML5 이전의 기술로 구현된 서비스에서는?
Socket.io와 SockJS는 HTML5 이전의 기술로 구현된 서비스에서 웹 소켓처럼 사용할 수 있도록 도와주는 기술이다.
Javascript를 이용하여 브라우저 종류에 상관없이 실시간 웹을 구현한다.
WebSocket, FlashSocket, AJAX Long Polling, AJAX Multi part Streaming, IFrame, JSONP Polling을 하나의 API로 추상화하였다.
즉, 브라우저와 웹 서버의 종류와 버전을 파악하여 가장 적합한 기술을 선택하여 사용하는 방식이다.

STOMP

WebSocket은 문자열들을 주고 받을 수 있게 해줄 뿐 그 이상의 일 X
주고 받은 문자열의 해독은 온전히 어플리케이션에 맡긴다.
HTTP는 형식을 정해두었기 때문에 모두가 약속을 따르기만 하면 해석할 수 있다.
하지만 WebSocket은 형식이 정해져 있지 않기 때문에 어플리케이션에서 쉽게 해석하기가 힘들다.
때문에 WebSocket 방식은 sub-protocols을 사용해서 주고 받는 메시지의 형태를 약속하는 경우가 많다.
STOMP(Simple Text Oriented Message Protocol)
STOMP은 채팅 통신을 하기 위한 형식을 정의한다.
HTTP와 유사하게 간단히 정의되어 해석하기 편리한 프로토콜이다.
일반적으로 웹소켓에서 사용된다.

프레임 구조

프레임 기반의 프로토콜이다. 프레임은 명령, 헤더, 바디로 구성된다.
자주 사용되는 명령은 CONNECT, SEND, SUBSCRIBE, DISCONNECT 등이 있다.
헤더와 바디는 빈 라인으로 구분하며, 바디의 끝은 NULL 문자로 설정한다.

웹 소켓의 sub-protocol STOMP을 활용한 결과물