WebSocket

Quro·2024년 4월 22일
1

Web

목록 보기
1/8
post-thumbnail

WebSocket이란?

WebSocket은 서버와 클라이언트 간의 메시지 교환을 위한 통신 규약(프로토콜)이다. HTTP 프로토콜이 요청-응답 방식인 것과 달리, WebSocket은 한 번 연결이 성립되면 클라이언트와 서버가 자유롭게 데이터를 주고받을 수 있는 것이 특징이다.

WebSocket의 특징

  • 양방향 통신
    • 클라이언트와 서버가 양방향으로 동시에 데이터를 주고받을 수 있다
  • 실시간 데이터 전송
    • 연결이 성립된 후에는 실시간으로 데이터를 주고받을 수 있어, 지연 시간이 적다
  • 낮은 오버헤드
    • HTTP 프로토콜보다 헤더 정보가 적어, 데이터 전송 시 오버헤드가 적다
  • 연결 유지
    • 한 번 연결이 성립되면 연결을 유지하면서 지속적으로 데이터를 주고받을 수 있다. 재연결이 필요 없다

웹 소켓이 나오기 전까지의 통신 방식

웹 소켓이 등장하기 전에는 주로 다음과 같은 방식으로 클라이언트와 서버 간의 통신이 이루어졌다

HTTP 폴링 (HTTP Polling)

HTTP 폴링은 클라이언트가 주기적으로 서버에 HTTP 요청을 보내고, 서버가 새로운 데이터를 가지고 있으면 응답을 통해 전달하는 방식이다.

특징

  • 클라이언트가 일정 간격으로 서버에 요청을 보낸다.
  • 실시간성이 낮고, 많은 불필요한 요청이 발생한다.
  • 서버 부하가 높아질 수 있다.

롱 폴링 (Long Polling)

롱 폴링은 클라이언트가 서버에 요청을 보내고, 서버는 새로운 데이터가 생길 때까지 응답을 지연시킨 후 전달하는 방식이다. 데이터가 준비되면 즉시 응답을 보내고, 클라이언트는 다시 요청을 보낸다.

특징

  • 실시간성은 HTTP 폴링보다 높다.
  • 클라이언트와 서버 간 연결이 오래 유지되므로 HTTP 연결의 오버헤드가 줄어든다.
  • 서버 부하가 다소 줄어들지만, 여전히 연결 관리가 필요하다.

HTTP 스트리밍 (HTTP Streaming)

HTTP 스트리밍은 서버가 클라이언트와의 HTTP 연결을 끊지 않고 지속적으로 데이터를 푸시하는 방식이다. 클라이언트는 하나의 긴 HTTP 요청을 보내고, 서버는 응답을 끊지 않고 여러 데이터를 지속적으로 전송한다.

특징

  • 지속적인 연결
    • 클라이언트가 연결을 열어두고, 서버가 데이터가 준비될 때마다 전송한다.
  • 실시간성
    • 데이터가 준비되는 즉시 전송되므로, 실시간 통신에 적합하다.
  • 단방향 통신
    • 서버에서 클라이언트로의 데이터 전송만 가능하다.
  • HTTP 기반
    • HTTP 프로토콜을 사용하므로, 방화벽 및 프록시 서버를 통과하는 데 유리하다.

WebSocket 동작 과정

1. Handshake

WebSocket 연결은 HTTP 요청을 통해 시작된다. 클라이언트가 서버에 WebSocket 연결을 요청하는 HTTP 업그레이드(Upgrade) 요청을 보낸다. 이 요청은 일반적인 HTTP 요청과 비슷하지만, 몇 가지 특별한 헤더가 포함된다.

클라이언트의 요청 예시:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
  • Upgrade: websocket: HTTP 연결을 WebSocket으로 업그레이드하도록 요청.
  • Connection: Upgrade: 연결을 업그레이드할 것임을 명시.
  • Sec-WebSocket-Key: 클라이언트가 생성한 임의의 키. 서버는 이 키를 이용해 응답을 생성.
  • Sec-WebSocket-Version: WebSocket 프로토콜의 버전.

서버 응답 예시:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  • 101 Switching Protocols: 성공적으로 프로토콜이 업그레이드되었음을 나타냄.
  • Sec-WebSocket-Accept: 클라이언트의 Sec-WebSocket-Key를 기반으로 생성된 응답 키.

2. 데이터 전송 (Data Transfer)

WebSocket은 데이터를 프레임 단위로 전송한다. 각 프레임은 데이터의 조각을 담고 있으며, 여러 종류의 프레임이 존재한다.

프레임 종류

  • 텍스트 프레임: 텍스트 데이터를 전송.
  • 바이너리 프레임: 바이너리 데이터를 전송.
  • 닫기(Close) 프레임: 연결을 종료.

데이터 프레임 구조

WebSocket 프레임은 헤더와 페이로드(Payload)로 구성된다. 헤더는 프레임의 메타데이터를 포함하고, 페이로드는 실제 전송되는 데이터를 포함한다.

3. 연결 종료 (Connection Closure)

연결을 종료하려면 클라이언트나 서버 중 하나가 닫기(Close) 프레임을 전송해야 한다. 닫기 프레임은 종료 코드와 선택적인 종료 이유를 포함할 수 있다.

  • 연결 종료 절차
    • 클라이언트나 서버가 닫기 프레임을 전송.
    • 상대방이 닫기 프레임을 수신하고 응답으로 닫기 프레임을 전송.
    • 양측의 연결이 종료되고, 더 이상 데이터가 전송되지 않음.
profile
개발합니다

1개의 댓글

comment-user-thumbnail
2024년 4월 22일

유익합니다.

답글 달기