WebSocket이 뭘까요? Feat: STOMP

김용현·2024년 3월 19일

사이드 프로젝트

목록 보기
5/6

사이드 프로젝트에서 단체 채팅을 구현해야 했다. 관련하여 자료를 찾아보던 중 웹 소켓에 대해 공부를 해보고자 한다 개념부터 잡고 가자.

웹 소켓(WebSocket)

하나의 TCP 접속에 전이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜
출처: 위키피디아

등장 이유

우리가 많이 접하고 사용하는 프로토콜은 단연 Http 이다. http의 특징은 무상태(Stateless)이다. 즉, 연결을 하더라도 통신이 끝나면 같은 곳으로 다시 요청을 보내더라도 다시 핸드쉐이크부터 시작해야한다.

또한 Http는 헤더에 이런저런 정보가 많이 들어간다. 이러한 http의 특징은 실시간 통신(게임, 채팅, 화상 통화) 등 빠르게 데이터를 양 방향으로 주고받아야 하는 환경에 부적합하다.

이러한 이유로 가볍고 계속해서 연결되어 양 방향 통신을 할 수 있는 웹 소켓을 이용한다.

작동 방식

웹 소켓은 처음 핸드 쉐이크 과정은 http로 요청을 보낸다. 이후 websocket으로 프로토콜을 변경하여 연결된 상태를 유지하며 양방향 통신을 한다.

즉 처음에만 http 요청이 필요하고 이후에는 http:// ~~~ 에서 ws:// ~~ 로 요청이 바뀐다.

// 처음 요청을 보내는 http 
GET /{path} HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: {hostname}
//서버 응답
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade

이후의 요청은 ws 프로토콜

https가 있는 것처럼 ws도 보안이 강화된 wss가 있다.

ws는 기존의 Http 포트 번호 80에서 동작한다. 따라서 별다른 처리를 할 필요가 없다.
동일하게 wss는 https 포트 번호 443을 사용한다.

STOMP(Simple Text Oriented Message Protocol)

웹 소켓은 단순히 문자열과 바이너리 데이터만을 주고받게 해줄 뿐 그 이상의 일을 하지 않는다.
http는 get, post 등의 전송 방식, content-type등 정해져있기 때문에 응용 프로그램에서 정해진 대로 사용하기 편하지만 웹 소켓은 따로 프레임이 정해져 있지 않다.

따라서 웹소켓의 프레임을 정할 필요가 생겼고, stomp는 웹 소켓의 프레임을 정하는 서브 프로토콜이다. 일반적으로 웹 소켓 프로토콜 위에서 동작한다.

//stomp 구조
COMMAND
header1:value1
header2:value2

BodyBodyBodyBody^@

stomp는 다음과 같이

  • command(명령)
  • header(헤더)
  • body(바디)

로 구성된다. command에는 CONNECT, SEND,SUBSCRIBE, DISCONNECT와 같은 명령이 사용된다.
body의 끝에는 null문자열을 넣도록 되어 있으며, 헤더와 바디는 한 줄 띄어서 구분한다.

// 실제 STOMP 구조 예시

>>> CONNECT
notice:1
accept-version:1.2
heart-beat:10000.10000

>>> SUBSCRIBE
id:sub-1600335610276_227
destination:/channel/1

<<< MESSAGE
destination:/channel/1
content-type:application/json
subscription:sub_1600335610276-227
message-id:zowit0sl-2
content-length:103

📚 참고자료

https://kyleyj.tistory.com/59

profile
평생 여행 다니는게 꿈 💭 👊 😁 🏋️‍♀️ 🦦 🔥

0개의 댓글