Jawaban:
Spesifikasi cookie saat ini adalah RFC 6265 , yang menggantikan RFC 2109 dan RFC 2965 (kedua RFC sekarang ditandai sebagai "Bersejarah") dan memformalkan sintaks untuk penggunaan cookie di dunia nyata. Ini dengan jelas menyatakan:
- pengantar
...
Untuk alasan historis, cookie berisi sejumlah infelicities keamanan dan privasi. Misalnya, server dapat menunjukkan bahwa cookie yang diberikan ditujukan untuk koneksi "aman", tetapi atribut Secure tidak memberikan integritas di hadapan penyerang jaringan yang aktif. Demikian pula, cookie untuk host tertentu dibagikan di semua port pada host itu, meskipun "kebijakan asal-sama yang biasa" yang digunakan oleh browser web mengisolasi konten yang diambil melalui port yang berbeda.
Dan juga:
8.5. Kerahasiaan yang Lemah
Cookie tidak menyediakan isolasi oleh port . Jika cookie dapat dibaca oleh layanan yang berjalan di satu port, cookie juga dapat dibaca oleh layanan yang berjalan di port lain dari server yang sama. Jika cookie dapat ditulis oleh layanan di satu port, cookie juga dapat ditulis oleh layanan yang berjalan di port lain dari server yang sama. Untuk alasan ini, server TIDAK HARUS menjalankan layanan yang saling tidak percaya pada port yang berbeda dari host yang sama dan menggunakan cookie untuk menyimpan informasi sensitif keamanan.
Menurut RFC2965 3.3.1 (yang mungkin atau mungkin tidak diikuti oleh browser), kecuali port tersebut ditentukan secara eksplisit melalui port
parameter Set-Cookie
header, cookie mungkin atau mungkin tidak dikirim ke port apa pun.
Buku Pegangan Keamanan Browser Google mengatakan: secara default, lingkup cookie terbatas untuk semua URL pada nama host saat ini - dan tidak terikat pada informasi port atau protokol. dan beberapa baris kemudian. Tidak ada cara untuk membatasi cookie hanya untuk satu nama DNS saja [...] demikian pula, tidak ada cara untuk membatasi cookie ke port tertentu. (Juga, perlu diingat, bahwa IE tidak memasukkan nomor port ke dalam kebijakan asal yang sama sekali .)
Jadi sepertinya tidak aman untuk mengandalkan perilaku yang didefinisikan dengan baik di sini.
Ini adalah pertanyaan yang sangat lama tapi saya pikir saya akan menambahkan solusi yang saya gunakan.
Saya memiliki dua layanan yang berjalan pada laptop saya (satu pada port 3000 dan yang lainnya pada 4000). Ketika saya akan beralih antara ( http://localhost:3000
dan http://localhost:4000
), Chrome akan meneruskan cookie yang sama, setiap layanan tidak akan memahami cookie dan menghasilkan yang baru.
Saya menemukan bahwa jika saya mengakses http://localhost:3000
dan http://127.0.0.1:4000
, masalahnya hilang sejak Chrome menyimpan cookie untuk localhost dan satu untuk 127.0.0.1.
Sekali lagi, tidak ada yang peduli pada titik ini tetapi mudah dan bermanfaat untuk situasi saya.
localhost
tidak dapat dengan dibagikan dengan 127.0.0.1
dan sebaliknya. Tetapi cookie pada host / domain yang sama, terlepas dari porta, dapat dibagikan.
Ini adalah area abu-abu besar dalam SOP cookie (Kebijakan Asal yang Sama).
Secara teoritis, Anda dapat menentukan nomor port di domain dan cookie tidak akan dibagikan. Dalam praktiknya, ini tidak bekerja dengan beberapa browser dan Anda akan mengalami masalah lain. Jadi ini hanya layak jika situs Anda bukan untuk masyarakat umum dan Anda dapat mengontrol browser apa yang akan digunakan.
Pendekatan yang lebih baik adalah mendapatkan 2 nama domain untuk IP yang sama dan tidak mengandalkan nomor port untuk cookie.
Cara alternatif untuk mengatasi masalah ini, adalah menjadikan nama cookie sesi terkait dengan port. Sebagai contoh:
Kode Anda dapat mengakses konfigurasi server web untuk mengetahui port mana yang digunakan server Anda, dan beri nama cookie yang sesuai.
Ingatlah bahwa aplikasi Anda akan menerima kedua cookie, dan Anda harus meminta yang sesuai dengan port Anda.
Tidak perlu memiliki nomor port yang tepat dalam nama cookie, tetapi ini lebih nyaman.
Secara umum, nama cookie dapat menyandikan parameter lain apa pun yang spesifik untuk instance server yang Anda gunakan, sehingga dapat didekodekan oleh konteks yang benar.
Saya mengalami masalah yang sama saat menjalankan (dan mencoba men-debug) dua aplikasi Django yang berbeda pada mesin yang sama.
Saya menjalankannya dengan perintah-perintah ini:
./manage.py runserver 8000
./manage.py runserver 8001
Ketika saya melakukan login di yang pertama dan kemudian di yang kedua saya selalu keluar yang pertama dan sebaliknya.
Saya menambahkan ini di / etc / hosts saya
127.0.0.1 app1
127.0.0.1 app2
Lalu saya memulai dua aplikasi dengan perintah ini:
./manage.py runserver app1:8000
./manage.py runserver app2:8001
Masalah terpecahkan :)
127.0.0.1:8000
untuk satu, localhost:8000
untuk yang kedua, dan mungkin ::1:8000
(mungkin [::1]:8080
) untuk yang ketiga tanpa harus menyentuh file host.
::1 app1 app2 app3 app4 app5 appN
Itu opsional.
Port dapat ditentukan sehingga cookie dapat spesifik port. Itu tidak perlu, server web / aplikasi harus mengurus ini.
Sumber: Artikel Wikipedia bahasa Jerman , RFC2109 , Bab 4.3.1
Port
parameter diSet-Cookie
header (karena hampir tidak ada yang benar-benar menggunakannya dalam praktiknya), dan membuatnya sangat eksplisit bahwa cookie pada host yang sama TIDAK TIDAK dapat dipisahkan oleh port lagi.