Websocket

김다은·2023년 1월 13일
1

TIL

목록 보기
8/14
💡 웹소켓에 대해 정리해보자

웹소켓이란?

서버와 클라이언트 간에 Socket Connection을 유지해서 언제든 양방향 통신(bidirectional) 또는 데이터 전송이 가능하도록 하는 기술이다.

상태 저장 프로토콜로, 클라이언트와 서버 간의 연결은 당사자(클라이언트 또는 서버)에 의해 종료될 때까지 유지가 되며 클라이언트와 서버 중 하나가 연결을 닫은 후 양쪽 끝에서 연결이 종료된다.

예를 들어, 웹 브라우저와 서버인 클라이언트가 있고, 클라이언트와 서버 간의 연결을 시작할 때마다 클라이언트와 서버는 핸드셰이크(handshake)를 수행하고 새로운 연결을 만들기로 결정한다면 이 연결은 이들 중 하나에 의해 종료될 때까지 유지된다. 연결이 설정되고 활성화되면 통신이 종료될 때까지 동일한 연결 채널을 사용한다.


웹소켓을 주로 사용하는 경우

실시간 웹 애플리케이션(Real-time web application)

실시간 웹 애플리케이션은 웹 소켓을 사용하여 백엔드 서버에 의해 지속적으로 전송되는 클라이언트 엔드(client end)의 데이터를 표시한다. 웹소켓에서 데이터는 이미 열려 있는 동일한 연결로 지속적으로 푸시및전송되어 웹소켓이 더 빠르고 애플리케이션 성능을 향상시킨다.

예를 들어, 거래 웹사이트나 비트코인 거래에서 가격 변동 및 이동 데이터를 표시하기 위해 웹소켓 채널을 사용하여 백엔드 서버에 의해 클라이언트 엔드로 지속적으로 푸시된다.

게임 애플리케이션

데이터가 서버에서 지속적으로 수신되고 새로운 연결을 설정하지 않아도 UI가 자동으로 새로 고쳐지기 때문에 게이밍 애플리케이션에서 매우 유용하게 사용된다.

채팅 애플리케이션

채팅 응용프로그램은 웹소켓을 사용하여 구독자(subscriber)간의 메시지 교환(exchange), 게시(publishing) 및 브로드캐스트(broadcasting)를 위해 한 번만 연결을 설정합니다. 메시지 송수신 및 일대일 메시지 전송을 위해 동일한 웹 소켓 연결을 재사용하여 채팅에서 유용하게 사용된다.

웹소켓을 사용 안 하는 경우

오래된 데이터를 가져오거나 HTTP 프로토콜을 사용하여 애플리케이션을 처리하기 위해 데이터를 한 번만 가져오려면 자주 필요하지 않거나 한 번만 가져온 오래된 데이터는 단순한 HTTP 요청으로 쿼리(queried)할 수 있어서 이 경우 웹소켓을 권장하지 않는다.


Stomp (Simple Text Oriented Messaging Protocol)

웹소켓 프로토콜은 Text 또는 Binary 두가지 유형의 메세지 타입은 정의하지만 메세지의 내용에 대해서는 정의하지 않는다 즉 웹 소켓만 사용해서 채팅을 구현하게 되면 해당 메세지가 어떤 요청인지, 어떤 포맷으로 오는지, 메세지 통신 과정을 어떻게 처리해야 하는지 정해져 있지 않아 일일이 구현 해야한다. 따라서 STOMP라는 서브 프로토콜을 사용한다.

메세지 전송의 효율성 향상을 위해 만들어 졌으며, 메세지의 형식 유형 내용등을 정의해주는 프로토콜이다

pub/sub 구조를 통해 메세지 전송과 메세지 수신 처리의 구분이 명확하다.

Stomp 프로토콜은 웹소켓 위에서 동작하는 프로토콜리며, 클라이언트와 서버가 전송할 메세지의 유형, 형식, 내용은 정의하는 매커니즘이다.

Stomp를 통해 메세지의 헤더(header)값을 줄수 있다. 헤더 값 기반으로 통신할 때, 인증처리 구현이 가능하며 Stomp 스펙에 정의한 규칙을 준수하면 여러 언어 및 플랫폼 간 메세지를 상호 운영할 수 있다.


웹소켓 용어 정리(**STOMP 기반**)

  • COMMAND 사용 명령어
    • CONNECT
    • SEND
    • SUBSCRIBE
    • UNSUBSCRIBE
    • BEGIN
    • COMMIT
    • ABORT
    • ACK
    • NACK
    • DISCONNECT
  • @MessageMapping
    Client가 SEND를 할 수 있는 경로
  • Publisher - 송신자
  • Subscriber - 수신자

과정

채팅방 생성 : pub/sub 구현을 위한 Topic 생성

채팅방 입장 : Topic 구독(subscribe)

채팅방에서 매세지를 송수신 : 해당 Topic으로 메세지를 송신(pub), 메세지를 수신(sub)

클라이언트는 메세지를 전송하기 위해 SEND, SUBSCRIBE COMMAND를 사용할 수 있다.

SEND, SUBSCRIBE COMMAND 요청 Frame에는 메세지가 무엇이고, 누가 받아서 처리할지에 대한 Header 정보가 포함되어 있다.("destination" 헤더를 요구하는데 이것이 어디에 전송할지, 혹은 어디에서 메세지를 구독할 것 인지를 나타냄)

위와 같은 과정을 통해 STOMP는 Publish-Subscribe 매커니즘을 제공한다.

Broker를 통해 타 사용자들에게 메세지를 보내거나 서버가 특정 작업을 수행하도록 메세지를 보낼 수 있게 된다.

만약 Spring에서 지원하는 STOMP를 사용하면 Spring WebSocket 어플리케이션은 STOMP Broker로 동작하게 된다.

Spring에서 지원하는 STOMP는 많은 기능을 하는데 예를 들어 Simple In-Memory Broker를 이용해 SUBSCRIBE 중인 다른 클라이언트들에게 메세지를 보내준다. Simple In Memory Broker는 클라이언트의 SUBSCRIBE 정보를 자체적으로 메모리에 유지한다.

RabbitMQ, ActiveMQ같은 외부 메세징 시스템을 STOMP Broker로 사용할 수 있도록 지원한다.

구조적인 면을 보자면, 스프링은 메세지를 외부 Broker에게 전달하고, Broker는 WebSocket으로 연결된 클라이언트에게 메세지를 전달하는 구조로 HTTP 기반의 보안 설정과 공통된 검증 등을 적용할 수 있게 된다.

Reference

What is web socket and how it is different from the HTTP? - GeeksforGeeks

[Spring MVC] Web Socket(웹 소켓)과 Chatting(채팅)

[https://dev-gorany.tistory.com/235#stomp]

profile
이제는 더이상 물러날 곳이 없다

0개의 댓글