WebSockets

Tony·2023년 5월 31일
0
  • stateful protocol
  • handshake with HTTP
  • bi-directional connection
  • ws:// (포트 80 사용) wss:// (포트 443 사용)
  1. establish HTTP connection
  2. HTTP request : GET 1.1 UPGRADE
  3. HTTP response : 101(Switching Protocol)
  4. websocket connection established

웹소켓의 특징은 HTTP/HTTPS로 연결을 맺고, HTTP 포트(80)이나 HTTPS 포트(443)을 통해 통신한다는 점입니다. 또한, 한번 연결을 맺으면 직접 닫을때까지 연결이 유지됩니다.

Connection - HTTP request (client)

  • Connection: Upgrade
    - Connection 헤더는 네트워크 연결을 제어하기 위해 사용하는 헤더입니다. 보통의 HTTP 연결에서는 해당 헤더에 keep-alive를 명시해서 연결이 이어지도록 합니다.
    웹소켓의 연결을 맺을 때는 Connection 헤더에 Upgrade를 기입하여 요청함으로써, 연결을 유지하면서 다른 프로토콜을 사용할 것이라는 신호를 보냅니다.
  • Upgrade: websocket
    - Upgrade 헤더에 websocket을 명시함으로써 해당 프로토콜으로의 변경을 서버에 요청합니다.
  • Sec-WebSocket-Key: YWJjZGVmZ3JhYmRlcWFmZQ==
    - 무작위로 만들어진 Base64 엔코딩된 16바이트 값입니다.
  • Sec-WebSocket-Version:13
    - 웹소켓의 버전을 명시하는 헤더입니다.

<웹소켓 연결 요청 예시>

GET ws://example.com HTTP/1.1
Host: localhost:28282
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: YWJjZGVmZ3JhYmRlcWFmZQ==

Connection - HTTP response (server)

서버는 HTTP 요청에 대한 응답을 합니다. 프로토콜 Upgrade에 대한 요청이 성공하면, 101 상태코드와 함께 어느 프로토콜로 변경되는지에 대한 정보를 헤더에 기입해 보내주어야합니다.

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: NmI2YTJiNzc4ZTA3NjBkYmMzOGQzOWVjMDQ5YjhlZDIxNmRkMzViNw==
  • Connection: Upgrade
    연결이 업그레이드 되었음을 확인해줍니다.
  • Upgrade: websocket
    웹소켓으로 업그레이드 되었음을 확인해줍니다.
  • Sec-WebSocket-Accept: NmI2YTJiNzc4ZTA3NjBkYmMzOGQzOWVjMDQ5YjhlZDIxNmRkMzViNw==
    base64 인코딩된 SHA-1 해쉬 값이 들어갑니다. 요청에 있었던 Sec-WebSocket-Key 값과 258EAFA5-E914-47DA-95CA-C5AB0DC85B11를 붙여서 SHA-1로 해싱한 후, base64 인코딩을 해서 나온 값을 해당 헤더에 첨부해 보냅니다.
    Sec-WebSocket-KeySec-WebSocket-Accept를 첨부하는 이유는, 클라이언트와 서버가 서로 웹소켓 프로토콜을 지원하는지 확인하기 위함입니다. 만약, 한쪽이 프로토콜을 지원하지 않는다면 웹소켓 데이터를 단순한 HTTP 요청으로 취급하기 때문에 잠재적인 보안 이슈가 발생할 수 있습니다.

Scheme

WebSocket은 http 프로토콜을 따르는 것이 아니라, WebSocket이라는 새로운 프로토콜을 따릅니다. 따라서, ws:이나 wss:와 같은 scheme을 사용합니다.

Reference

https://sookocheff.com/post/networking/how-do-websockets-work/

0개의 댓글