Apa yang berbeda dalam protokol WebSocket baru

Eiji Kitamura
Eiji Kitamura

Spesifikasi protokol WebSocket baru-baru ini diperbarui untuk mengatasi masalah keamanan sebelumnya dan sebagian besar sudah stabil. Di bawah ini adalah ringkasan perubahan yang terlibat, bersama dengan beberapa catatan tentang implementasi saat ini.

Apa yang telah berubah sejak WebSocket HyBi 00?

  • Format frame protokol telah diubah. HyBi 00 sebelumnya menggunakan "0x00" untuk head dan "0xff" untuk ekor untuk setiap frame. HyBi 10 sekarang menggunakan format baru seperti berikut:
      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 ...                |
     +---------------------------------------------------------------+

Masalah keamanan telah diatasi

  • Sec-WebSocket-Key dan Sec-WebSocket-Accept ditambahkan sebagai pengganti tiga kunci HyBi 00. Browser memberikan angka yang dibuat secara acak ke Sec-WebSocket-Key. Kemudian, server menggunakannya dengan GUID (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) khusus protokol WebSocket dan SHA1 / BASE64, dll. untuk menampilkan Sec-WebSocket-Accept sehingga browser dapat mengonfirmasi bahwa browser memahami WebSocket. Tindakan ini mencegah serangan lintas protokol.
  • Pada setiap frame, kini masking frame diperlukan. Hal ini mencegah {i>cache poisoning<i} pada {i>proxy<i}. Sec-WebSocket-Origin ditambahkan untuk mencegah akses dari skrip yang tidak diketahui penyedia layanan.
  • Sec-WebSocket-Origin ditambahkan sebagai pengganti kunci Origin HyBi 00 untuk mencegah akses dari skrip yang tidak diketahui penyedia layanan. Perhatikan bahwa ini hanya akan menjadi "Origin" di HyBi 11.

Perubahan JS API

  • subprotocol kini dapat berupa array, yang memungkinkan tanda tangan metode new WebSocket(String url, Array subprotocol)
  • Atribut .protocol [String]
  • Atribut .binaryType [Blob|ArrayBuffer]
  • .extension [String]
  • Kode status dan alasan (alasan koneksi ditutup) telah ditambahkan ke CloseEvent. Fungsi close() juga telah diubah untuk menerima kedua argumen ini.

Ekstensi

  • Sec-WebSocket-Extensions ditambahkan. Ekstensi yang diusulkan adalah:
  • deflate-frame membuat frame yang dikompresi pada sumber dan diekstrak di tujuan.
  • x-google-mux untuk mendukung multiplexing, tetapi masih dalam tahap awal.

Apakah ada kompatibilitas antara HyBi 00 dan HyBi 10 pada implementasi server dan browser?

  • Implementasi server dapat mendukung HyBi 00 dan HyBi 10 dengan melihat header HTTP handshake. Namun, mendukung HyBi 00 tidak disarankan karena diketahui rentan.
  • WebSocket JavaScript API sebagian besar mirip dengan versi lama dan baru. Namun, seperti disebutkan di atas, kami tidak merekomendasikan dukungan untuk HyBi 00 karena diketahui rentan.

Browser apa yang mendukung HyBi 10?

  • Chrome 14 mendukung protokol HyBi 10 meskipun perubahan WebSocket JavaScript API yang disebutkan di atas masih dalam proses. Firefox 7 juga direncanakan untuk mendukung HyBi 10.