Bayangkan kamu memesan kopi yang persis sama di kafe yang sama setiap pagi. Sekarang bayangkan setiap hari baristanya tetap ngotot menanyakan nama, pesanan, dan alamat kamu dari nol, padahal tidak ada yang berubah. Lama dan agak konyol, kan. Web punya masalah serupa: sebuah browser sering kali butuh logo yang sama, file gaya yang sama, dan skrip yang sama berulang-ulang. Caching adalah cara web berkata, “Ini sudah saya punya, tidak perlu minta lagi.”
Di artikel ini kita akan menelusuri apa itu caching HTTP, kenapa itu penting, dan sekumpulan kecil header yang mengaturnya. Kamu tidak perlu pengalaman sebelumnya. Di akhir tulisan, kamu akan bisa membaca sebuah respons dan paham apakah ia akan disimpan, untuk berapa lama, dan siapa yang boleh menyimpan salinannya.
Apa sebenarnya arti caching
Cache itu sebenarnya hanya salinan tersimpan dari sesuatu, yang ditaruh di tempat yang lebih dekat atau lebih cepat supaya kamu tidak perlu mengambil aslinya lagi. Di dunia web, ketika browser mengunduh sebuah file (gambar, file CSS, sepotong JSON), ia bisa menyimpan file itu secara lokal. Saat halaman berikutnya meminta file yang sama, browser bisa menyajikannya dari penyimpanannya sendiri tanpa harus jalan-jalan lagi ke seberang internet.
Perjalanan itulah bagian yang mahal. Setiap permintaan harus berangkat dari perangkatmu, mungkin menyeberangi dunia, sampai ke server, lalu responsnya harus menempuh jalan pulang yang sama. Bahkan di koneksi cepat pun itu makan waktu. Kalikan dengan puluhan file yang dibutuhkan satu halaman biasa, dan jelas kenapa melewatkan perjalanan berulang membuat halaman terasa seketika.
Ada dua keuntungan besar dari caching:
- Cepat untuk pengguna. File yang disajikan dari cache lokal muncul nyaris seketika, karena tidak ada yang perlu diunduh.
- Beban server berkurang. Setiap permintaan yang dijawab oleh cache adalah permintaan yang tak perlu ditangani server asal. Itu menghemat bandwidth dan menjaga server tetap longgar untuk pekerjaan yang memang harus ia kerjakan.
Cache vs. database
Cache dan database sama-sama menyimpan data, tapi tugasnya berbeda. Database adalah sumber kebenaran, tempat data asli yang permanen disimpan. Cache adalah salinan sementara yang sifatnya sekali pakai, ditaruh semata-mata untuk mempercepat. Kalau cache dihapus, tidak ada yang hilang; datanya selalu bisa diambil lagi dari sumbernya.
Siapa yang menyimpan salinannya
Saat kita bilang “cache”, biasanya yang dimaksud salah satu dari beberapa tempat di sepanjang jalur antara pengguna dan server. Lebih mudah membayangkannya sebagai sebuah rantai:
[ Browser ] → [ Proxy / CDN ] → [ Server asal ]
privat bersama sumber kebenaran
- Cache browser ada di komputer atau ponselmu sendiri. Sifatnya privat, hanya kamu yang memakainya. Inilah yang membuat halaman yang pernah kamu kunjungi terbuka lebih cepat saat dibuka untuk kedua kalinya.
- Cache bersama duduk di antara banyak pengguna dan server. Sebuah proxy perusahaan atau, yang lebih umum sekarang, sebuah CDN (Content Delivery Network) menyimpan satu salinan lalu menyajikannya ke banyak orang berbeda. Karena dipakai bersama, ia bisa menekan drastis seberapa sering server asal dihubungi.
Respons yang sama bisa disimpan di lebih dari satu tempat ini sekaligus. Header yang akan kita kenalan sebentar lagi adalah cara server memberi tahu masing-masing tempat itu apa yang boleh dilakukan.
Di mana posisi CDN
CDN adalah topik yang dalam tersendiri, soal bagaimana ia menempatkan salinan file kamu di pusat-pusat data di seluruh dunia supaya pengguna mengunduh dari lokasi terdekat. Kita bahas CDN lebih rinci di materi hosting. Untuk artikel ini, cukup ingat bahwa CDN adalah cache bersama berukuran besar yang berada di antara pengguna dan server kamu.
Cache-Control: sakelar utamanya
Header caching paling penting saat ini adalah Cache-Control. Server mengirimnya bersama sebuah respons untuk menjelaskan bagaimana respons itu boleh disimpan. Ia menerima sederet instruksi yang dipisah koma, yang disebut directive. Berikut contoh yang umum:
HTTP/1.1 200 OK
Content-Type: text/css
Cache-Control: public, max-age=86400
Mari kita bedah directive yang sering muncul satu per satu.
| Directive | Artinya |
|---|---|
max-age=N |
Respons dianggap “segar” selama N detik. Selama itu, cache boleh memakainya ulang tanpa bertanya apa-apa. (86400 = 24 jam.) |
public |
Cache mana pun boleh menyimpannya, termasuk cache bersama seperti CDN. |
private |
Hanya browser pengguna yang boleh menyimpannya. Cache bersama tidak boleh menyimpan salinan. |
no-cache |
Cache boleh menyimpannya, tapi wajib memeriksa ulang ke server sebelum memakainya lagi. |
no-store |
Jangan disimpan sama sekali, di mana pun. Selalu ambil yang baru. |
Beberapa nama ini gampang tertukar, jadi dua yang terakhir layak kita pelankan.
no-cache vs. no-store
Namanya terdengar nyaris sama, tapi kelakuannya jauh berbeda.
no-storeberarti jangan simpan salinan apa pun. Setiap kali file dibutuhkan, ia harus diunduh ulang dari server. Ini dipakai untuk data yang benar-benar sensitif atau selalu berubah, seperti halaman saldo rekening.no-cachelebih longgar. Ia berkata, kamu boleh menyimpan salinan, tapi sebelum memakainya kamu wajib bertanya ke server “salinanku masih sah?” Kalau server bilang salinan itu masih valid, browser memakainya ulang tanpa mengunduh ulang, dan itu cepat. Kalau tidak, ia mengunduh versi yang baru.
no-cache bukan berarti jangan di-cache
Hampir semua orang awalnya terjebak di sini. no-cache tidak melarang caching. Ia mengizinkan caching tapi mewajibkan pemeriksaan ulang sebelum tiap pemakaian. Kalau kamu benar-benar tidak mau ada yang tersimpan, directive yang kamu cari adalah no-store.
public vs. private
public dan private menentukan siapa yang boleh menyimpan salinan, bukan berapa lama. File gaya yang isinya identik untuk semua orang boleh public, sehingga sebuah CDN bisa menyajikan satu salinan ke ribuan pengguna. Halaman yang menampilkan detail akun pribadi John Doe sebaiknya private, supaya hanya browser John sendiri yang menyimpannya dan tidak ada cache bersama yang tak sengaja menyerahkannya ke Jane Doe.
Expires: pendekatan yang lebih lama
Sebelum Cache-Control ada, cara untuk mengatur masa kedaluwarsa adalah header Expires. Ia menyebut tanggal dan waktu pasti, dan setelah itu respons dianggap basi:
Expires: Wed, 21 Oct 2026 07:28:00 GMT
Cara ini berfungsi, tapi punya kelemahan: ia bergantung pada jam. Kalau jam di komputer pengguna salah, perhitungannya ikut salah. Cache-Control: max-age menghindari masalah ini dengan menghitung detik sejak respons tiba, sehingga tak peduli jam siapa yang dianggap benar. Kalau kedua header ada, Cache-Control yang menang. Kamu masih akan menjumpai Expires di lapangan, tapi untuk pekerjaan baru sebaiknya pilih max-age.
ETag dan revalidasi: pengecekan “masih oke nggak?”
Sejauh ini kita menangani kesegaran dengan timer. Tapi ada trik yang lebih pintar untuk saat sebuah salinan mungkin sudah usang: alih-alih asal mengunduh ulang, browser bisa bertanya, “ini benar-benar berubah, nggak?” Kalau tidak, server bisa menjawab dengan balasan mungil dan melewatkan pengiriman seluruh file lagi. Ini disebut revalidasi, dan bintangnya adalah ETag.
ETag (entity tag) adalah pengenal pendek yang ditempelkan server pada sebuah file, anggap saja seperti sidik jari atau cap versi. Kalau file berubah sedikit saja, ETag-nya ikut berubah. Begini tampilan permintaan pertama:
HTTP/1.1 200 OK
ETag: "a1b2c3d4"
Cache-Control: no-cache
Content-Type: image/png
(... seluruh byte gambar ...)
Browser menyimpan gambar itu beserta ETag-nya. Nanti, ketika butuh gambar yang sama lagi, ia meminta server memastikan salinannya masih terkini dengan mengirim ETag itu kembali lewat header If-None-Match:
GET /logo.png HTTP/1.1
Host: blog.acy-partner.com
If-None-Match: "a1b2c3d4"
Sekarang salah satu dari dua hal terjadi:
Kalau file TIDAK BERUBAH:
Server membalas → 304 Not Modified (tanpa body, cuma "pakai salinanmu")
Kalau file BERUBAH:
Server membalas → 200 OK + file baru + ETag baru
Balasan 304 Not Modified itulah keajaibannya. Ukurannya kecil, tanpa body file sama sekali, jadi ia kembali nyaris seketika, lalu browser memakai ulang salinan yang sudah ia punya. Kamu dapat keamanan dari selalu memeriksa ke server, tanpa membayar ongkos unduh ulang saat tidak ada yang berubah.
| Status | Artinya dalam caching |
|---|---|
200 OK |
Ini file lengkap dan segarnya. |
304 Not Modified |
Salinan cache-mu masih bagus, pakai ulang saja, saya tidak mengirim apa-apa. |
Kombinasi yang umum dan ampuh
Susunan yang banyak dipakai adalah Cache-Control: no-cache bersama sebuah ETag. Browser menyimpan salinan tapi memeriksa setiap kali, dan sebagian besar pemeriksaan itu kembali sebagai 304 yang kecil. Kamu dapat konten yang cukup segar dengan data yang sangat sedikit berpindah.
Ada kerabat yang lebih lama dari pola ini, yang berbasis tanggal alih-alih sidik jari: server mengirim tanggal Last-Modified, lalu browser bertanya “ada yang lebih baru?” lewat header If-Modified-Since. Cara kerjanya sama dan juga menghasilkan 304 saat tidak ada yang berubah. ETag biasanya lebih disukai karena mendeteksi perubahan apa pun, bukan hanya perubahan yang bisa dilihat oleh jam.
Menggabungkan semuanya: strategi di dunia nyata
Untuk situs web pada umumnya kamu akan sering melihat dua gaya caching berbeda, yang dipilih berdasarkan jenis file:
- File yang sering berubah (seperti halaman HTML, atau respons API) memakai
no-cachedenganETag. Mereka selalu diperiksa ulang, tapi pemeriksaannya murah. - File yang jarang berubah (seperti logo, font, atau skrip berversi bernama
app.4f8a.js) memakaimax-ageyang panjang denganpublic. Browser dan CDN menyimpannya lama dan tidak merepotkan server sama sekali.
Trik untuk kelompok kedua adalah: ketika kamu memang perlu mengubah file semacam itu, kamu mengganti namanya (misalnya dengan menaruh hash baru di nama file). Nama baru berarti URL baru, jadi cache memperlakukannya sebagai file yang sama sekali baru dan mengambil yang segar, tanpa salinan basi yang nyangkut. Pola ini disebut cache busting, dan ia membuatmu bisa nge-cache secara agresif tanpa pernah menyajikan konten kedaluwarsa.
Rangkuman singkat
Caching adalah cara web untuk tidak mengulang pekerjaan, dan hasilnya terasa di dua arah sekaligus: halaman lebih cepat untuk orang, dan beban lebih ringan untuk server. Berikut gagasan yang layak diingat:
- Cache adalah salinan tersimpan yang sementara, ditaruh di tempat yang lebih cepat dari aslinya.
- Salinan bisa berada di browser kamu (privat) atau di cache bersama seperti CDN.
Cache-Controladalah header utamanya. Ingatmax-age(berapa lama segar),public/private(siapa yang boleh menyimpan),no-cache(simpan tapi revalidasi), danno-store(jangan simpan apa pun).Expiresadalah cara lama berbasis jam untuk mengatur kesegaran; lebih baik pilihmax-age.- ETag +
If-None-Matchmemungkinkan browser bertanya “ini berubah nggak?” dan mendapat304 Not Modifiedyang mungil saat tidak berubah, sehingga hemat satu unduhan penuh.
Begitu hal-hal ini terasa pas, langkah berikutnya yang baik adalah melihat bagaimana sebuah CDN menyebar salinan cache ke seluruh dunia, dan bagaimana header respons secara umum membentuk perilaku browser. Caching berada tepat di persimpangan antara kecepatan dan ketepatan, dan memahaminya adalah salah satu cara tercepat untuk membuat sebuah situs terasa jauh lebih ringan.