웹 소켓은 HTML 상에서 말 그대로 소켓 연결을 하여 서버와 실시간으로 데이터를 주고받게 해주는 것이다. 웹소켓은 HTTP 의 반이중적인 통신을 보완하기 위해서 TCP 처럼 전이중적인 통신을 지원해주게 하기 위해서 HTML5 명세에 포함되어 있다.
웹 소켓 설정을 위해서는 웹소켓 열기 핸드셰이크를 진행해야 하는데, 클라이언트와 서버는 HTTP 로 이 과정을 진행한다. 웹 소켓을 요청하는 클라이언트의 HTTP 요청에는 Sec-WebSocket-Key 와 Sec-WebSocket-Version, Upgrade: websocket 등의 헤더가 필요하다. Upgrade 헤더는 클라이언트가 연결을 다른 프로토콜로 업그레이드 할 것임을 나타내며, websocket으로 업그레이드 할 것임을 나타낸다. 다음은 클라이언트와 서버간의 핸드 세이크에서 교환되는 헤더들이다.
서버는 Sec-Websocket-Key 에 대해서 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 키를 붙여서 sha1 으로 해슁해서 Sec-Websocket-Accept 헤더로 응답해야 한다. Sec-Websocket-Accept 헤더는 서버가 웹소켓 프로토콜을 이해한다는 의미가 된다.
웹소켓헤더에는 상위 계층 프로토콜 협상을 위한 Sec-Websocket-Protocol 헤더가 있다. 클라이언트가 보낸 헤더에 대해서 서버에서는 Sec-Websocket-Protocol 로 선택된 프로토콜을 응답한다. 또한 Sec-Websocket-Extensions 값으로 클라이언트는 자신이 제공하는 확장 기능에 대해서 기술할수 있다. 예를 들어 x-webkit-deflate-frame 은 크롬에서 시험판 압축 익스텐션에 대한 옵션 값이다.
웹 소켓이 열리게 되면 메세지를 전송할수 있다. 이 메시지를 웹소켓 프레임이라고 한다. 웹 소켓 프레임 헤더는 프레임 크기가 126 bytes 이하일 경우 다음과 같다.
127 bytes 보다 크고 65535 bytes 보다 작은 경우 다음과 같다.
65535 bytes 이상일 경우 다음과 같이 표시된다.
OPCODE의 의미는 다음과 같다.
MSK는 마스킹 필드로 1로 세팅되어 있으면 Payload 데이터에 마스크로 4바이트가 설정된다. 보통 프레임마다 랜덤하게 만들어지고 XOR 로 적용한다. 마스킹을 하는 이유는 cache-poisoning attack을 방지하기 위함이다.
텍스트는 UTF-8로 인코딩 된다.