Websocket이란?

Sundae·2023년 10월 21일
0
post-thumbnail

HTTP의 한계


HTTP의 통신 방식은 기본적으로 단방향 통신이다.
클라이언트(Client)에서 서버로(Server) 요청(Request)를 보내면 서버가 클라이언트로 응답(Response)을 보내는 방식을 사용한다.

HTTP의 특징 중 하나는 클라이언트에서 서버에 접속하면 서버에서 응답을 한 후에 연결이 끊어진다. 이러한 특징은 실시간으로 정보를 주고 받을 수 없고, 요청 없이 서버에서 클라이언트로 데이터를 전송할 수 없다는 문제점이 있다.

이와 같은 한계를 해결하기 위해 Polling, Long Polling,Streaming , WebSocket 같은 기술이 생겼다.


1. HTTP Polling

Polling방식은 HTTP request를 특정한 주기로 서버에 요청한 후 이벤트 내용을 전달받는 방식이다. Polling 방식은 클라이언트가 계속해서 요청을 하기 때문에 서버의 부담이 커질 가능성이 높다.

2. HTTP Long Polling

Long Polling방식은 클라이언트가 request를 보낸 후 대기하다가, 서버 이벤트가 발생하면 response를 전달하는 방식이다. Polling 방식보다 서버에 부담이 적지만, 동시에 서버 이벤트가 발생한다면 곧바로 여러 클라이언트가 서버로의 연결을 요청하면서 똑같이 부담이 커질 수 있는 방식이다.

3. HTTP Streaming

Streaming 방식은 우선 클라이언트가 request를 보낸다. 이 후, 연결을 끊지 않고 이벤트가 발생 할 때마다 response를 전달받는 방식이다.
앞선 두 방식보다 연결을 맺기 위한 request를 처음 한 번만 하므로 다른 방식보다 서버에 가는 부담이 경감된다.

WebSocket


Polling, Long Polling, Streaming 방식은 서버가 클라이언트에게 실시간으로 데이터를 전달하는데 있어 용이하지만 클라이언트가 서버에 메세지를 전달할 때는 여전히 request를 해야한다는 불편한 점이 있다. 이에 만들어진 것이 WebSocket이다.


WebSocket은 하나의 TCP접속에 전이중 통신을 제공하는 통신 프로토콜이다. 즉, WebSocket은 클라이언트와 서버에 서로 간에 데이터를 주고받을 수 있는 연결 통로를 만든다. 이러한 방식으로 WebSocket은 앞선 Polling같은 방식보다 더 낮은 부하로 양방향 통신을 가능하게 한다.

프로토콜 핸드셰이크

WebSocket은 HTTP 포트 80과 443 위에 동작하도록 설계되었다. 이에 WebSocket은 HTTP프로토콜과 호환이 가능하다. WebSocket은 HTTP와 호환을 이루기 위해 아래 코드 박스와 같이 프로토콜 핸드쉐이크(Hand Shake) 요청을 보낸다.

클라이언트 핸드셰이크 요청:
  GET /chat HTTP/1.1
  Host: server.example.com
  Upgrade: websocket
  Connection: Upgrade
  Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
  Sec-WebSocket-Protocol: chat, superchat
  Sec-WebSocket-Version: 13
  Origin: http://example.com

핸드쉐이크는 업그레이드 헤더를 사용하여 HTTP프로토콜에서 WebSocket 프로토콜로 변경한다. 핸드쉐이크 요청을 받은 서버는 클라이언트에게 Switching Protocols 응답을 보낸다.

서버응답 :
 HTTP/1.1 101 Switching Protocols
 Upgrade: websocket
 Connection: Upgrade
 Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
 Sec-WebSocket-Protocol: chat

나가는 글


웹 소켓 프로토콜을 주로 사용한 프로젝트를 하며 얻게된 정보를 정리했다.
프로젝트에서 클라이언트가 웹 소켓에게 request를 보낼 때 소켓에 Connection 되어 있는 다른 클라이언트에게도 Response를 보내는 것을 보고 무언가 괴리감이 들었었다. 그 이유는 지금 생각해보면 일반적인 HTTP 요청에 대한 Response만 처리했기 때문인 것 같다.

웹 소켓을 몰랐다면 채팅이나 게임에 대한 구현 방법을 떠올리기 힘들었을 것 같아 좋은 경험이 되었다고 생각한다.

profile
성장 기록 / 글에 오류가 있다면 댓글 부탁드립니다.

0개의 댓글