WebSocket
- HTTP프로토콜은 요청 → 응답으로 이루어져 있기 떄문에 요청이 있어야만 응답이 가능하다. 즉 클라이언트의 요청이 없으면 서버 측에서 먼저 정보를 줄 수가 없다.
- HTTP 통신은 한번의 정보 전송에 각각 HandShake를 진행한다. 그러면 통신량이 많아지고, 통신 빈도가 잦아서 실시간 통신의 경우 매우 비효율적입니다. WevSocket은 통신할 때 처음로 HTTP에 접속에 확립하고 통신을 위한 HandShake 절차가 필요 없습니다.
- HandShake란 핸드셰이크는 통신에서 연결을 설정하기 위한 과정입니다.
- WebSocket은 처음에 HTTP 통신을 개시하므로 첫 시작은 클라이언트가 HTTP요청을 서버에 보내야합니다. 하지만 그후 웹소켓 통신이 연결되면 클라이언트와 서버 양쪽에서 모두 정보를 보낼 수 있습니다. 그리고 한쪽에서 통신을 끊으면 WebSocket통신이 끊기게 됩니다.
클라이언트 요청
- WebSocket 프로토콜 개시를 요청하는 클라이언트 요청이다.
GET /spring-websocket-portfolio/portfolio HTTP/1.1
Host: localhost:8080
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==
Sec-WebSocket-Protocol: v10.stomp, v11.stomp
Sec-WebSocket-Version: 13
Origin: <http://localhost:8080>
서버의 응답
- 일반적인 200 상태 코드 대신 WebSocket을 지원하는 서버는 위와 같은 출력을 반환한다.
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp
STOMP
- TCP 및 WebSocket과 같은 신뢰할 수 있는 양방향 스트리밍 네트워크 프로토콜에서 사용할 수 있습니다.
- STOMP는 텍스트 지향 프로토콜이지만 메시지 페이로드는 텍스트 또는 binary가 될 수 있습니다.
STOMP 구조
COMMAND
header1:value1
header2:value2
Body^@
- 클라이언트는 SEND 또는 SUBSCRIBE 명령을 사용하여 메시지를 보내거나 구독할 수 있으며, 메시지의 목적과 수신 대상 헤더를 설명할 수 있습니다.
STOMP 사용
- @EnableWebSocketMessageBroker
- Spring에 WebSocket 메시지 브로커를 활성화하겠다고 선언하는 어노테이션입니다
- WebSocketMessageBrokerConfigurer를 통해서 메세지 경로 설정이 가능합니다