티스토리 뷰

Web

웹 소켓

조용한스택 2021. 11. 11. 18:17

웹소켓(WebSocket)은 하나의 TCP 접속에 duplex 통신 가능한 프로토콜

OSI 7계층, TCP 4계층에 위치한다. HTTP와 구별된다.

기본적인 메세지 프레임으로 된 handshake로 구성된다

웹소켓의 목적은 여러 번의 HTTP 커넥션으로 동작하지 않는 서버와의 양방향 통신이 필요한 브라우저 기반의 애플리케이션에게 메커니즘을 제공하기 위함이다.

 

탄생 배경

기존에 클라이언트와 서버 간의 양방향 통신이 필요한 웹 어플리케이션(즉각적인 메세지나 게임)을 만드려면 upstream 알림을 별개의 HTTP 호출로 전송하는 동안 업데이트를 위해 서버를 폴링하는 HTTP를 남용해야 했다.

즉 요청과 별개로 애플리케이션 상태 갱신을 위해 서버를 폴링하며 HTTP를 남용했다.

 

이로 인해 여러 문제가 발생한다

- 서버는 각 클라이언트에 대해 서로 다른 여러 개의 기본 TCP 연결을 사용해야 한다. 하나는 클라이언트로 정보를 보내고 다른 하나는 들어오는 메세지마다 새로운 TCP 연결을 해야 한다

- 유선 프로토콜을 통한 HTTP 헤더를 가진 클라이언트-서버 간 메세지는 높은 오버헤드가 있다. 

- 클라이언트 측 스크립트는 응답을 추적하기 위해 송신연결에서 수신되는 연결로의 매핑을 유지해야 한다.

 

이런 문제점의 해결책으로 양방향 트래픽에 단일 TCP 연결을 사용하는 WebSocket이 만들어졌다.

WebSocket Protocol은 HTTP를 전송 계층으로 사용하는 양방향 통신 기술로 고안되었다.

 

handshake

 

handshake는 HTTP 업그레이드 헤더를 사용하여 HTTP 프로토콜에서 웹소켓 프로토콜로 변경한다

 

웹소켓을 통한 연결

  • client side handshake:
GET /char HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: XXXX
Origin: http://example.com
Sec-WebSocket-Protocol: char, superchar
Sec-WebSocket-Version: 13
  • server side handshake:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: xxxxxx
Sec-WebSocket-Protocol: char
  • Sec-WebSocket-Key

opening handshake 시 client가 보내는 요청 헤더에만 포함되는 필드이다.

서버가 유효한 WebSocket opening handshake를 수신했음을 증명하기 위해 사용한다. 

 

- 디자인 철학

웹 소켓 프로토콜은 최소한의 프레임 원칙에 따라 고안되었다. 이것은 TCP 계층 위에 애플리케이션 계층의 메타데이터를 올리듯, WebSocket 위에 애플리케이션의 메타데이터를 올릴 수 있다는 것을 뜻하기도 한다.

 

개념적으로, WebSocket 은 다음을 만족하는 TCP 위의 계층이기도 하다

- 브라우저를 위한 웹 origin 기반 보안 모델을 추가

- 하나의 IP 주소에 여러 host name과 하나의 port에 여러 서비스를 제공하기 위해 주소와 프로토콜 네이밍 메커니즘을 추가

- 프록시와 다른 상호작용의 존재에서 동작할 수 있도록 하는 추가적인 closing handshake를 포함한다

 

TCP와 HTTP와의 관계

WebSocket 프로토콜은 독립적인 TCP 기반 프로토콜이다. 
HTTP와의 관계는 오직 HTTP 서버에 의해 Upgrade 요청으로 해석되는 handshake 뿐이다.

 

통신은 TCP 포트 80 (TLS 암호화 연결의 경우 443)을 통해 수행되며 방화벽을 통해 웹이 아닌 인터넷 연결을 차단하는 일부 환경에 도움이 된다.

 

참고

'Web' 카테고리의 다른 글

REST란 무엇인가?  (0) 2021.12.22
HTTP Method 7가지  (0) 2021.12.22
인증 서버  (0) 2020.11.03
웹 브라우저 DB  (0) 2020.08.01
DOM  (0) 2020.07.31
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함