- 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:
- Apa yang harus dikirim server dan apa yang harus diterima browser tidak selaras.
- Tidak ada batasan untuk nilai cookie yang dikirim browser ke server.
- 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
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 RubyProtokol 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