Apakah setiap permintaan web mengirim cookie browser?

198

Apakah setiap permintaan web mengirim cookie browser?

Saya tidak berbicara tampilan halaman, tetapi permintaan untuk gambar, .jsfile, dll.

Pembaruan Jika halaman web memiliki 50 elemen, itu adalah 50 permintaan. Mengapa ia mengirim cookie SAMA untuk setiap permintaan, bukankah itu cache atau tahu itu sudah memilikinya?

mrblah
sumber
8
Saya tidak berpikir caching mungkin terjadi dalam situasi ini - kita berbicara tentang browser mengirim data ke server, bukan sebaliknya. Anda tidak dapat mengatakan dengan pasti bahwa server "sudah memilikinya" setelah pengguna mengirim satu permintaan, karena banyak alasan. Mungkin ada sejumlah besar server yang tidak saling berbicara; server mungkin tidak ingin (atau memiliki ruang) untuk mengingat apa pun tentang permintaan sebelumnya - HTTP seharusnya bersifat stateless; setiap permintaan harus independen dari yang lainnya. Untuk alasan ini, cookie, seperti kredensial otentikasi, harus dikirim dengan setiap permintaan.
Ian Clelland
Saya menyebutkan mengapa caching tidak masuk akal untuk cookie dalam pembaruan untuk jawaban saya: stackoverflow.com/a/1336178/102960
igorsantos07

Jawaban:

198

Ya, selama URL yang diminta berada dalam domain dan jalur yang sama dengan yang didefinisikan dalam cookie (dan semua pembatasan lainnya - aman, httponly, tidak kedaluwarsa, dll) tahan, maka cookie akan dikirim untuk setiap permintaan.

Ian Clelland
sumber
103
Secara kebetulan, inilah sebabnya alat kecepatan halaman seperti Google Page Speed ​​atau YSlow Yahoo merekomendasikan penyajian konten statis dari domain terpisah dan bebas cookie.
ceejayoz
Saya menyebutkan tentang menyajikan konten dari domain terpisah dalam jawaban saya yang diperbarui: stackoverflow.com/a/1336178/102960
igorsantos07
Benarkah browser mengirim Cookie Site2 ketika ada Pengalihan HTTP dari Site1 ke Site2?
Zeigeist
92

Seperti yang orang lain katakan, jika tuan rumah cookie, jalan, dll pembatasan dipenuhi, itu akan dikirim, 50 kali.

Tetapi Anda juga bertanya mengapa: karena cookie adalah fitur HTTP, dan HTTP tidak memiliki kewarganegaraan. HTTP dirancang untuk bekerja tanpa server menyimpan keadaan apa pun di antara permintaan.

Bahkan, server tidak memiliki cara yang solid untuk mengenali pengguna mana yang mengirim permintaan yang diberikan; mungkin ada seribu pengguna di belakang satu proxy web (dan dengan demikian alamat IP). Jika cookie tidak dikirim setiap permintaan, server tidak akan memiliki cara untuk mengetahui pengguna mana yang meminta sumber daya apa pun.

Akhirnya, peramban tidak memiliki petunjuk apakah server memerlukan cookie atau tidak, ia hanya tahu server menginstruksikannya untuk mengirim cookie untuk setiap permintaan ke foo.com, jadi ia melakukannya. Terkadang gambar membutuhkannya (misalnya, per pengguna yang dihasilkan secara dinamis), kadang tidak, tetapi peramban tidak tahu.

