ETag dan Conditional Request: Sidik Jari File
Memahami cara kerja ETag, weak vs strong validator, dan pola conditional request yang hemat bandwidth.
Sidik jari untuk setiap file
Setiap manusia punya sidik jari unik. Server bisa memberi "sidik jari" untuk setiap file lewat header ETag: string unik yang berubah kalau isi file berubah. Browser menyimpan sidik jari ini, dan kunjungan berikutnya bertanya: "file dengan sidik jari ini masih sama?" Kalau ya, server jawab 304 tanpa mengirim ulang file.
Kenapa ETag lebih baik dari sekadar tanggal
Last-Modified hanya akurat sampai detik dan gagal mendeteksi perubahan yang dikembalikan (file diubah lalu dikembalikan seperti semula, tanggal berubah tapi isi sama). ETag dihitung dari ISI file (biasanya hash), sehingga akurat sampai level byte. Ini fondasi caching presisi yang dipakai CDN modern.
Contoh 1: alur ETag lengkap
Request pertama:
GET /data.json HTTP/1.1
Host: api.contoh.idHTTP/1.1 200 OK
ETag: "5d41402abc"
Content-Type: application/json
{"versi": 3}Request kedua (browser otomatis menyertakan ETag tersimpan):
GET /data.json HTTP/1.1
Host: api.contoh.id
If-None-Match: "5d41402abc"Isi tidak berubah:
HTTP/1.1 304 Not ModifiedHemat: response hanya header, tanpa body.
Contoh 2: weak vs strong validator
ETag: "5d41402abc" -> strong: byte per byte sama persis
ETag: W/"5d41402abc" -> weak: isinya setara (boleh beda metadata)Strong validator dipakai untuk download lanjutan (resume): browser harus yakin byte-nya identik. Weak validator (awalan W/) cukup untuk cache biasa: yang penting kontennya setara, misalnya halaman yang hanya beda timestamp footer.
Kesalahan umum
Salah: ETag tidak berubah padahal konten berubah. Terjadi kalau ETag dihitung dari waktu atau nomor versi yang lupa diupdate. Yang benar: hitung dari hash konten file.
Salah: mengandalkan ETag untuk keamanan. ETag hanya untuk caching, bukan untuk verifikasi integritas terhadap serangan. Yang benar: untuk keamanan pakai signature kriptografis terpisah.
Salah: tidak menangani 304 di kode manual. Untungnya fetch() menanganinya transparan. Yang benar: pahami bahwa di tab Network kamu melihat 304, tapi di kode kamu menerima 200 dari cache.
Kapan ETag tidak cukup
ETag hebat untuk file statis, tapi ada batasnya:
- Data sangat dinamis (misal harga saham real-time): validasi tiap detik sama mahalnya dengan mengunduh ulang. Lebih baik
Cache-Control: no-store. - Response personal: ETag per user membuat cache tidak bisa dipakai bersama. Pastikan cache bersifat private.
- Server farm tanpa ETag konsisten: tiap server menghitung ETag berbeda untuk file sama. Solusinya: matikan ETag bawaan server dan pakai versi file sebagai gantinya.
Aturan praktis: ETag untuk konten yang berubah jarang dan sama untuk semua user. Di luar itu, pilih strategi lain.
Catatan teknis: Kombinasi terbaik untuk file statis:
Cache-Control: max-age=31536000, immutable+ ETag sebagai cadangan. Untuk API dinamis:Cache-Control: no-cache+ ETag agar validasi murah lewat 304.
Tantangan
Lacak ETag di website nyata
Pilih website dengan banyak gambar (misalnya toko online):
- Di DevTools > Network, klik sebuah gambar dan lihat Response Headers: apakah ada ETag?
- Refresh halaman, klik gambar yang sama: apakah request-nya mengirim If-None-Match?
- Berapa status akhirnya: 200 atau 304?
Tulis temuanmu dalam 3 baris.