[Web] WebSocket Protocol

Minsoo, Kim·2022년 12월 14일
0

Web

목록 보기
1/1

등장배경

과거에는 클라이언트-서버간 양방향 통신이 필요한 웹 애플리케이션을 만들기 위해서는, HTTP가 남용될 수 밖에 없었습니다. 왜냐하면 upstream, downstream을 별도의 HTTP 연결로 전송해야 했기 때문입니다. 이로 인해 다양한 문제들이 발생하게 됩니다.

  • 서버는 클라이언트별로 복수 개의 TCP 연결을 사용해야만 합니다. (하나는 클라이언트로 메세지를 보내기 위한 연결, 다른 하나는 upstream을 받기위한 연결) 결국 높은 오버헤드를 발생시키게 됩니다.
  • 클라이언트는 서버로부터 온 메세지에 대한 응답을 위해서 서버와의 커넥션을 유지 및 관리해야 합니다.

이러한 문제를 해소하기 위해 WebSocket 프로토콜이 등장합니다.

개요

WebSocket은 WebSocket API(WSAPI)와 결합하여, Single TCP 연결로 클라이언트-서버간의 양방향 통신을 제공합니다. WebSocket은 HTTP 위에서 작동하도록 설계되어 80과 443 포트를 HTTP와 동일하게 사용합니다. WebSocket 프로토콜은 handshake, data transfer 두가지 파트로 구분됩니다.

Handshake 파트

아래는 클라이언트가 서버로 보내는 handshake 요청 HTTP 헤더입니다.

		GET /chat HTTP/1.1
        Host: server.example.com
        Upgrade: websocket
        Connection: Upgrade
        Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
        Origin: http://example.com
        Sec-WebSocket-Protocol: chat, superchat
        Sec-WebSocket-Version: 13
  • Upgrade : 프로토콜 전환을 위해 사용하는 헤더입니다. 웹소켓 요청 시에는 반드시 websocket이라는 값을 가집니다.
  • Connection : 현재의 전송이 완료된 후 네트워크 접속을 유지할지 말지를 제어합니다. 웹소켓 요청 시에는 반드시 Upgrade라는 값으로 세팅되어야 합니다.
  • Sec-WebSocket-Key : 유효한 웹소켓 요청인지 확인하기 위해 사용하는 키 입니다.
  • Sec-WebSocket-Protocol : 사용하고자 하는 하나 이상의 웹 소켓 프로토콜을 지정합니다. (Optional)
  • Sec-WebSocket-Version : 클라이언트가 사용하고자 하는 웹소켓 프로토콜 버전을 지정합니다.
  • Origin : CORS에 활용되는 헤더입니다.

아래는 서버가 클라이언트의 handshake에 대해 101코드로 응답하는 헤더 입니다. 101코드는 WebSocket 프로토콜의 전환을 서버가 승인했음을 의미합니다.

		HTTP/1.1 101 Switching Protocols
        Upgrade: websocket
        Connection: Upgrade
        Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
        Sec-WebSocket-Protocol: chat

Data Transfer 파트

Handshake 후에 웹소켓이 연결되면, 데이터 전송파트가 시작됩니다. 이 때부터 서버와 클라이언트는 메세지를 전송할 수 있으며, 이 메세지를 프레임이라고 부릅니다.
웹소켓 프레임의 헤더의 OPCODE(Operate Code) 값으로 프레임의 유형이 결정됩니다. OPCODE별 의미는 아래와 같습니다.

OPCODEMeaning
0Continuation
1Text (UTF-8)
2Binary
3-7Reserved for further non-control frames
8Connection close
9Ping
10Pong
11-15Reserved for further non-control frames

Close OPCODE(8)의 프레임을 전송하면 웹소켓 연결이 종료됩니다.

0개의 댓글