derobert
sumber
1
Apakah ini benar dengan HTTP 1.1, yang merupakan skema multiplexing? Yaitu, permintaan dibundel ke dalam koneksi TCP tunggal. Tentu saja setiap permintaan diterima dengan salinan cookie yang dilampirkan. Tetapi jika kekhawatirannya adalah banyak duplikasi transmisi, HTTP 1.1 berada dalam posisi untuk mengoptimalkan. Meskipun saya tidak tahu apakah itu benar-benar ...
Chris Noe
1
Kemudian masalah menjadi "permintaan mana yang ingin dilampirkan oleh browser pada cookie?" Server menetapkan kebijakan dengan cookie, untuk memutuskan domain mana, dan jalur URL mana, cookie harus dikirim kembali ke, tetapi kemudian melupakannya. Anda perlu cara untuk menentukan bahwa permintaan tertentu dalam koneksi memiliki cookie, dan yang lainnya tidak. Yang pasti tidak ada di HTTP / 1.1, kecuali dengan secara eksplisit memasukkan mereka dalam setiap permintaan. Jujur, solusi yang lebih baik (kompatibel dengan standar) untuk mengurangi bandwidth akan menjadi pengkodean konten gzip sisi klien, tetapi belum ada yang mendukung itu.
Ian Clelland
1
@Ian Clelland: Klien harus mengirim pesan pertama, jadi tidak tahu apa yang akan dikirim server untuk Accept-Encoding (adalah server yang mengirim bidang itu, HTTP / 1.1 §14.3 mengatakan header permintaannya). Dan masalahnya adalah ia dapat bervariasi berdasarkan URL bahkan pada server yang sama, dan dapat berubah seiring waktu, sehingga membuatnya berfungsi menjadi non-sepele.
derobert
1
@ Chris: Tidak, keepalive hanya menyimpan pengaturan koneksi TCP / teardown overhead, itu saja. Header lengkap masih dikirim untuk setiap permintaan. Namun, pipelining (mengirim beberapa permintaan tanpa menunggu respons) dapat sangat membantu. HTTP / 1.1 §8.1 memberikan detail.
derobert
21

Iya. Setiap permintaan mengirim cookie milik domain yang sama. Mereka tidak di-cache karena HTTP adalah stateless, apa artinya setiap permintaan harus cukup bagi server untuk mencari tahu apa yang harus dilakukan dengannya. Katakanlah Anda memiliki gambar yang hanya dapat diakses oleh pengguna tertentu; Anda harus mengirim cookie autentik Anda dengan setiap 50 permintaan itu, sehingga server tahu itu Anda dan bukan orang lain, atau tamu, di antara kumpulan permintaan yang diperolehnya.

Karena itu, cookie mungkin tidak dikirim mengingat batasan lain yang disebutkan dalam respons lain, seperti pengaturan HTTPS, jalur, atau domain. Terutama di sana, hal penting yang perlu diperhatikan: cookie tidak dibagikan di antara domain. Itu membantu mengurangi ukuran panggilan HTTP untuk file statis, seperti gambar dan skrip yang Anda sebutkan.
Contoh: Anda memiliki 4 cookie di www.stackoverflow.com; jika Anda meminta www.stackoverflow.com/images/logo.png, 4 cookie tersebut akan dikirim.
Namun, jika Anda meminta stackoverflow.com/images/logo.png(perhatikan perubahan subdomain) atau images.stackoverflow.com/logo.png, keempat cookie itu tidak akan ada - tetapi mungkin yang terkait dengan domain ini akan melakukannya.

Anda dapat membaca lebih lanjut tentang cookie dan gambar yang meminta, misalnya, di Blog Post StackOverflow ini .

igorsantos07
sumber
10

Tidak. Tidak setiap permintaan mengirim cookie. Itu tergantung pada konfigurasi cookie dan koneksi client-server.

Misalnya, jika secureopsi cookie Anda disetel truemaka harus dikirimkan melalui koneksi HTTPS yang aman. Berarti ketika Anda melihat situs web itu dengan protokol HTTP maka cookie ini tidak akan dikirim oleh browser karena tanda amannya benar.

Iman Sedighi
sumber
7

Cookie memiliki properti "jalur". Jika "path = /", jawabannya adalah Ya.

neoedmund
sumber
Ya, Anda dapat mengabadikan struktur situs / aplikasi Anda sehingga semua URL yang membutuhkan cookie ada /app/atau sejenisnya - itu akan mempertahankan portabilitas tanpa perlu subdomain terpisah untuk menghilangkan overhead yang berlebihan. Atau Anda bisa meninggalkan Google Analytics yang sekarang tidak berguna sebagai permulaan. Saya telah melihat header cookie begitu lama sehingga saya bertanya-tanya apakah nenek saya merajutnya.
Jake
7

