웹 소켓이란?
•
두 프로그램 간의 메시지를 교환하기 위한 통신 방법 중의 하나이다.
•
W3C와 IETF에 의해 자리잡은 표준 프로토콜 중의 하나이다.
◦
W3C: 월드 와이드 웹을 위한 표준을 개발하고 장려하는 조직
◦
IETF: 인터넷의 운영, 관리, 개발에 대해 협의하고 프로토콜과 구조적인 사안들을 분석하는 인터넷 표준화 작업 기구
웹 소켓의 특징
•
양방향 통신(Full-Duplex)
◦
데이터 송수신을 동시에 처리할 수 있는 통신 방법
◦
클라이언트와 서버가 서로에게 원할 때 데이터를 주고 받을 수 있다.
◦
통상적인 Http 통신은 Client가 요청을 보내는 경우에만 Server가 응답하는 단방향 통신이다.
•
실시간 네트워킹(Real Time-Networking)
◦
웹 환경에서 연속된 데이터를 빠르게 노출시킨다.
◦
ex) 채팅, 주식, 비디오 데이터
◦
여러 단말기에 빠르게 데이터를 교환한다.
웹 소켓 이전의 비슷한 기술
Polling
•
서버로 일정 주기 요청 송신
◦
real-time 통신에선 언제 통신이 발생할지 예측이 불가능하기에 불필요한 request와 connection이 생성된다.
◦
real-time 통신이라고 부르기 애매할 정도의 실시간성을 가진다.
Long Polling
•
서버에 요청 보내고 이벤트가 생겨 응답 받을 때까지 연결 종료를 하지 않는다.
•
응답을 받으면 끊고 다시 재요청을 한다. ⇒ 많은 양의 메시지가 쏟아질 경우 polling과 같다.
Streaming
•
서버에 요청을 보내고 끊기지 않은 연결상태에서 끊임없이 데이터를 수신한다.
•
클라이언트에서 서버로의 데이터 송신이 어렵다.
결과적으로 이 모든 방법이 HTTP를 통해 통신하기 때문에 Request, Response 둘 다 Header가 불필요하게 크다는 단점이 있다.
웹 소켓 동작 방법
핸드 쉐이킹 - 요청
•
HTTP 버전: 1.1
•
Host: 웹소켓 서버의 주소
•
Upgrade: 현재 클라이언트, 서버, 전송 프로토콜 연결에서 다른 프로토콜로 업그레이드 또는 변경하기 위한 규칙
•
Connection: Upgrade 헤더 필드가 명시되었을 경우, 송신자는 반드시 Upgrade 옵션을 지정한 Connection 헤더 필드도 전송
•
Sec-WebSocket-Key: 길이가 16바이트인 임의로 선택된 숫자를 base64로 인코딩 한 값
◦
클라이언트와 서버 간의 신원을 인증한다.
•
Origin: 클라이언트로 웹 브라우저를 사용하는 경우에 필수항목으로, 클라이언트의 주소
•
Set-WebSocket-Protocol:
◦
클라이언트가 요청하는 여러 서브프로토콜을 의미
◦
공백문자로 구분되며 순서에 따라 우선권이 부여
◦
서버에서 여러 프로토콜 혹은 프로토콜 버전을 나눠서 서비스할 경우에 필요한 정보
핸드 쉐이킹 - 응답
•
101 Switching Protocols가 Response로 오면 웹소켓이 연결되었다는 의미
•
Set-WebSocket-Accept: 클라이언트로부터 받은 Sec-WebSocket-Key를 사용하여 계산된 값
◦
만일 이 값이 클라이언트에서 계산한 값과 일치하지 않으면 연결 수립 X
데이터 전송
•
데이터 보안을 위해 SSL을 적용한 프로토콜
•
Message: 여러 frame이 모여서 구성하는 하나의 논리적 메시지 단위
•
frame: communication에서 가장 작은 데이터 단위, 작은 헤더 + payload로 구성
•
웹 소켓 통신에 사용되는 데이터는 UTF8 인코딩
◦
0x00 (보내고 싶은 데이터) 0xff
간단 정리
프레임 헤더 구조
웹 소켓 프로토콜의 특징
•
최초 접속에서만 http 프로토콜 위에서 handshaking을 하기 때문에 http header를 사용한다.
•
웹소켓을 위한 별도의 포트는 없으며, 기존 포트(http-80, https-443)을 사용한다.
•
프레임으로 구성된 메시지라는 논리적 단위로 송수신한다.
•
메시지에 포함될 수 있는 교환 가능한 메시지는 텍스트와 바이너리이다.
웹 소켓의 한계
Socket.io, SockJS
•
웹소켓 ⇒ HTML5
그렇다면 HTML5 이전의 기술로 구현된 서비스에서는?
•
Socket.io와 SockJS는 HTML5 이전의 기술로 구현된 서비스에서 웹 소켓처럼 사용할 수 있도록 도와주는 기술이다.
•
Javascript를 이용하여 브라우저 종류에 상관없이 실시간 웹을 구현한다.
•
WebSocket, FlashSocket, AJAX Long Polling, AJAX Multi part Streaming, IFrame, JSONP Polling을 하나의 API로 추상화하였다.
•
즉, 브라우저와 웹 서버의 종류와 버전을 파악하여 가장 적합한 기술을 선택하여 사용하는 방식이다.
STOMP
•
WebSocket은 문자열들을 주고 받을 수 있게 해줄 뿐 그 이상의 일 X
•
주고 받은 문자열의 해독은 온전히 어플리케이션에 맡긴다.
•
HTTP는 형식을 정해두었기 때문에 모두가 약속을 따르기만 하면 해석할 수 있다.
•
하지만 WebSocket은 형식이 정해져 있지 않기 때문에 어플리케이션에서 쉽게 해석하기가 힘들다.
•
때문에 WebSocket 방식은 sub-protocols을 사용해서 주고 받는 메시지의 형태를 약속하는 경우가 많다.
STOMP(Simple Text Oriented Message Protocol)
•
STOMP은 채팅 통신을 하기 위한 형식을 정의한다.
•
HTTP와 유사하게 간단히 정의되어 해석하기 편리한 프로토콜이다.
•
일반적으로 웹소켓에서 사용된다.
프레임 구조
•
프레임 기반의 프로토콜이다. 프레임은 명령, 헤더, 바디로 구성된다.
•
자주 사용되는 명령은 CONNECT, SEND, SUBSCRIBE, DISCONNECT 등이 있다.
•
헤더와 바디는 빈 라인으로 구분하며, 바디의 끝은 NULL 문자로 설정한다.