Misalkan jam buka hari ini di situs perpustakaan sudah diubah, tetapi peramban masih menampilkan jam lama. Ada beberapa kemungkinan: isi di server asal belum berubah, peramban menggunakan salinan yang tersimpan, atau cache perantara menyerahkan salinan lama. Menekan tombol muat ulang berkali-kali saja belum cukup untuk membedakan penyebabnya.
Cache HTTP menyimpan respons dan menggunakannya kembali jika syarat tertentu terpenuhi. Artikel ini menghubungkan Cache-Control, ETag, dan 304 melalui contoh jam buka yang tersedia untuk umum. Alur pesan disederhanakan dan angkanya bersifat fiktif, bukan hasil pengukuran layanan nyata. Tujuannya adalah menjelaskan syarat penggunaan ulang yang diizinkan, sehingga penyelidikan tidak selalu berakhir pada penghapusan semua cache.
1. Pisahkan penyimpanan, validasi, dan pembagian salinan
Ketika membaca kebijakan cache, ajukan tiga pertanyaan: bolehkah respons disimpan, bolehkah respons yang tersimpan langsung digunakan kembali, dan bolehkah respons dibagikan kepada pengguna lain? Izin menyimpan tidak berarti izin untuk selalu menggunakan ulang, dan pemeriksaan pembaruan tidak dengan sendirinya memberikan izin berbagi. RFC 9111 membedakan peran direktif tersebut. Pembahasan berikut memakai direktif respons tanpa argumen nama bidang.
| Pertanyaan | Direktif respons | Perbedaan yang harus diingat |
|---|---|---|
| Bolehkah respons disimpan untuk digunakan kembali nanti? | no-store | Melarang penyimpanan untuk penggunaan ulang berikutnya. |
| Bolehkah salinan tersimpan digunakan tanpa pemeriksaan? | no-cache | Penyimpanan boleh dilakukan, tetapi penggunaan ulang memerlukan validasi yang berhasil. |
| Bolehkah salinan disimpan dalam cache bersama? | private | Melarang penyimpanan di cache bersama, tetapi tidak melarang penyimpanan di cache privat. |
Untuk jam buka publik yang sering berubah pada URL yang sama, pemeriksaan sebelum penggunaan ulang dapat menjadi pilihan yang sesuai. Halaman yang memuat informasi pribadi pengguna memiliki persoalan berbagi yang berbeda. private bukan mekanisme masuk akun atau pemeriksaan hak akses. Mencampuradukkan tujuan tersebut dapat membuat respons sampai kepada penerima yang salah.
Saat menyusun tabel kebijakan, catat juga alasannya: apakah jam buka harus selalu diperiksa, apakah logo tetap sama, dan apakah URL yang sama memberikan isi berbeda kepada setiap pengguna? Ini adalah titik awal pengelompokan, bukan konfigurasi lengkap yang cocok untuk semua situs. Bedakan pula penyimpanan dalam peramban dari penyimpanan di CDN atau cache bersama lainnya.
2. no-cache dan no-store tidak bisa dibedakan dari namanya saja
Nama no-cache mudah disalahartikan sebagai larangan menyimpan. Namun, no-cache pada respons mengizinkan penyimpanan dan mewajibkan validasi sebelum salinan digunakan kembali. Jika server menyatakan bahwa isinya belum berubah, isi respons yang sudah disimpan dapat digunakan. Sebaliknya, no-store meminta agar respons ini tidak disimpan untuk digunakan kembali. Apa yang disimpan dan apa yang harus diperiksa pada permintaan berikutnya adalah dua hal berbeda, sehingga perilaku kedua pengaturan ini tidak boleh dianggap sama.
Status fresh berarti kebijakan mengizinkan penggunaan ulang tanpa validasi tambahan. Status ini bukan jaminan bahwa isi server asal belum berubah. Dengan max-age, salinan yang masih dalam masa berlakunya dapat terus disajikan meskipun isi di server asal sudah diperbarui. Tentukan dulu keterlambatan pembaruan yang dapat diterima, lalu pilih header; jangan menganggap masa berlaku yang panjang sebagai jawaban untuk semua halaman.
Seperti dijelaskan dalam panduan cache MDN, menambahkan no-store pada respons baru tidak otomatis menghapus respons lama untuk URL yang sama. Jika salinan lama masih fresh, permintaan bahkan mungkin tidak mencapai respons baru beserta header barunya. no-store bukan perintah pembersihan cache dan bukan solusi privasi yang lengkap. Periksa juga masa berlaku lama dan cara memperbarui cache yang Anda kelola.
3. Ikuti ETag dan 304 saat mengunjungi ulang
Anggap URL fiktif /hours.json menyatakan bahwa perpustakaan tutup pukul 18.00. Contoh HTTP/1.1 berikut dipersingkat dan tidak mencantumkan semua header yang mungkin diperlukan. hours-v1 adalah pengenal representasi yang ditentukan server, bukan rumus waktu atau hash berkas nyata.
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache
ETag: "hours-v1"
{"closes":"18:00"}
Setelah menyimpan respons tersebut, peramban dapat mengirim ETag melalui If-None-Match saat melakukan validasi ulang. Jika pengenal itu cocok dengan representasi yang kini dipilih server dan tidak ada perubahan, server dapat membalas 304. Blok berikut menampilkan permintaan lalu respons secara ringkas. Tidak ada JSON baru yang dikirim sesudah respons 304.
GET /hours.json HTTP/1.1
Host: library.example
If-None-Match: "hours-v1"
HTTP/1.1 304 Not Modified
Cache-Control: no-cache
ETag: "hours-v1"
Menurut penjelasan ETag dari MDN, klien kemudian dapat menggunakan isi respons yang sudah tersimpan. Respons 304 tidak membawa isi, tetapi permintaan dan validasi tetap melibatkan komunikasi jaringan. Jika jam tutup berubah menjadi 19.00 dan representasinya berubah, respons yang diharapkan adalah 200 dengan isi serta tag baru. no-cache tidak berarti setiap respons akan selalu 304 atau basis data tidak akan pernah ditanyakan.
Karena itu, periksa hubungan antara isi dan tag, bukan hanya kode status. Jika isi berubah tetapi tag lama dipertahankan, validasi dapat menghasilkan keputusan yang keliru. Jika isi tetap sama tetapi tag terus berubah, pengiriman ulang isi dapat meningkat. Telusuri cara server menghasilkan representasi dan pengenalnya; keberadaan ETag saja belum membuktikan penerapannya benar.
4. Bedakan dokumen yang berubah dengan aset bernama baru
Dokumen jam buka yang diperbarui pada URL yang sama berbeda dari logo atau skrip yang mendapat nama berkas baru saat diperbarui. Jika logo.a1.png diganti dengan logo.b2.png, dokumen baru harus menunjuk URL baru itu. Menimpa isi lama walaupun nama berkas memakai pengenal merusak kesepakatan antara alamat dan isinya.
Mengunggah berkas baru tidak otomatis membuat peramban memintanya. Jika HTML lama masih menunjuk logo lama, penggunaan ulang aset lama dapat tetap berlangsung. Oleh sebab itu, periksa pembaruan dokumen serta header aset sekaligus. Waktu tunda yang dapat diterima untuk masing-masing jenis isi tidak selalu sama, sehingga masa berlakunya pun tidak harus seragam.
Dalam proses penerapan versi, dokumen lama dan baru dapat hadir bersamaan. Dokumen baru bisa gagal jika dipublikasikan sebelum asetnya tersedia, dan dokumen lama bisa rusak jika aset lama terlalu cepat dihapus. Pastikan aset baru sudah ada dan aset lama masih dapat diakses. Pola penamaan berkas tidak dengan sendirinya menyelesaikan masalah penerapan versi atau pemulihan ke versi sebelumnya.
5. Gunakan panel Network untuk menguji dugaan
Mula-mula amati kondisi dasar dengan cache diizinkan. Catat URL lengkap beserta parameter kueri, versi jam buka yang terlihat, kode status, If-None-Match pada permintaan, serta Cache-Control dan ETag pada respons. Header permintaan dan respons menyatakan kondisi dari pihak yang berbeda; walaupun namanya sama, catat pada sisi mana header itu muncul. Dokumentasi panel Network Chrome menjelaskan cara memeriksanya di tab Headers.
| Kondisi pengujian | Yang perlu dicatat | Kesimpulan yang harus dihindari |
|---|---|---|
| Mengunjungi ulang jam buka yang belum diubah | Permintaan bersyarat, kode status, dan jam yang ditampilkan | Menganggap 304 berarti tidak ada komunikasi jaringan. |
| Mengubah jam buka di server asal | Isi baru, tag, dan URL yang benar-benar diminta | Menganggap penyimpanan berhasil berarti semua pengguna sudah menerima pembaruan. |
| Menonaktifkan cache peramban | Perbedaan antara unduhan pertama dan kunjungan ulang biasa | Menganggap hasilnya mewakili kecepatan kunjungan ulang normal. |
| Kembali ke halaman sebelumnya | Ada tidaknya permintaan baru dan layar yang dipulihkan | Menganggap layar yang terlihat membuktikan validasi HTTP telah dilakukan. |
Pengujian dengan cache dinonaktifkan adalah kondisi tersendiri. Opsi Disable cache di Chrome bekerja selama DevTools terbuka, jadi catat apakah alat itu terbuka dan opsinya aktif. Pengujian unduhan pertama tidak sama dengan pengujian penggunaan ulang normal. Jika opsi tersebut terlupakan, unduhan baru yang terjadi terus-menerus dapat disalahartikan sebagai kerusakan cache. Simpan catatan agar hasilnya dapat dibandingkan setelah cache diaktifkan kembali.
Ubah satu hal pada satu waktu. Amati kunjungan ulang tanpa perubahan terlebih dahulu, lalu ubah satu bidang jam buka. Jika URL, pengaturan server, dan nama berkas sekaligus diubah, penyebab hasilnya sulit dipisahkan. Ketika 200 atau 304 tidak sesuai dugaan, baca pertukaran yang benar-benar terjadi sebelum menambah pengaturan baru.
6. Periksa tempat penyimpanan lain dan kriteria selesai
Menonaktifkan cache HTTP peramban tidak berarti cache CDN atau penyimpanan aplikasi lain ikut dinonaktifkan. Service worker, pemilihan salinan oleh perantara, dan data yang dipertahankan aplikasi perlu ditelusuri secara terpisah. Walaupun URL-nya sama, salinannya tidak selalu berasal dari lapisan yang sama.
Tindakan kembali ke halaman sebelumnya juga harus dipisahkan dari permintaan HTTP baru. Layar sesi sebelumnya dapat dipulihkan tanpa validasi ulang yang Anda harapkan, bahkan ketika no-cache digunakan. Hal itu belum menjadi bukti bahwa server mengabaikan header. Catat permintaan yang benar-benar muncul pada navigasi baru, muat ulang, dan tindakan kembali.
Keberhasilan tidak cukup dinilai dari rasio cache hit. Pastikan isi yang belum berubah digunakan ulang dengan benar, perubahan tiba dalam waktu yang diizinkan, dan salinan dibagikan kepada penerima yang tepat. Catat waktu perubahan, waktu pengamatan, kondisi pengujian, dan isi aktual agar masalah dapat direproduksi. Jika situs lebih cepat tetapi jam buka yang salah bertahan terlalu lama, kebutuhan layanan belum terpenuhi.
Untuk penerapan nyata, tentukan kebijakan per respons beserta alur pembaruan dan pemulihan versinya. Jangan menyalin kebijakan isi publik begitu saja ke respons pribadi, dan jangan menyamakan validasi cache dengan pemberian hak akses. Header menetapkan aturan penyimpanan dan penggunaan ulang. Menjelaskan apa yang disimpan, apa yang divalidasi, dan salinan mana yang tampil sekarang akan membuat diagnosis lebih terarah.