新しい WebSocket プロトコルの相違点

Eiji Kitamura
Eiji Kitamura

WebSocket プロトコルの仕様は、これまでのセキュリティ上の懸念を解決するために最近更新され、ほぼ安定しています。以下に、変更の概要と現在の実装に関する注意事項を示します。

WebSocket HyBi 00 からの変更点

  • プロトコル フレームの形式が変更されました。HyBi 00 では、各フレームの head に "0x00"、tail に "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 のオリジン キーの代わりに Sec-WebSocket-Origin が追加されています。HyBi 11 では単に「Origin」になります。

JS API の変更

  • subprotocol を配列にできるようになり、new WebSocket(String url, Array subprotocol) のメソッド シグネチャを使用できるようになりました。
  • .protocol 属性 [文字列]
  • .binaryType 属性 [Blob|ArrayBuffer]
  • .extension [文字列]
  • ステータス コードと理由(接続が閉じられた理由)を CloseEvent に追加しました。また、これら 2 つの引数を適宜受け入れるように close() 関数も変更されました。

拡張機能

  • Sec-WebSocket-Extensions が追加されました。提案されている拡張機能は次のとおりです。
  • deflate-frame を使用すると、フレームをソースで圧縮し、宛先で抽出できます。
  • x-google-mux: 多重化をサポートしますが、これは初期段階です。

HyBi 00 と HyBi 10 には、サーバー実装とブラウザ実装の両方で互換性がありますか?

  • サーバー実装では、handshake HTTP ヘッダーを確認することで、HyBi 00 と HyBi 10 の両方をサポートできます。ただし、HyBi 00 は脆弱であることがわかっているため、サポートはおすすめしません。
  • WebSocket JavaScript API は、新旧のバージョンでほぼ同じです。ただし、前述のとおり、HyBi 00 は脆弱であることが判明しているため、サポートはおすすめしません。

HyBi 10 に対応しているブラウザはどれですか?

  • Chrome 14 は HyBi 10 プロトコルをサポートしていますが、上記の WebSocket JavaScript API の変更はまだ進行中です。Firefox 7 も HyBi 10 をサポートする予定です。