Untuk proses otentikasi saya, saya membuat token unik ketika pengguna login dan memasukkannya ke dalam cookie yang digunakan untuk otentikasi.
Jadi saya akan mengirim sesuatu seperti ini dari server:
Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/;
Yang berfungsi di semua browser. Kemudian untuk menghapus cookie saya mengirim cookie serupa dengan expires
bidang yang ditetapkan untuk 1 Januari 1970
Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/; expires=Thu, Jan 01 1970 00:00:00 UTC;
Dan itu berfungsi dengan baik di Firefox tetapi tidak menghapus cookie di IE atau Safari.
Jadi apa cara terbaik untuk menghapus cookie (tanpa JavaScript lebih disukai)? Metode set-the-expires-in-the-past tampaknya besar. Dan juga mengapa ini bekerja di FF tetapi tidak di IE atau Safari?
Jawaban:
Mengirim nilai cookie yang sama dengan yang
; expires
ditambahkan tidak akan menghancurkan cookie.Validasi cookie dengan menetapkan nilai kosong dan sertakan
expires
bidang juga:Perhatikan bahwa Anda tidak dapat memaksa semua browser untuk menghapus cookie. Klien dapat mengonfigurasi browser sedemikian rupa sehingga cookie tetap ada, bahkan jika cookie itu kadaluwarsa. Menetapkan nilai seperti dijelaskan di atas akan menyelesaikan masalah ini.
sumber
"deleted"
, untuk menghindari kebingungan nanti dengan nilai yang berpotensi legal sama dengan "dihapus"foo=bar; domain=www.example.com
, cookie lainfoo=qux; domain=.example.com
akan digunakan.Pada saat saya menulis jawaban ini, jawaban yang diterima untuk pertanyaan ini tampaknya menyatakan bahwa browser tidak diharuskan untuk menghapus cookie ketika menerima cookie pengganti yang
Expires
nilainya di masa lalu. Klaim itu salah. PengaturanExpires
untuk berada di masa lalu adalah cara standar, khusus untuk menghapus cookie, dan agen pengguna diharuskan oleh spec untuk menghormatinya.Menggunakan
Expires
atribut di masa lalu untuk menghapus cookie adalah benar dan merupakan cara untuk menghapus cookie yang ditentukan oleh spesifikasi. Bagian contoh dari RFC 6255 menyatakan:Bagian Persyaratan Agen Pengguna mencakup persyaratan berikut, yang bersama-sama memiliki efek bahwa cookie harus segera dihapus jika agen pengguna menerima cookie baru dengan nama yang sama dengan tanggal kedaluwarsa di masa lalu
Poin 11-3, 11-4, dan 12 di atas bersama-sama berarti bahwa ketika cookie baru diterima dengan nama, domain, dan jalur yang sama, cookie lama harus dihapus dan diganti dengan cookie baru. Akhirnya, poin di bawah tentang kadaluarsa cookie lebih lanjut menentukan bahwa setelah itu selesai, cookie baru juga harus segera diusir. Spesifikasi tidak menawarkan ruang gerak untuk browser pada titik ini; jika browser menawarkan opsi kepada pengguna untuk menonaktifkan kedaluwarsa cookie, seperti jawaban yang diterima menyarankan beberapa browser, maka itu akan melanggar spesifikasi. (Fitur seperti itu juga tidak banyak berguna, dan sejauh yang saya tahu tidak ada di browser apa pun.)
Lalu, mengapa OP dari pertanyaan ini mengamati bahwa pendekatan ini gagal? Meskipun saya belum membersihkan salinan dari Internet Explorer untuk memeriksa perilakunya, saya menduga itu karena nilai OP
Expires
salah! Mereka menggunakan nilai ini:Namun, ini tidak valid secara sintaksis dalam dua cara.
Bagian sintaks dari spec menentukan bahwa nilai
Expires
atribut harus aMengikuti tautan kedua di atas, kami menemukan ini diberikan sebagai contoh format:
dan temukan bahwa definisi sintaks ...
mensyaratkan bahwa tanggal ditulis dalam format hari bulan tahun , bukan format bulan hari tahun seperti yang digunakan oleh penanya.
Secara khusus, ini mendefinisikan
rfc1123-date
sebagai berikut:dan mendefinisikan
date1
seperti ini:dan
tidak mengizinkan
UTC
sebagai zona waktu.Spesifikasi tersebut berisi pernyataan berikut tentang offset zona waktu apa yang dapat diterima dalam format ini:
Terlebih lagi jika kita menggali lebih dalam ke spesifikasi asli format datetime ini, kita menemukan bahwa dalam spesifikasi awalnya di https://tools.ietf.org/html/rfc822 , bagian Sintaksis mencantumkan "UT" (artinya "waktu universal" ) sebagai nilai yang mungkin, tetapi tidak mencantumkan bukan UTC (Waktu Universal Terkoordinasi) yang valid. Sejauh yang saya tahu, menggunakan "UTC" dalam format tanggal ini tidak pernah valid; itu bukan nilai yang valid ketika format pertama kali ditentukan pada tahun 1982, dan spesifikasi HTTP telah mengadopsi versi format yang lebih ketat dengan melarang penggunaan semua nilai "zona" selain "GMT".
Jika penanya di sini menggunakan
Expires
atribut seperti ini , maka:maka itu mungkin akan berhasil.
sumber
Pengaturan "kedaluwarsa" ke tanggal yang lalu adalah cara standar untuk menghapus cookie.
Masalah Anda mungkin karena format tanggal tidak konvensional. IE mungkin hanya mengharapkan GMT.
sumber
Gunakan Max-Age = -1 daripada "Kedaluwarsa". Itu lebih pendek, kurang pilih-pilih tentang sintaks, dan Max-Age lebih diutamakan daripada Expired.
sumber
Untuk implementasi GlassFish Jersey JAX-RS saya telah mengatasi masalah ini dengan metode umum yang menggambarkan semua parameter umum. Setidaknya tiga parameter harus sama: nama (= "nama"), jalur (= "/") dan domain (= nol):
Dan gunakan itu cara umum untuk mengatur cookie:
dan untuk menghapus cookie:
sumber
Max-Age
sebagai tanggal dan waktu yang paling awal yang dapat diwakili, tetapi server dilarang mengirim nilai seperti ituMax-Age
. Saya kira penulis tahu tentang kedua klien yang sudah ada yang tidak bisa menanganiMax-Age=0
dan server yang mengirimnya pada saat mereka menulis spec, dan mencoba untuk mengurangi masalah dari kedua ujungnya.