Mengapa no-cache dan no-store harus digunakan dalam respons HTTP?

120

Saya diberitahu untuk mencegah bocornya info pengguna, hanya "tanpa cache" sebagai tanggapan tidak cukup. "tidak ada toko" juga diperlukan.

Cache-Control: no-cache, no-store

Setelah membaca spesifikasi ini http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html , saya masih belum yakin mengapa.

Pemahaman saya saat ini adalah bahwa ini hanya untuk server cache perantara. Meskipun "tanpa cache" sebagai respons, server cache perantara masih dapat menyimpan konten ke penyimpanan non-volatile. Server cache perantara akan memutuskan apakah menggunakan konten yang disimpan untuk permintaan berikut. Namun, jika "no-store" adalah responsnya, server cache perantara tidak seharusnya menyimpan konten. Jadi, ini lebih aman.

Apakah ada alasan lain mengapa kita membutuhkan "no-cache" dan "no-store"?

Morgan Cheng
sumber
3
no-cachetidak berarti apa yang Anda pikirkan. Sebenarnya, itu berarti "mohon validasi ulang".
Erwan Legrand

Jawaban:

77

Saya harus menjelaskan itu no-cachetidak berarti tidak menyimpan . Faktanya, ini berarti "validasi ulang dengan server" sebelum menggunakan respons cache apa pun yang mungkin Anda miliki, pada setiap permintaan.

must-revalidate, di sisi lain, hanya perlu melakukan validasi ulang jika resource dianggap sudah usang.

Jika server mengatakan bahwa sumber daya masih valid maka cache dapat merespons dengan representasinya, sehingga mengurangi kebutuhan server untuk mengirim ulang seluruh sumber daya.

no-storesecara efektif penuh tidak direktif cache dan dimaksudkan untuk mencegah penyimpanan representasi dalam bentuk cache apa pun.

Saya mengatakan apa pun, tetapi perhatikan ini di spesifikasi HTTP RFC 2616:

Buffer riwayat MUNGKIN menyimpan respons seperti itu sebagai bagian dari operasi normalnya

Tetapi ini dihilangkan dari spesifikasi HTTP RFC 7234 yang lebih baru dalam upaya untuk membuatnya no-storelebih kuat, lihat:

http://tools.ietf.org/html/rfc7234#section-5.2.1.5

Luke Puplett
sumber
18
Masih tidak menjawab pertanyaan: mengapa kedua no-cache dan tidak ada toko harus digunakan dalam respon HTTP? Apakah tidak Cache-Control: no-storecukup?
Franklin Yu
Apakah ada perbedaan antar browser? Karena artikel dari Microsoft docs.microsoft.com/en-us/iis/configuration/system.webServer/… ini bahkan tidak menyebutkan no-storedan menjelaskan no-cacheseolah-olah tidak ada cache sama sekali .... Saya bingung!
Roel
Jawaban Alconja adalah jawaban atas pertanyaan tersebut secara khusus. Ketika saya menjawab, saya melakukannya hanya untuk memperjelas konsepsi yang sangat umum. Silakan pilih jawaban lainnya!
Luke Puplett
48

Dalam keadaan tertentu, IE6 akan tetap menyimpan file meskipun Cache-Control: no-cacheberada di header respons.

The W3C menyatakan darino-cache :

Jika perintah no-cache tidak menetapkan nama-kolom, cache TIDAK HARUS menggunakan respons untuk memenuhi permintaan berikutnya tanpa validasi ulang yang berhasil dengan server asal.

Dalam aplikasi saya, jika Anda mengunjungi halaman dengan no-cacheheader, kemudian keluar dan kemudian menekan kembali di browser Anda, IE6 masih akan mengambil halaman dari cache (tanpa permintaan baru / validasi ke server). Menambahkan no-storeheader akan menghentikannya. Tetapi jika Anda menerima kata-kata W3C, sebenarnya tidak ada cara untuk mengontrol perilaku ini:

Buffer riwayat MUNGKIN menyimpan respons seperti itu sebagai bagian dari operasi normalnya.

Perbedaan umum antara riwayat browser dan cache HTTP normal dijelaskan dalam sub-bagian spesifik spesifikasi .

