3 poin oleh GN⁺ 2024-11-22 | 1 komentar | Bagikan ke WhatsApp
  • Cookie HTTP: potongan data kecil yang digunakan untuk mempertahankan status web, disertakan dalam semua permintaan HTTP sejak diatur oleh browser hingga kedaluwarsa.
  • Muncul masalah: kode JavaScript tertentu menyebabkan error karena gagal mem-parsing cookie di pustaka standar Go.

Spesifikasi

  • RFC 2109, 2965, 6265: definisi awal dan pembaruan cookie. Spesifikasi untuk nilai cookie tidak konsisten antara server dan browser.
  • Masalah:
    1. Apa yang harus dikirim server dan apa yang harus diterima browser tidak selaras.
    2. Tidak ada batasan untuk nilai cookie yang dikirim browser ke server.
    3. Tidak ada panduan yang jelas tentang bagaimana pustaka standar harus menangani header cookie.

Browser web

  • Firefox: mengizinkan beberapa karakter yang tidak direkomendasikan oleh RFC.
  • Chromium: sedikit lebih ketat daripada Firefox, tetapi tetap mengizinkan banyak karakter.
  • Safari: saat menemukan karakter yang tidak diizinkan, tidak menghentikan pemrosesan cookie dan menerima nilai hingga karakter tersebut.

Pustaka standar

  • Golang: berperilaku mirip RFC, tetapi mengizinkan spasi dan koma.
  • PHP: memunculkan error pada karakter kontrol tertentu.
  • Python: mengabaikan cookie yang tidak dipahami dan menghentikan pemuatan cookie tambahan.
  • Ruby: menerima semua karakter dan melakukan percent-encoding.
  • Rust: menerima semua string UTF-8.

Pentingnya bagi web

  • Masalah nyata: karena spesifikasi yang ambigu, banyak situs web dapat dengan mudah mengalami error.
  • Solusi: IETF HTTP Working Group perlu memperbarui spesifikasi cookie dan memperjelas bagaimana browser serta bahasa pemrograman harus menanganinya.

Tabel ringkasan

  • Penanganan cookie oleh browser dan bahasa: cara tiap browser dan bahasa menangani cookie berbeda-beda. Tingkat kesesuaiannya dengan RFC juga berbeda.

1 komentar

 
GN⁺ 2024-11-22
Komentar Hacker News
  • Cookie penuh dengan masalah tak terduga dan perilaku yang merepotkan, tetapi tetap berfungsi dalam 99,95% kasus. Cookie shadowing adalah masalah yang terjadi saat cookie dengan nama sama tetapi atribut kunci berbeda (domain, path, dll.) disetel, sehingga backend atau JS tidak bisa membedakan cookie yang mana

  • Rust tidak memiliki fitur penanganan cookie di pustaka standarnya, dan merujuk pada perilaku crate pihak ketiga cookie. Ini mencakup opsi percent-encoding seperti di Ruby

  • Protokol HTTP mencakup banyak "protokol" lain di dalamnya, dan browser serta web server menambahkan beragam fitur. Fitur-fitur ini tidak memiliki spesifikasi yang jelas, dan klien maupun server tidak dapat menetapkan kompatibilitas. Akibatnya, keputusan buruk dari masa lalu harus terus dipertahankan

  • Sekitar 10 tahun lalu, saat mengimplementasikan sesi berbasis cookie di sebuah proyek, pernah mengalami masalah di mana itu berjalan di Safari tetapi tidak di Chrome. Ini karena perbedaan browser yang tidak akan menyetel cookie jika formatnya tidak benar

  • Satu-satunya penggunaan cookie yang masuk akal adalah menetapkan token buram agar server dapat mengenali klien. Bukan masalah jika klien dapat menangani nilai yang tidak akan dikirimkan oleh server

  • Cookie adalah masalah yang kompleks, dan hampir mustahil diubah karena masalah kompatibilitas mundur. Perlu dibuat mekanisme baru. Misalnya, mekanisme NewCookie dapat memiliki langkah keamanan modern dan spesifikasi yang ketat

  • Cookie seharusnya dihapus dan digantikan dengan header autentikasi. Akan bagus jika browser dapat mengautentikasi ke situs web dengan cara standar. Sangat disayangkan autentikasi Basic dan Digest tidak memadai

  • Karena kode jaringan Safari bukan open source, port Foundation milik Swift bisa menjadi alternatif yang baik. Di sana dapat diperiksa karakter kontrol dan karakter penghapusan

  • Parsing header cookie membingungkan. "Standar" sebenarnya tidak mencerminkan apa yang benar-benar ada, dan setiap backend server, pustaka, atau framework menerima hal yang berbeda-beda. Jika bisa sepenuhnya mengendalikan frontend dan backend, ini bukan masalah besar, tetapi saat harus berinteraksi dengan hal lain, ini menjadi sangat rumit

  • Saat bereksperimen dengan bahasa Crystal, pernah mengalami masalah serupa. Ingin membangun web scraper sederhana, tetapi klien HTTP bawaan gagal mem-parsing banyak cookie yang disetel dalam respons lalu berhenti