웹소켓이란

웹소켓은 HTTP와 같은 규칙의 개념이다.

 

Transport protocol의 일종으로 서버와 클라이언트 간의 효율적인 양방향 통신을 실현하기 위한 구조이다.

웹소켓은 단순한 API로 구성되어있으며, 웹소켓을 이용하면 하나의 HTTP 접속으로 양방향 메시지를 자유롭게 주고받을 수 있게 된다.

 

웹소켓이 나오기 이전에는 모두 클라이언트의 요청이 없다면, 서버로부터 응답을 받을 수 없는 구조였지만, 이러한 문제를 해결하는 웹소켓이라는 새로운 규칙이 만들어 졌다.

 

웹소켓에서는 서버와 브라우저 사이에 양방향 소통이 가능하다. 브라우저는 서버가 직접 보내는 데이터를 받아들일 수 있고, 사용자가 다른 웹사이트로 이동하지 않아도 최신 데이터가 적용된 웹을 볼 수 있게 해준다. 웹페이지를 ‘새로고침’하거나 다른 주소로 이동할 때 덧붙인 부가 정보를 통해서만 새로운 데이터를 제공하는 웹서비스 환경의 빗장을 본질적으로 풀어준 셈이다.

 

웹에서도 채팅이나 게임, 실시간 주식차트와 같은 실시간이 요구되는 응용프로그램의 개발을 한층 효과적으로 구현할 수 있게 되었다.

 

가상화폐의 분산화 기술의 핵심도 WebSocket으로 구현할 수 있다.


작동원리

서버와 클라이언트간의 웹소켓 연결은 HTTP프로토콜을 통해 이루어진다.

연결이 정상적으로 이루어진다면 서버와 클라이언트 간에 웹소켓 연결(TCP/IP기반)이 이루어지고 일정 시간이 지나면

HTTP연결은 자동으로 끊어진다.

기본적으로  웹소켓 API는 아주 간단한 기능들만을 제공하기 때문에 대부분의 경우 SockJS나 Socket.IO같은 오픈 소스 라이브러리를 많이 사용하고 있으며 메시지 포맷 또한 STOMP같은 프로토콜을 같이 이용한다.

 

STOMP
:
STOMP는 Simple Text Oriented Messaging Protocol의 약자이다.
WebSocket 프로토콜은 Text 또는 Binary 두 가지 유형의 메시지 타입은 정의하지만 메시지의 내용에 대해서는 정의하지 않는다. 즉, WebSocket만 사용해서 구현하게 되면 해당 메시지가 어떤 요청인지, 어떤 포맷으로 오는지, 메시지 통신 과정을 어떻게 처리해야 하는지 정해져 있지 않아 일일이 구현해야 한다.
따라서 STOMP라는 프로토콜을 서브 프로토콜로 사용한다. STOMP는 클라이언트와 서버가 서로 통신하는 데 있어 메시지의 형식, 유형, 내용 등을 정의해주는 프로토콜이라고 할 수 있다. STOMP를 사용하게 되면 단순한 Binary, Text가 아닌 규격을 갖춘 메시지를 보낼 수 있다.
스프링은 spring-websocket 모듈을 통해서 STOMP를 제공하고 있다.

문제점

1. 프로그램 구현에 보다 많은 복잡성을 초래한다.

  • 웹 소켓은 HTTP와 달리 Stateful protocol이기 때문에 서버와 클라이언트 간의 연결을 항상 유지해야 하며 만약 비정상적으로 연결이 끊어졌을때 적절하게 대응해야 한다. 이는 기존의 HTTP 사용시와 비교했을때 코딩의 복잡성을 가중시키는 요인이 될 수 있다.

2. 서버와 클라이언트 간의 Socket 연결을 유지하는 것 자체가 비용이 든다.

  • 특히나 트래픽 양이 많은 서버같은 경우에는 CPU에 큰 부담이 될 수 있다.

3. 오래된 버전의 웹 브라우저에서는 지원하지 않는다. (SockJS 라이브러리 같은 경우에는 Fallback option을 제공하고 있으므로 지원가능)


사용 예

1. 페이스북과 같은 SNS APP

2. LOL 같은 멀티플레이어 Game

3. 위치 기반 APP

4. 증권 거래 정보 사이트 및 APP

5. 화상 채팅 APP

6. 구글 Doc 같이 여러 명이 동시 접속해서 수정할 수 있는 Tool

 

 

 

참조 :
https://choseongho93.tistory.com/
https://tecoble.techcourse.co.kr/

+ Recent posts