3 tahun telah berlalu

Ada alasan lain mengapa browser tidak mengirim cookie. Anda dapat menambahkan crossOriginatribut ke <script>tag Anda , dan nilainya ke "anonymous". Ini akan mencegah cookie untuk dikirim ke server tujuan. 99,9% dari waktu, javascripts Anda adalah file statis, dan Anda tidak menghasilkan kode js berdasarkan cookie permintaan. Jika Anda memiliki 1KB cookie, dan Anda memiliki 200 sumber daya di halaman Anda, maka pengguna Anda mengunggah 200KB, dan itu mungkin membutuhkan waktu pada 3G dan tidak memiliki efek pada halaman hasil. Kunjungi atribut HTML: crossorigin untuk referensi.

gilm
sumber
Tolong jelaskan.
Jake
4
@Jake Anda bisa menambahkan atribut crossOrigin ke tag <script> Anda, dan nilainya menjadi "anonim". Ini akan mencegah cookie untuk dikirim ke server tujuan. 99,9% dari waktu, javascripts Anda adalah file statis, dan Anda tidak menghasilkan kode js berdasarkan cookie permintaan. Jika Anda memiliki 1KB cookie, dan Anda memiliki 200 sumber daya di halaman Anda, maka pengguna Anda mengunggah 200KB, dan itu mungkin membutuhkan waktu pada 3G dan tidak memiliki efek pada halaman hasil. Kunjungi developer.mozilla.org/en-US/docs/Web/HTML/… untuk referensi.
gilm
4

Saya tahu ini adalah utas lama. Tapi saya baru saja memperhatikan bahwa sebagian besar browser tidak akan mengirim cookie untuk domain jika Anda menambahkan trailing dot. Misalnya, http://example.com.tidak akan menerima cookie yang ditetapkan untuk .example.com. Apache di sisi lain memperlakukan mereka sebagai tuan rumah yang sama. Saya menemukan ini berguna untuk membuat pelacakan lintas domain lebih sulit untuk sumber daya eksternal yang saya sertakan, tetapi Anda juga bisa menggunakannya untuk alasan kinerja. Perhatikan validasi rem dari httpssertifikat ini. Saya telah menjalankan beberapa tes menggunakan browser dan perangkat saya sendiri. Peretasan bekerja pada hampir semua browser kecuali untuk safari (seluler dan desktop), yang akan memasukkan cookie dalam permintaan.

Gellweiler
sumber
Bagaimana cara "membuat pelacakan lintas domain lebih sulit untuk sumber daya eksternal yang saya sertakan"? Apakah Anda berbicara tentang Farcebook Like dan widget semacam itu - yang kami ketahui melacak penelusuran pengguna yang masih log-in?
Jake
Iya. Ini akan membuatnya lebih sulit, karena sebagian besar browser tidak akan mengirim cookie. Jadi, jika Anda memasukkan sesuatu dari google.com misalnya dan Anda masuk ke google, google tidak dapat menautkan dua permintaan. Ini tidak dijamin sulit, beberapa browser tetap mengirim cookie dan ada metode yang kurang andal dan kurang digunakan untuk mengidentifikasi pengguna (seperti Alamat-IP) yang masih akan berfungsi. Kerugian terbesar adalah, bahwa Anda tidak dapat menggunakan HTTPS, yang membuatnya tidak berguna saat ini.
Gellweiler
0

Jawaban singkatnya adalah Ya. Baris di bawah ini dari dokumentasi JS

Cookie pernah digunakan untuk penyimpanan sisi klien umum. Meskipun ini sah ketika mereka satu-satunya cara untuk menyimpan data pada klien, sekarang disarankan untuk menggunakan API penyimpanan modern. Cookie dikirimkan dengan setiap permintaan, sehingga mereka dapat memperburuk kinerja (terutama untuk koneksi data seluler).

Yashwin Munsadwala
sumber