Alconja
sumber
7
ketika Anda menekan kembali di browser Anda, IE6 tidak mengambil halaman dari cache. Itu mengambil halaman dari buffer riwayat.
Pacerier
1
Di Chrome 34 (2014), itu masih perlu diatur no-storejuga. Jika tidak, Chrome akan menampilkan data yang di-cache / di-buffer ketika menggunakan tombol kembali.
gak
4
-1 karena kalimat pertama salah menyiratkan bahwa tidak benar bagi browser untuk menyimpan respons yang memiliki no-cacheheader. Kutipan W3C di bawah ini menjelaskan bahwa bukan ini masalahnya; sebaliknya, no-cachetajuk hanya berarti bahwa respons harus divalidasi ulang sebelum digunakan kembali untuk melayani permintaan berikutnya.
Mark Amery
1
Kata-kata spesifikasi telah ditingkatkan dari RFC1616, ke versi spesifikasi saat ini ( kelompok RFC tools.ietf.org/html/rfc7230 ). keluarga karena 6 RFC. Mereka usang 2616.
Arcin B
16

Dari spesifikasi HTTP 1.1 :

tidak ada toko :

Tujuan dari tidak adanya tokoarahannya adalah untuk mencegah pelepasan atau penyimpanan informasi sensitif secara tidak sengaja (misalnya, pada kaset cadangan). Perintah no-store berlaku untuk seluruh pesan, dan DAPAT dikirim baik sebagai tanggapan atau permintaan. Jika dikirim dalam permintaan, cache TIDAK HARUS menyimpan bagian mana pun dari permintaan ini atau respons apa pun terhadapnya. Jika dikirim sebagai tanggapan, cache TIDAK HARUS menyimpan bagian mana pun dari tanggapan ini atau permintaan yang memicunya. Petunjuk ini berlaku untuk cache yang tidak dibagikan dan bersama. "HARUS TIDAK disimpan" dalam konteks ini berarti bahwa cache TIDAK HARUS dengan sengaja menyimpan informasi dalam penyimpanan non-volatile, dan HARUS melakukan upaya terbaik untuk menghapus informasi dari penyimpanan volatile secepat mungkin setelah meneruskannya. Meskipun arahan ini dikaitkan dengan respons, pengguna mungkin secara eksplisit menyimpan respons seperti itu di luar sistem cache (mis., dengan dialog "Simpan Sebagai"). Buffer riwayat MUNGKIN menyimpan respons seperti itu sebagai bagian dari operasi normalnya. Tujuan dari arahan ini adalah untuk memenuhi persyaratan pengguna dan pembuat layanan tertentu yang prihatin tentang rilis informasi yang tidak disengaja melalui akses tak terduga ke struktur data cache. Meskipun penggunaan petunjuk ini mungkin meningkatkan privasi dalam beberapa kasus, kami mengingatkan bahwa ini BUKAN merupakan mekanisme yang andal atau memadai untuk memastikan privasi. Secara khusus, cache yang berbahaya atau disusupi mungkin tidak mengenali atau mematuhi arahan ini, dan jaringan komunikasi mungkin rentan terhadap penyadapan. Buffer riwayat MUNGKIN menyimpan respons seperti itu sebagai bagian dari operasi normalnya. Tujuan dari arahan ini adalah untuk memenuhi persyaratan pengguna dan pembuat layanan tertentu yang prihatin tentang rilis informasi yang tidak disengaja melalui akses tak terduga ke struktur data cache. Meskipun penggunaan petunjuk ini mungkin meningkatkan privasi dalam beberapa kasus, kami mengingatkan bahwa ini BUKAN merupakan mekanisme yang andal atau memadai untuk memastikan privasi. Secara khusus, cache yang berbahaya atau disusupi mungkin tidak mengenali atau mematuhi arahan ini, dan jaringan komunikasi mungkin rentan terhadap penyadapan. Buffer riwayat MUNGKIN menyimpan respons seperti itu sebagai bagian dari operasi normalnya. Tujuan dari arahan ini adalah untuk memenuhi persyaratan pengguna dan pembuat layanan tertentu yang prihatin tentang rilis informasi yang tidak disengaja melalui akses tak terduga ke struktur data cache. Meskipun penggunaan petunjuk ini mungkin meningkatkan privasi dalam beberapa kasus, kami mengingatkan bahwa ini BUKAN merupakan mekanisme yang andal atau memadai untuk memastikan privasi. Secara khusus, cache yang berbahaya atau disusupi mungkin tidak mengenali atau mematuhi arahan ini, dan jaringan komunikasi mungkin rentan terhadap penyadapan. Meskipun penggunaan petunjuk ini mungkin meningkatkan privasi dalam beberapa kasus, kami mengingatkan bahwa ini BUKAN merupakan mekanisme yang andal atau memadai untuk memastikan privasi. Secara khusus, cache yang berbahaya atau disusupi mungkin tidak mengenali atau mematuhi arahan ini, dan jaringan komunikasi mungkin rentan terhadap penyadapan. Meskipun penggunaan petunjuk ini mungkin meningkatkan privasi dalam beberapa kasus, kami mengingatkan bahwa ini BUKAN merupakan mekanisme yang andal atau memadai untuk memastikan privasi. Secara khusus, cache yang berbahaya atau disusupi mungkin tidak mengenali atau mematuhi arahan ini, dan jaringan komunikasi mungkin rentan terhadap penyadapan.

