본문 바로가기

Programming

Web Socket

Web Socket 이란

 

웹 소켓(Web Socket)은 서버와 클라이언트 간의 실시간 전이중 통신(full-duplex communication)을 가능하게 하는 프로토콜이다. 웹 소켓은 2011년 HTML5 표준의 일부로 포함되며 본격적으로 사용되기 시작했다.

이러한 웹 소켓은 웹 소켓을 지원하는 브라우저에서 사용 가능하다. 하지만 이를 지원하지 않는 구형 브라우저에서는 사용할 수 없다. (ex. Internet Explorer 9이하)

 


 

Web Socket의 특징

 

 

1. 양방향 통신 (Full-Duplex)

  • 데이터 송수신을 동시에 처리할 수 있는 통신 방법
  • 클라이언트와 서버가 서로에게 원할 때 데이터를 주고받을 수 있다.
    (통상적인 Http 통신은 Client가 요청을 보내는 경우에만 Server가 응답을 하는 단방향 통신)

 

2. 실시간 네트워킹 (Real Time-Networking)

  • 웹 환경에서 연속된 데이터를 빠르게 노출하는 것이 가능

 

3. 상태 유지 (Stateful)

  • 웹 소켓은 HTTP와 달리 연결을 계속 유지한다. 이로써 데이터를 전송하거나 수신하기 위해 매번 새로운 연결을 설정할 필요가 없다.

4. 효율성

  • 웹 소켓은 초기 연결 후, 지속적인 연결을 유지하면서 추가적인 헤더 정보 없이 데이터를 전송할 수 있다.

 

Web Socket 이전에 쓰이던 기술

 

1. Polling

  • 클라이언트가 일정한 시간 간격으로 서버에 HTTP 요청을 보내서 데이터를 요청하는 방법
  • 단순한 구현이 가능하지만 많은 트래픽을 유발할 수 있다.
  • 실시간성이 낮다(데이터 갱신 간격에 따라 실시간성이 떨어질 수 있음)

2. Long Polling

  • 클라이언트가 서버에 HTTP 요청을 보내고, 서버가 새로운 데이터가 있을 때까지 응답을 지연시키는 방법
  • 작동 과정은 다음과 같음
    1) 클라이언트에서 요청을 보냄
    2) 서버는 새로운 데이터가 있을 때까지 응답을 지연
    3) 새로운 데이터가 발생하면 클라이언트로 응답 전송
    4) 클라이언트는 응답을 받은 후 기존 연결을 끊음
    5) 클라이언트는 즉시 새로운 요청을 보냄
    6) 반복
  • 결국 이러한 방식은 많은 양의 메시지가 쏟아질 경우 polling과 같아진다는 단점이 있다.

3. HTTP Streaming

  • 클라이언트가 서버에 HTTP 요청을 보내고, 연결이 끊기지 않은 상태에서 서버로부터 데이터를 끊임없이 수신 받는 방법
  • stateless인 HTTP 프로토콜을 사용하지만 연결을 유지함으로써 실시간 데이터 송신을 구현함
  • 하지만 클라이언트 측에서 서버로 데이터 전송이 어려움
  • 대부분의 경우 서버 -> 클라이언트 방향의 단방향 통신이 이루어짐

 

결과적으로 이 모든 방법이 HTTP 프로토콜을 사용하기 때문에 Request와 Response 모두 Header가 불필요하게 큼

 


 

Web Socket 동작 방법

 

1. HTTP 핸드셰이크

  • 연결을 수립할 때만 HTTP 프로토콜 사용
  • 반드시 GET 메소드 사용

2. 서버 응답

  • 서버는 클라이언트의 요청을 받아들여 웹 소켓 프로토콜로 전환을 승인

3. 프로토콜 전환

  • HTTP 핸드셰이크가 완료되면 클라이언트와 서버 간의 연결은 http에서 ws 프로토콜로 전환
  • 이때부터 클라이언트와 서버는 HTTP 헤더 없이 WebSocket 프레임을 통해 데이터를 주고받음
  • SSL 인증서가 적용되었다면 https 처럼 wss 프로토콜로 전환됨
  • 참고로 ws을 위한 별도의 port 번호는 없음(기존의 http-80 / https-443 을 사용)

4. 데이터 프레임 전송

  • 웹 소켓 연결이 설정되면 클라이언트와 서버는 데이터를 프레임 단위로 주고받음
  • 교환할 수 있는 데이터는 오직 text와 binary만 가능함

5. 연결 종료

  • 클라이언트나 서버 중 어느 한쪽이 연결을 종료할 수 있다.
  • 연결을 종료하기 위해 종료 프레임(close frame)을 전송
  • 종료 프레임을 수신한 쪽은 응답으로 종료 프레임을 보내고 연결이 종료됨

 


 

Web Socket의 한계

 

1. Web Socket은 HTML5 이후에 등장한 기술이다.

  • 웹 소켓은 HTML5 이후에 나온 기술로, HTML5 이전의 기술로 구현된 서비스에서는 웹 소켓을 사용할 수 없다.
  • 따라서 HTML5 이전의 기술로 구현된 서비스에서 웹 소켓처럼 실시간 통신을 구현하기 위해 Socket.io와 SockJS 같은 라이브러리를 사용해야 한다.
  • 이런 라이브러리를 사용하면 브라우저와 웹 서버의 종류와 버전을 파악하여 가장 적합한 기술을 선택하여 해당 기술로 추상화 한다. (ex. 웹 소켓을 Long Polling으로 변경)

 

2. 웹 소켓의 데이터 처리 한계

  • 웹 소켓은 문자열과 이진 데이터를 주고받을 수 있게 해줄 뿐 그 이상의 일을 하지 않는다.
  • 주고받은 문자열의 해독은 온전히 어플리케이션에 맡김
  • HTTP는 형식을 정해두어 모두가 약속을 따르기만 하면 해석할 수 있지만, 웹 소켓은 형식이 정해져 있지 않아 애플리케이션에서 쉽게 해석하기 어렵다.
  • 따라서 STOMP (Simple Text Oriented Messaging Protocol) 와 같은 서브 프로토콜을 사용하여 주고받는 메시지의 형태를 약속해야 하는 경우가 많다.

출처 : 
https://velog.io/@codingbotpark/Web-Socket-%EC%9D%B4%EB%9E%80
https://ko.javascript.info/websocket
https://www.youtube.com/watch?v=MPQHvwPxDUw&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=99
https://velog.io/@jinyeong-afk/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%9B%B9%EC%86%8C%EC%BC%93-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC
https://velog.io/@hahan/Polling-Long-Polling-Streaming