새 WebSocket 프로토콜의 차이점

키타무라 에이지
키타무라 에이지

WebSocket 프로토콜 사양은 최근 이전의 보안 문제를 해결하기 위해 업데이트되었으며 대부분 안정적입니다. 다음은 관련된 변경사항 및 현재 구현에 대한 몇 가지 참고사항입니다.

WebSocket HyBi 00 이후 변경된 사항은 무엇인가요?

  • 프로토콜 프레임 형식이 변경되었습니다. HyBi 00은 각 프레임의 헤드에 "0x00"를 사용하고 꼬리에 "0xff"를 사용했습니다. 이제 HyBi 10은 다음과 같은 새로운 형식을 사용합니다.
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-------+-+-------------+-------------------------------+
     |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
     |I|S|S|S|  (4)  |A|     (7)     |             (16/63)           |
     |N|V|V|V|       |S|             |   (if payload len==126/127)   |
     | |1|2|3|       |K|             |                               |
     +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
     |     Extended payload length continued, if payload len == 127  |
     + - - - - - - - - - - - - - - - +-------------------------------+
     |                               |Masking-key, if MASK set to 1  |
     +-------------------------------+-------------------------------+
     | Masking-key (continued)       |          Payload Data         |
     +-------------------------------- - - - - - - - - - - - - - - - +
     :                     Payload Data continued ...                :
     + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
     |                     Payload Data continued ...                |
     +---------------------------------------------------------------+

보안 문제가 해결됨

  • HyBi 00의 키 3개 대신 Sec-WebSocket-KeySec-WebSocket-Accept가 추가되었습니다. 브라우저가 무작위로 생성된 번호를 Sec-WebSocket-Key에 제공합니다. 그런 다음 서버는 WebSocket 프로토콜의 특정 GUID (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) 및 SHA1 / BASE64 등과 함께 이를 사용하여 Sec-WebSocket-Accept을 반환하므로 브라우저가 WebSocket을 이해한다는 것을 확인할 수 있습니다. 이를 통해 교차 프로토콜 공격을 방지할 수 있습니다.
  • 이제 각 프레임에서 프레임 마스킹이 필요합니다. 이렇게 하면 프록시에서 캐시 포이즈닝이 방지됩니다. Sec-WebSocket-Origin가 추가되어 서비스 제공업체가 인식하지 못하는 스크립트의 액세스를 방지합니다.
  • 서비스 제공업체가 인식하지 못하는 스크립트의 액세스를 방지하기 위해 HyBi 00의 Origin 키 대신 Sec-WebSocket-Origin가 추가됩니다. HyBi 11에서는 'Origin'입니다.

JS API 변경사항

  • 이제 subprotocol가 배열이 될 수 있으므로 new WebSocket(String url, Array subprotocol)의 메서드 서명을 사용할 수 있습니다.
  • .protocol 속성 [String]
  • .binaryType 속성 [Blob|ArrayBuffer]
  • .extension [문자열]
  • 상태 코드와 이유 (연결이 닫힌 이유)를 CloseEvent에 추가했습니다. close() 함수도 이러한 두 인수를 적절하게 허용하도록 변경되었습니다.

확장 프로그램

  • Sec-WebSocket-Extensions가 추가되었습니다. 추천 광고 확장:
  • deflate-frame는 소스에서 프레임을 압축하고 대상에서 추출하도록 합니다.
  • x-google-mux는 멀티플렉싱을 지원하지만 초기 단계에 있습니다.

서버와 브라우저 구현 모두에서 HyBi 00과 HyBi 10 간에 호환성이 있나요?

  • 서버 구현은 핸드셰이크 HTTP 헤더를 확인하여 HyBi 00 및 HyBi 10을 모두 지원할 수 있습니다. 하지만 HyBi 00은 취약한 것으로 알려져 있으므로 지원하지 않는 것이 좋습니다.
  • WebSocket JavaScript API는 이전 버전과 새 버전이 상당히 유사합니다. 하지만 위에서 언급한 것처럼, HyBi 00은 취약한 것으로 알려져 있으므로 이 방식은 지원하지 않는 것이 좋습니다.

어떤 브라우저에서 HyBi 10을 지원하나요?

  • Chrome 14는 위에 언급된 WebSocket JavaScript API 변경사항이 아직 진행 중이지만 HyBi 10 프로토콜을 지원합니다. Firefox 7도 HyBi 10을 지원할 예정입니다.