garis miring terbalik17
sumber
1
Jika Anda sudah tidak menyimpan permintaan dalam cache, bukankah itu sudah mencegah penyimpanan respons di media non-volatile?
Lèse majesté
4
@ Lèsemajesté Paling sering tidak. no-cachedan max-age=0mengatakan item tersebut dianggap basi. Artinya, harus divalidasi ulang sebelum disajikan. Artinya, cache dapat menyimpan file dan kemudian melakukan permintaan bersyarat yang dapat dibalas oleh server 304 NOT MODIFIED. Ini jelas merupakan keuntungan besar karena isi respons tidak perlu dibuat dan dikirim. Jadi untuk memanfaatkan banyak (sebagian besar?) Cache ini akan menyimpan no-cacherespons.
Kevin Cox
14

Jika Anda ingin mencegah semua caching (mis. Memaksa memuat ulang saat menggunakan tombol kembali) Anda perlu:

  • tanpa-cache untuk IE

  • tidak ada toko untuk Firefox

Ada informasi saya tentang ini di sini:

http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/

HttpWatchSupport
sumber
6
Mengapa tidak ada penyimpanan cukup untuk Internet Explorer? Entri blog Anda tidak menjelaskan.
Simon Lieschke
1
Versi IE mana yang Anda bicarakan?
Pacerier
1
@Pacerier, Mungkin versi IE apa pun yang terbaru pada saat dia menulis komentar. Menurut Wikipedia, ini adalah IE7. Untuk FF sepertinya 3. Tidak banyak orang yang masih menggunakannya.
trisis
11

no-storeseharusnya tidak diperlukan dalam situasi normal, dan dapat merusak kecepatan dan kegunaan. Ini ditujukan untuk penggunaan di mana respons HTTP berisi informasi yang sangat sensitif sehingga tidak boleh ditulis ke cache disk sama sekali, terlepas dari efek negatif yang ditimbulkan bagi pengguna.

Bagaimana itu bekerja:

  • Biasanya, meskipun agen pengguna seperti browser menentukan bahwa respons tidak boleh disimpan dalam cache, ia mungkin masih menyimpannya ke cache disk karena alasan internal agen pengguna. Versi ini dapat digunakan untuk fitur seperti "lihat sumber", "kembali", "info halaman", dan seterusnya, di mana pengguna tidak perlu meminta halaman lagi, tetapi browser tidak menganggapnya sebagai tampilan halaman baru dan akan masuk akal untuk menyajikan versi yang sama dengan yang sedang dilihat pengguna.

  • Menggunakan no-storeakan mencegah respons tersebut disimpan, tetapi ini dapat memengaruhi kemampuan browser untuk memberikan "sumber tampilan", "kembali", "info halaman", dan seterusnya tanpa membuat permintaan baru yang terpisah untuk server, yang tidak diinginkan. Dengan kata lain, pengguna dapat mencoba melihat sumber dan jika browser tidak menyimpannya dalam memori, mereka akan diberitahu bahwa ini tidak mungkin, atau itu akan menyebabkan permintaan baru ke server. Oleh karena itu, no-storesebaiknya hanya digunakan ketika pengalaman pengguna yang terhambat dari fitur-fitur ini tidak berfungsi dengan baik atau cepat dibandingkan dengan pentingnya memastikan konten tidak disimpan dalam cache.

