Apakah port cookie HTTP spesifik?

355

Saya memiliki dua layanan HTTP yang berjalan pada satu mesin. Saya hanya ingin tahu apakah mereka membagikan cookie mereka atau apakah browser membedakan antara dua soket server.

guerda
sumber

Jawaban:

329

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:

  1. 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.

Remy Lebeau
sumber
129

Menurut RFC2965 3.3.1 (yang mungkin atau mungkin tidak diikuti oleh browser), kecuali port tersebut ditentukan secara eksplisit melalui portparameter Set-Cookieheader, 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.

Tgr
sumber
75
RFC 6265 , yang menggantikan RFC 2965, menghilangkan Portparameter di Set-Cookieheader (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.
Remy Lebeau
5
IE 9 bahkan tidak akan mengirim cookie kembali pada permintaan berikutnya jika domain memiliki port di dalamnya
axk
3
Apakah ada browser yang masih mempertimbangkan port di SOP cookie-nya?
Bertuz
5
Chrome bahkan tidak akan mengatur cookie jika memiliki domain yang memiliki port di dalamnya.
Pim Heijden
76

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:3000dan 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:3000dan 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.

Menepuk
sumber
1
Ya, karena cookie dikaitkan dengan nama host / domain, sehingga cookie localhosttidak dapat dengan dibagikan dengan 127.0.0.1dan sebaliknya. Tetapi cookie pada host / domain yang sama, terlepas dari porta, dapat dibagikan.
Remy Lebeau
3
Tentu saja mereka lakukan. Saya (dan mungkin jutaan pengembang lain) menggunakan localhost untuk menguji sepanjang waktu. Kecuali jika port yang ditambahkan membuat perbedaan: localhost: 8080
David Balažic
53
Anda juga dapat menggunakan 127.0.0.1, 127.0.0.2, 127.0.0.3 dll ... semuanya berarti localhost.
David Balažic
3
Saya tidak dapat memperbaiki ini karena tidak menjawab pertanyaan tapi itu tip yang bagus, terima kasih!
Martin T.
2
Jika Anda ingin mengedit file host Anda (/ etc / hosts di Unix), Anda dapat memiliki nama yang bermakna sebanyak yang Anda inginkan untuk localhost.
Silas S. Brown
20

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.

ZZ Coder
sumber
9
Ini bukan daerah abu-abu lagi. RFC 6265 , yang merupakan standar cookie saat ini, menghilangkan kebingungan tentang hal itu dengan hanya menghilangkan kemampuan untuk memisahkan cookie pada host yang sama menggunakan port yang berbeda.
Remy Lebeau
18

Cara alternatif untuk mengatasi masalah ini, adalah menjadikan nama cookie sesi terkait dengan port. Sebagai contoh:

  • mysession8080 untuk server yang berjalan di port 8080
  • mysession8000 untuk server yang berjalan di port 8000

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.

Manolis M. Tsangaris
sumber
9

Di IE 8, cookie (hanya diverifikasi terhadap localhost) dibagikan antar port. Dalam FF 10, mereka tidak.

Saya telah memposting jawaban ini sehingga pembaca akan memiliki setidaknya satu opsi konkret untuk menguji setiap skenario.

Jeb
sumber
4

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 :)

Andrea Grandi
sumber
4
Anda mungkin dapat menggunakan 127.0.0.1:8000untuk satu, localhost:8000untuk yang kedua, dan mungkin ::1:8000(mungkin [::1]:8080) untuk yang ketiga tanpa harus menyentuh file host.
Travis Watson
1
Anda dapat memasukkannya ke dalam satu baris:::1 app1 app2 app3 app4 app5 appN
aeroson