Overivew
- 웹소켓과, stomp의 개념에 대해 이해 할 수 있습니다
웹 소켓 소개
- "웹 소켓 프로토콜"은 웹 애플리케이션을 위한 새로운 기능으로써 클라이언트 "양방향 통신"의 오랜 역사를 가지고 있습니다 (stateful함)
- HTTP와는 다른 TCP 프로토콜이지만 HTTP에서 동작가능하게 디자인 되었고 80,443포트 (ws 프로토콜)을 사용하며 방화벽 규칙을 재사용 할 수 있도록 되어있다
- 일반 HTTP 요청에 Upgrade헤더를 포함한 reqeust를 전송하면 Websocket protocol로 변환되며, Websocket interaction이 시작된다
Request
GET /spring-websocket-portfolio/portfolio HTTP/1.1
Host: localhost:8080
Upgrade: websocket ---- 1
Connection: Upgrade ---- 2
Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==
Sec-WebSocket-Protocol: v10.stomp, v11.stomp
Sec-WebSocket-Version: 13
Origin: http://localhost:8080
- Upgrade 헤더
- Updage connection 사용
- (Http 요청에 저 두개만 붙인게 웹소켓프로토콜을 사용 할 수 있군)
Reponse

- 프로토콜 스위치
- "HTTP Upgrade" 요청을 받아 성공적인 "핸드 셰이크"가 성공한 이후에 tcp 소켓은 클라이언트와 계속 열어두고 메세지를 주고 받는다
- 만약 websocket이 웹서버(ngnix)에서 실행될 경우 websocket upgrade request를 웹 소켓 서버로 전달할 수 있도록 설정해줘야한다
- 마찬가지로 만약에 어플리케이션이 클라우드 환경에서 동작할 때, 클라우드가 웹소켓을 지원하는지 여부를 확인해야한다
HTTP와 대비되는 Websocket
HTTP
- 웹소켓이 비록 Http와 비슷하게 설계되었고, Http request로 시작했을지라도 두개의 시스템은 서로 다른 아키텍처를 가지고있고 다른 애플리케이션 프로그래밍 모델을 따르고 있다
- Http 그리고 Rest에서 애플리케이션은 많은 url을 가지고있다
- 애플리케이션과 클라이언트가 통신하기 위해서는 url에 요청을 보내야하고, request-response 형태를 띄고 있다
- 서버는 Http Url, 메서드 및 헤더를 기반으로 요청을 적절한 handler에 라우팅 시킨다
WebSocket
- 웹소켓은 "초기 연결을 위한 하나의 연결만 사용"한다
- 그 후에 모든 애플리케이션 메세지는 같은 tcp connection을 가지고 주고 받게 된다
- 이것은 완전히"비동기식 이벤트 기반 메시징 아키텍처"이다
- 웹소켓은 또한 http와 다르게 메시지 내용의 규정을 정의하지 않는 "low level" 전송 프로토콜 입니다
- 그래서 클라이언트와 서버가 미리 정의한 메세지 규약없이는 메시지가 라우팅 되거나 처리되지 못한다
- 웹소켓 클라이언트와 서버는 Http 핸드쉐이크 요청에서 Sec-WebSocket-Protocol을 사용하여 "Stomp"(High-Level-Protocol)와 같은 높은 레벨의 메시징 프로토콜을 사용 할 수 있다
- 따라서 일반적인 웹소켓 low level에서는 body,header등의 값을 넣을 수 없지만(큰 틀만 잡고, 세부적인 메세지는 정하지않기 떄문에) 웹소켓에서의 Stomp를 활용하면 high level protocol을 사용할 수 있어 body,header의 값을 넣을 수 있게 되는 것이다
low level ?
WebSocket은 전송되는 데이터가 텍스트든, JSON이든, 이진 데이터든 상관하지 않습니다. 데이터의 내용이나 형식을 미리 정해 두지 않기 때문에, 애플리케이션이 필요에 따라 자유롭게 데이터를 정의하고 전송할 수 있습니다

나는 오늘 무엇을 알았는가?
- 단순한 웹소켓으로만 실시간 양방향 소통을 할때는 low level protocol로 사용됨에 따라, 메세지를 보낼때 정해진 규약이 존재하지않아 body,header를 넣는 것이 불가능
- 반면에 Stomp를 활용한 high level protocol을 이용하면 body,header 넣기 가능
- 웹소캣은 Http를 따라서 디자인되었고, 같은 TCP프로토콜을 이용하지만, 단방향 통신, 양방향 통신이라는 부분에서 갈린다
참조 블로그
https://velog.io/@mw310/Stomp-WebSocket-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%ACver-Spring