하나의 TCP 접속에 전이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜로 클라이언트와 서버 간의 실시간 데이터 전송을 용이하게 하며, 반이중 통신인 HTTP 와 많이 비교되곤 한다.
웹소켓은 HTTP와 마찬가지로 OSI 7계층(Application)에 위치하며, TCP에 의존하는 프로토콜이다.
HTTP 포트 위에서 동작하도록 설계 되었기 때문에 HTTP 프록시 및 중간 층을 지원하며, HTTP와 호환된다. 이러한 호환을 달성하기 위해 웹소켓 핸드셰이크는 HTTP 업그레이드 헤더를 사용해 HTTP를 웹소켓 프로토콜로 변경한다.
웹소켓은 HTML5에서 등장했기 때문에 일부 구형 브라우저에서는 지원이 안된다. 또한 프록시, 방화벽, 백신 소프트웨어 등으로 인해 웹소켓 연결이 불가능 한 경우도 있다.
이러한 경우에는 웹소켓 이전에 시도되던 코멧 등의 비표준 방식(HTML long-polling 등)으로 전이중 통신을 수행한다.(웹소켓 라이브러리 들이 이러한 방식으로 전이중 통신을 처리한다.)
웹소켓을 연결하기 위해 클라이언트는 웹소켓 핸드 셰이크 요청을 보내며, 서버는 웹소켓 핸드셰이크 응답을 변환한다.
클라이언트 요청
GET / chat HTTP/1.1
Host: server.bsbs.com
Upgrade: websocket
Connection: Upgrade
...
Origin: http://bsbs.com
서버 응답
HTTP/1.1 101 Switching Protocols
Upgrade: sebsocket
Connection: Upgrade
...
웹소켓 프로토콜 클라이언트 구현체는 목적지 호스트와 포트에 연결할 때 사용자 에이전트가 프록시를 사용하도록 구성되어 있는지 확인을 시도하며, 만일 그러한 경우 HTTP CONNECT 메서드를 사용하여 영구적인 터널을 구성한다.
웹소켓 프로토콜 그 자체는 프록시 서버와 방화벽을 인지하지 못하지만 HTTP 호환 핸드셰이크의 기능을 제공하므로, HTTP 서버들이 기본 HTTP와 HTTPS 포트를 웹소켓 게이트웨이나 서버와 공유할 수 있게 한다.
(ws://)암호화 되지 않은 웹소켓 트레픽이 웹소켓을 지원하지 않는 명시적이거나 투명한 프록시 서버를 통해 경유하는 경우 연결이 실패할 가능성이 높다.
(wss://)암호화된 웹소켓 연결을 사용하는 경우 웹소켓 보안 연결에 전송계층 보안(TLS)을 사용함으로써 브라우저가 명시적인 프록시 서버를 사용하도록 구성될 때 HTTP CONNECT 명령이 발행됨을 보증한다.
웹소켓과 함께 서브 프로토콜 개념으로 사용되는 프로토콜로, 웹소켓에 정해진 메시지 포맷이나 패턴이 존재하지 않기 때문에 클라이언트와 서버간 문자열을 해석하기 위한 형식 지정용으로 사용한다. 텍스트 지향 프로토콜이지만 message payload에 binary 데이터도 담을 수 있다.
simple( 혹은 streaming) 텍스트 지향 메시지 프로토콜로 메시지 지향 미들웨어(MOM)와 함께 작동하도록 설계된 단순 텍스트 기반 프로토콜이다. 이는 STOMP 클라이언트가 프로토콜을 지원하는 모든 메시지 브로커와 통신할 수 있도록 하는 상호 운용 가능한 와어어 형식을 제공한다.
대체로 HTTP와 유사하며 다음 명령을 사용한다.
클라이언트와 서버 간의 통신은 여러 줄로 구성된 frame을 통해 이루어지며, 첫번째 줄에는 명령이 포함되어 있고, 그 뒤에는 key: value
형식의 헤더, 빈줄, null 문자로 끝나는 본문 내용이 차례대로 온다.
COMMAND
header1: value1
header2: value2
Body^@
클라이언트로부터 받은 메시지를 queue
또는 topic
을 통해 라우팅하고, 해당 메시지를 다른 클라이언트에게 전달하는 중간 역할을 하는 소프트웨어로 서버 환경에서 실행된다. 이 브로커는 메시지 전달, 보관, 라우팅 및 다양한 메시지 패턴을 지원하여 클라이언트 간의 효율적인 통신을 가능하게 한다.
Reference
- https://en.wikipedia.org/wiki/Message_broker
- https://ko.wikipedia.org/wiki/%EB%B0%9C%ED%96%89-%EA%B5%AC%EB%8F%85_%EB%AA%A8%EB%8D%B8
- https://ko.wikipedia.org/wiki/%EB%A9%94%EC%8B%9C%EC%A7%80_%EC%A7%80%ED%96%A5_%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4
- https://ko.wikipedia.org/wiki/%EC%9B%B9%EC%86%8C%EC%BC%93