웹소켓 구경하기

Rosevillage·2024년 6월 13일
0

웹 소켓(Web Socket)

하나의 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 명령이 발행됨을 보증한다.

STOMP(Streaming Text Oriented Messaging Protocol)

웹소켓과 함께 서브 프로토콜 개념으로 사용되는 프로토콜로, 웹소켓에 정해진 메시지 포맷이나 패턴이 존재하지 않기 때문에 클라이언트와 서버간 문자열을 해석하기 위한 형식 지정용으로 사용한다. 텍스트 지향 프로토콜이지만 message payload에 binary 데이터도 담을 수 있다.

simple( 혹은 streaming) 텍스트 지향 메시지 프로토콜로 메시지 지향 미들웨어(MOM)와 함께 작동하도록 설계된 단순 텍스트 기반 프로토콜이다. 이는 STOMP 클라이언트가 프로토콜을 지원하는 모든 메시지 브로커와 통신할 수 있도록 하는 상호 운용 가능한 와어어 형식을 제공한다.

대체로 HTTP와 유사하며 다음 명령을 사용한다.

  • 클라이언트
    • CONNECT : 메시지 브로커와 연결을 설정할 때
    • SEND : 메시지를 특정 큐 또는 토픽에 전송할 때
    • SUBSCRIBE : 특정 큐 또는 토픽을 구독할 때
    • UNSUBSCRIBE : 특정 큐 또는 토픽에 대한 구독을 취소할 때
    • BEGIN : 트랜잭션을 시작할 때
    • COMMIT : 트랜잭션을 커밋할 때
    • ABORT : 트랜잭션을 중단할 때
    • ACK : 메시지를 성공적으로 수신했음을 브로커에게 알릴 때
    • NACK : 메시지 수신에 실패했음을 브로커에게 알릴 때
    • DISCONNECT : 메시지 브로커와 연결을 종료할 때
  • 서버(브로커)
    • MESSAGE : 클라이언트에게 메시지를 전송할 때
    • RECEIPT : 클라이언트의 특정 요청을 성공적으로 처리했음을 알릴 때
    • ERROR : 클라이언트의 요청 처리 중 에러가 발생했음을 알릴 때

클라이언트와 서버 간의 통신은 여러 줄로 구성된 frame을 통해 이루어지며, 첫번째 줄에는 명령이 포함되어 있고, 그 뒤에는 key: value 형식의 헤더, 빈줄, null 문자로 끝나는 본문 내용이 차례대로 온다.

COMMAND
header1: value1
header2: value2

Body^@

메시지 브로커

클라이언트로부터 받은 메시지를 queue 또는 topic을 통해 라우팅하고, 해당 메시지를 다른 클라이언트에게 전달하는 중간 역할을 하는 소프트웨어로 서버 환경에서 실행된다. 이 브로커는 메시지 전달, 보관, 라우팅 및 다양한 메시지 패턴을 지원하여 클라이언트 간의 효율적인 통신을 가능하게 한다.

  • queue : 메시지를 큐에 저장하고 대기중인 클라이언트에게 전달한다.(unicast)
  • topic : 메시지를 토픽에 게시하고, 해당 토픽을 구독한 모든 클라이언트에게 메시지를 전달하며, 주로 pub/sub 통신을 지원한다.(broadcast)
    pub/sub 구조는 통해 메시지를 전송하고 받는 주체를 명확히 구분한다.
    • pub(publish): 메시지를 공급하는 주체로 특정 topic에 메시지를 보내면 해당 topic을 구독한 모든 sub에게 메시지가 전송된다.
    • sub(subscribe): 메시지를 수신하는 주체로 구독한 topic에 메시지가 전송되면, 해당 메시지를 수신한다.
    • 느슨한 결합:pub과 sub는 느슨하게 결합되고, 서로의 존재를 알 필요가 없다. 오로지 tpoic에만 관심이 있고, 서로를 고려하지 않은 채 동작을 지속할 수 있다.
    • 확장성: pub/sub 구조는 병렬 수행, 메시지 캐싱, 트리기반 또는 네트워크기반 라우팅 등을 통해 전통적인 클라이언트-서버 구조 보다 더 나은 확장성의 기회를 제공한다.

Reference

라이선스

라이선스

the software house - bartosz luczak 12 july 2023

0개의 댓글

관련 채용 정보