Pemahaman saya saat ini adalah bahwa ini hanya untuk server cache perantara. Meskipun "tanpa cache" sebagai respons, server cache perantara masih dapat menyimpan konten ke penyimpanan non-volatile.

Ini salah Server cache perantara yang kompatibel dengan HTTP 1.1 akan mematuhi instruksi no-cachedan must-revalidate, memastikan bahwa konten tidak di-cache. Menggunakan petunjuk ini akan memastikan bahwa respons tidak di-cache oleh cache perantara mana pun, dan bahwa semua permintaan berikutnya dikirim kembali ke server asal.

Jika server cache perantara tidak mendukung HTTP 1.1, maka Anda perlu menggunakan Pragma: no-cachedan berharap yang terbaik. Perhatikan bahwa jika tidak mendukung HTTP 1.1 maka no-storeitu tidak relevan.

thomasrutter
sumber
3
Apakah saya salah paham karena mnot.net/cache_docs/#CACHE-CONTROL bertentangan dengan Anda. Ia mengatakan bahwa no-cachemempertahankan kesegaran yang kaku tanpa mengorbankan semua manfaat caching, yang berarti cache disimpan dan digunakan lagi jika server merespons dengan 304 Not Modified.
Pacerier
-1: tanpa-cache tidak berarti bahwa konten tidak dapat di-cache. Dalam 14.9.1 What Is Cachable spesifikasi mengatakan, "Jika perintah no-cache tidak menentukan nama kolom, maka cache TIDAK HARUS menggunakan respons untuk memenuhi permintaan berikutnya tanpa validasi ulang yang berhasil dengan server asal." ( w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9. ) Seperti yang dijelaskan oleh Chris Shiflett, ini "tidak mencegah sistem cache dari menyimpan salinan yang di-cache. Ini hanya mengharuskan sistem cache memvalidasi ulang cache-nya sebelumnya untuk mengirimkannya kembali ke klien. " (HTTP Developer's Handbook, p 91)
james.garriss
Saya tidak berpikir apa yang saya tulis dalam jawaban ini mengontrak salah satu dari dua komentar itu - Saya hanya tidak berbicara tentang bagaimana browser memvalidasi ulang (misalnya menggunakan If-Modified-Because / If-None-Match) karena saya tidak melihatnya sebagai relevan. Saya bahkan tidak berusaha untuk menutupi untuk apa no-cache itu, jadi saya mengalami kesulitan memahami bagaimana komentar oleh @ james.garriss berhubungan dengan jawaban saya.
thomasrutter
7

Jika sistem caching mengimplementasikan no-store dengan benar, Anda tidak memerlukan no-cache. Tapi tidak semua melakukannya. Selain itu, beberapa browser menerapkan tanpa cache seperti tidak ada penyimpanan. Jadi, meskipun tidak diwajibkan secara ketat, mungkin paling aman untuk menyertakan keduanya.

james.garriss
sumber
Tapi tidak semua melakukannya. “Kami butuh contoh konkret untuk meyakinkan rekan saya.
Franklin Yu
Komentar itu dibuat 6 tahun yang lalu. Anda perlu memeriksa perilaku server cache saat ini untuk melihat apa yang mereka lakukan.
james.garriss
6

Perhatikan bahwa Internet Explorer dari versi 5 hingga 8 akan membuat kesalahan saat mencoba mengunduh file yang disajikan melalui https dan server pengirim Cache-Control: no-cacheatau Pragma: no-cacheheader.

Lihat http://support.microsoft.com/kb/812935/en-us

Penggunaan Cache-Control: no-storedan Pragma: privatetampaknya menjadi hal terdekat yang masih berfungsi.

bassim
sumber
2
Seperti yang disarankan dalam jawaban SO terkait, Anda dapat mengaturnya Cache-Control: no-store, no-cache, must-revalidatedalam urutan yang tepat untuk membuatnya berfungsi. Namun, itu tidak berhasil dalam skenario kami, tetapi apa yang @bassim sarankan di atas berhasil. Terima kasih!
Eirik H
6

Untuk chrome, no-cache digunakan untuk memuat ulang halaman pada kunjungan ulang, tetapi masih menyimpan cache jika Anda kembali ke sejarah (tombol kembali). Untuk memuat ulang halaman untuk sejarah-kembali juga, gunakan no-store. IE perlu melakukan validasi ulang agar berfungsi di semua kesempatan.

Jadi untuk memastikan untuk menghindari semua bug dan salah tafsir yang selalu saya gunakan

Cache-Control: no-store, no-cache, must-revalidate

jika saya ingin memastikannya dimuat ulang.

woens
sumber
2

Awalnya kami menggunakan no-cache beberapa tahun yang lalu dan mengalami beberapa masalah dengan konten basi dengan browser tertentu ... Sayangnya, sayangnya tidak ingat secara spesifik.

Kami sejak itu memutuskan HANYA penggunaan no-store. Tidak pernah melihat ke belakang atau mengalami satu masalah pun dengan konten usang oleh browser atau perantara mana pun sejak saat itu.

Ruang ini tentu saja didominasi oleh realitas implementasi vs apa yang kebetulan telah ditulis di berbagai RFC. Banyak proxy khususnya cenderung berpikir bahwa mereka melakukan pekerjaan yang lebih baik dalam "meningkatkan kinerja" dengan mengganti kebijakan yang seharusnya mereka ikuti dengan kebijakan mereka sendiri.

Einstein
sumber
Saya yakin Firefox-lah yang dulu lebih memilih no-store.
bvdb
-1

OWASP membahas ini:

Apa perbedaan antara perintah cache-control: no-cache, dan no-store?

Direktif no-cache dalam respon menunjukkan bahwa respon tidak boleh digunakan untuk melayani permintaan berikutnya yaitu cache tidak boleh menampilkan respon yang direktif ini disetel di header tetapi harus membiarkan server melayani permintaan tersebut. Direktif no-cache dapat menyertakan beberapa nama field; dalam hal ini respons dapat ditampilkan dari cache kecuali untuk nama bidang yang ditentukan yang harus disajikan dari server. Perintah no-store berlaku untuk seluruh pesan dan menunjukkan bahwa cache tidak boleh menyimpan bagian mana pun dari respons atau permintaan apa pun yang memintanya.

Apakah saya benar-benar aman dengan arahan ini?

Tidak. Tapi secara umum, gunakan Cache-Control: no-cache, no-store dan Pragma: no-cache, selain Expires: 0 (atau tanggal GMT yang cukup mundur seperti epoch UNIX). Jenis konten non-html seperti pdf, dokumen word, spreadsheet excel, dll sering di-cache bahkan ketika arahan kontrol cache di atas disetel (meskipun ini bervariasi menurut versi dan penggunaan tambahan must-revalidate, pre-check = 0, post-check = 0, max-age = 0, dan s-maxage = 0 dalam praktiknya terkadang dapat mengakibatkan setidaknya penghapusan file saat browser ditutup dalam beberapa kasus karena kebiasaan browser dan implementasi HTTP). Selain itu, fitur 'Autocomplete' memungkinkan browser untuk menyimpan cache apa pun yang diketik pengguna di kolom input formulir. Untuk memeriksanya, tag formulir atau tag masukan individu harus menyertakan atribut 'Autocomplete = "Off"'. Namun,

Sumber di sini .

Jan Żankowski
sumber
Ini salah no-cachemengatakan Anda tidak dapat menggunakannya tanpa memvalidasi dengan server. Jika salinan cache Anda masih bagus, server akan membalas dengan 304 dan Anda kemudian menggunakan salinan cache Anda. Menghemat unduhan jaringan yang berpotensi besar untuk Anda. no-storedi sisi lain mengatakan Anda tidak diizinkan untuk menyimpan data sama sekali.
Gargoyle