웹소켓에 대해

김동욱·2021년 12월 29일

웹소켓(websocket)에 대한 개념을 익히고 특징을 살펴본다.

웹소켓?

두 프로그램 간에 메세지(데이터)를 교환하기 위한 통신 방법 중 하나이다

  • W3C와 IETF에 의해 자리잡은 표준 프로토콜 중 하나
  • 현재 인터넷 환경(HTML5)에서 많이 사용된다.
  • 웹 소켓을 지원하는 브라우저의 경우 웹 소켓 프로토콜을 지원

웹소켓 특징

  1. 양방향 통신 (Full-Duplex)
    • 데이터 송수신을 동시에 처리할 수 있는 통신 방법
    • 클라이언트와 서버가 서로 원할 때 데이터를 주고 받을 수 있다.
    • 통상적인 http통신은 client가 요청 보내는 경우에만 server가 응답하는 단방향 방식이다.
  2. 실시간 네트워킹 (Real Time-Networking)
    • 웹 환경에서 연속된 데이터를 빠르게 노출
    • ex) 채팅, 주식차트, 비디오 데이터

웹 소켓 이전의 실시간 통신은 어떻게 했냐?

  • Polling
    : 서버로 일정 주기로 요청을 송신한다.
    : 송신할 필요가 없는 경우에도 불필요한 송신 발생
    : 실시간 통신이라고 하기엔 애매함
  • Long Polling
    : 서버에 요청을 보낸 후 응답을 받을 때까지 연결을 종료하지 않는 방식
    : 응답을 받으면 연결이 종료되고 다시 재요청
    : 많은 양의 메세지가 쏟아질 경우 polling과 같다.
  • Streaming
    : 서버에 요청 보내고 연결이 끊기지 않은 상태에서 계속 데이터 수신
    : 클라이언트에서 서버로의 테이터 송신이 어렵다

    결과적으로 위 3가지 방식 모두 HTTP를 통해 통신하기 때문에 요청,응답시에 header가 불필요하게 크다.

웹 소켓 동작 방법

1) 핸드 쉐이킹

  • 웹소켓 클라이언트에서 핸드 쉐이크 요청(HTTP Upgrade)을 전송하고 이에 대한 응답으로 핸드 쉐이크 응답을 받는다.

  • 이 때 응답 코드는 101이다. (status conde - 101 : 프로토콜 전환)

    이 과정에서 발생하는 요청과 응답의 헤더에 대해 살펴보자.

1-1) 요청(request) 헤더

GET /chat HTTP/1.1  //반드시 get메서드로 요청한다.
Host: localhost:8080 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== 
Sec-WebSocket-Protocol: chat, superchat 
Sec-WebSocket-Version: 13 
Origin: http://localhost:9000
  • Host : 웹소켓 서버의 주소
  • Upgrade : 프로토콜을 전환하기 위해 사용하는 헤더. 웹소켓 요청 시에는 반드시 websocket이라는 값을 가지며, 이 값이 없거나 다른 값이면 cross-protocol attack이라고 간주하여 웹소켓 접속을 중지시킨다.
  • Connection : 현재의 전송이 완료된 후 네트워크 접속을 유지할 것인가에 대한 정보. 웹소켓 요청 시에는 반드시 Upgrade라는 값을 가지며, Upgrade와 마찬가지로 이 값이 없거나 다른 값이면 웹소켓 접속을 중지시킨다.
  • Sec-WebSocket-Key : 이 key값을 통해 클라이언트-서버간 신원을 인증한다..
    Sec-WebSocket-Protocol : 사용하고자 하는 하나 이상의 웹 소켓 프로토콜 지정. 필요한 경우에만 사용.
  • Sec-WebSocket-Version : 클라이언트가 사용하고자 하는 웹소켓 프로토콜 버전.
  • Origin : 클라이언트의 주소

1-2) 응답(response) 헤더

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  • Upgrade와 Connection은 요청과 동일.
  • Sec-WebSocket-Accept : 요청 헤더의 Sec-WebSocket-Key에 유니크 아이디를 더해서 SHA-1로 해싱한 후, base64로 인코딩한 결과.

2) 데이터 전송

  • 핸드 쉐이크를 통해 웹소켓 연결이 수립되면 데이터 전송 파트가 시작된다.
  • 프로토콜이 ws로 변경.
    - ws : 80 (port)
    - wss : 443 (port)
  • 메세지를 통해 양방향 데이터 전송한다.
  • 메세지(message) : 여러 frame이 모여 구성하는 하나의 논리적 메세지(데이터) 단위
  • 프레임(frame) :
    - 통신에서 가장 작은 단위의 데이터
    - 작은 헤더 + payload 로 구성
    - 웹소켓 통신에 상용되는 데이터는 UTF8로 인코딩을 통해서만 지원된다.

3) 연결 종료

  • 데이터의 양방향 전송이 모두 완료 되었다면 이제는 연결을 종료한다.
  • 연결 종료 할 때는 Close Frame을 주고 받으며 종료한다.
  • 연결 종료 이후에 수신되는 모든 추가적인 데이터는 버려진다.

reference :
https://blogs.oracle.com/theaquarium/post/entry/slideshow_example_using_comet_dojo
https://kellis.tistory.com/65
https://codecoco.tistory.com/117
https://www.youtube.com/watch?v=MPQHvwPxDUw

profile
웹 개발 관련 공부한 내용 기록하는 블로그입니다.

0개의 댓글