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

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 は、サービス プロバイダが認識していないスクリプトからのアクセスを防ぐために追加されます。
  • Sec-WebSocket-Origin は、サービス プロバイダが認識していないスクリプトからのアクセスを防ぐために、HyBi 00 の Origin キーの代わりに追加されます。HyBi 11 では「Origin」のみになります。

JS API の変更

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

拡張機能

  • 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 では HyBi 10 プロトコルがサポートされていますが、前述の WebSocket JavaScript API の変更はまだ進行中です。Firefox 7 でも HyBi 10 のサポートが予定されています。