CDN

Caching di edge, invalidasi, dan URL bertanda tangan untuk distribusi konten.

Daftar isi

CDN (Content Delivery Network) adalah jaringan server yang menyimpan salinan konten statis di banyak lokasi geografis, sehingga permintaan (request) pengguna dilayani oleh server terdekat dan bukan oleh server asal. Topik ini membahas cara kerja caching di edge, mekanisme invalidasi, dan URL bertanda tangan untuk berkas yang tidak boleh dibagikan secara bebas. Setelah membacanya, keputusan kapan CDN perlu ditambahkan ke sebuah arsitektur dapat diambil dengan dasar yang jelas.

Caching di edge#

CDN menempatkan salinan konten pada server tepi (edge), yaitu server yang berlokasi lebih dekat ke pengguna daripada server asal (origin). Kumpulan server tepi di satu kota atau wilayah lazim disebut point of presence (PoP). Apabila seorang pengguna meminta sebuah gambar, permintaan diarahkan ke PoP terdekat melalui routing DNS atau anycast, kemudian server tepi memeriksa apakah salinannya masih ada di cache.

Dua istilah menentukan kinerja pola ini. Cache hit terjadi apabila salinan konten masih tersimpan dan valid, sehingga respons (response) dikirim dari server tepi tanpa menyentuh origin. Cache miss terjadi apabila salinannya tidak ada atau sudah kedaluwarsa, sehingga server tepi mengambil konten dari origin, menyimpan salinannya, lalu meneruskannya ke pengguna. Rasio hit yang tinggi menurunkan latensi dan beban origin secara bersamaan, karena sebagian besar permintaan berhenti di tepi jaringan.

Masa berlaku salinan dikendalikan oleh header HTTP, terutama Cache-Control dengan direktif max-age. Origin yang menyetel max-age=86400 memberi tahu semua cache di sepanjang jalur bahwa respons boleh dipakai ulang selama 86400 detik. Konten yang paling cocok untuk pola ini adalah konten statis seperti gambar, berkas CSS, berkas JavaScript, dan arsip unduhan, karena isinya sama untuk semua pengguna. Diagram berikut merangkum alurnya.

PenggunaPoP CDN (edge)cache kontenOrigin1. permintaan2. cache miss3. respons dari origin4. respons ter-cache ke pengguna
Alur permintaan konten melalui CDN

Invalidasi cache#

Invalidasi adalah proses menghapus salinan yang sudah usang dari cache edge sebelum masa berlakunya berakhir. Mekanisme ini diperlukan apabila konten berubah lebih cepat daripada max-age yang pernah disetel, misalnya kesalahan penulisan pada halaman yang baru terbit. Tanpa invalidasi, pembaca terus melihat versi lama sampai masa berlaku habis.

Hampir semua penyedia CDN memiliki purge, yaitu perintah untuk menghapus salinan berdasarkan URL atau pola URL. Meskipun tersedia, invalidasi sebaiknya tidak dijadikan mekanisme rutin. Perintah purge harus dipanggil setiap kali konten berubah, harus menjangkau semua PoP, dan tidak menghapus salinan yang sudah tersimpan di browser pengguna. Biaya operasionalnya naik sebanding dengan frekuensi perubahan konten.

Pola yang lebih tahan lama adalah memasukkan versi ke dalam URL itu sendiri, misalnya app.a1b2c3.js dengan a1b2c3 berupa hash isi berkas. Setiap perubahan isi menghasilkan URL baru yang belum pernah ada di cache mana pun, sehingga konten baru langsung dilayani tanpa invalidasi. URL lama tetap valid bagi siapa pun yang masih menyimpannya, dan max-age untuk URL berversi dapat dipasang dengan masa yang sangat panjang.

URL bertanda tangan untuk konten privat#

CDN biasanya melayani konten publik, tetapi banyak arsitektur juga perlu mendistribusikan berkas privat, misalnya arsip laporan yang hanya boleh diakses pelanggan tertentu dalam waktu terbatas. Menyalin seluruh mekanisme otorisasi origin ke setiap PoP tidak praktis. Solusinya adalah signed URL, yaitu URL yang membawa tanda tangan kriptografi atas jalur berkas dan masa kedaluwarsanya.

Tanda tangan dibuat dengan HMAC (Hash-based Message Authentication Code), yang menggabungkan rahasia bersama dengan pesan berupa jalur dan waktu kedaluwarsa. Origin menghasilkan URL bertanda tangan dan menyerahkannya kepada klien yang berhak. Server tepi dapat memverifikasi tanda tangan itu sendiri, sehingga tidak perlu bertanya kepada origin untuk setiap permintaan. Program berikut mensimulasikan pembuatan dan verifikasi URL bertanda tangan secara lokal tanpa jaringan.

python url-bertanda-tangan.py
"""Simulasi URL bertanda tangan (signed URL) dengan HMAC-SHA256.

Penandatanganan dan verifikasi dijalankan sepenuhnya secara lokal, tanpa
jaringan, sehingga keluarannya dapat direproduksi di sandbox.
"""
import hashlib
import hmac
from urllib.parse import urlencode

RAHASIA = b"kunci-simulasi-2026"
BASIS = "https://cdn.contoh-arsip.id"


def buat_tanda_tangan(jalur, kedaluwarsa):
    pesan = f"{jalur}:{kedaluwarsa}".encode()
    return hmac.new(RAHASIA, pesan, hashlib.sha256).hexdigest()


def buat_url(jalur, kedaluwarsa):
    kueri = urlencode({
        "kedaluwarsa": kedaluwarsa,
        "tanda": buat_tanda_tangan(jalur, kedaluwarsa),
    })
    return f"{BASIS}{jalur}?{kueri}"


def verifikasi(jalur, kedaluwarsa, tanda, waktu_sekarang):
    if int(kedaluwarsa) <= waktu_sekarang:
        return "DITOLAK (kedaluwarsa)"
    tanda_janji = buat_tanda_tangan(jalur, kedaluwarsa)
    cocok = hmac.compare_digest(tanda, tanda_janji)
    return "DITERIMA" if cocok else "DITOLAK (tanda tangan)"


url = buat_url("/arsip/2026/laporan.pdf", 1800000000)
tanda = url.split("tanda=")[1]
print("URL yang diterbitkan origin:")
print(url)
print()
print("Verifikasi tepat waktu  :", verifikasi(
    "/arsip/2026/laporan.pdf", 1800000000, tanda, 1799999999))
print("Verifikasi setelah lewat:", verifikasi(
    "/arsip/2026/laporan.pdf", 1800000000, tanda, 1800000001))
print("Verifikasi jalur lain   :", verifikasi(
    "/arsip/2026/laporan-rahasia.pdf", 1800000000, tanda, 1799999999))
text Keluaran
URL yang diterbitkan origin:
https://cdn.contoh-arsip.id/arsip/2026/laporan.pdf?kedaluwarsa=1800000000&tanda=7120a16058c4ac9da2df0abd3ad283c71973001d396481e8c32b42702f4cea11

Verifikasi tepat waktu  : DITERIMA
Verifikasi setelah lewat: DITOLAK (kedaluwarsa)
Verifikasi jalur lain   : DITOLAK (tanda tangan)

Verifikasi pada baris terakhir gagal karena tanda tangan dihitung atas jalur /arsip/2026/laporan.pdf, sedangkan permintaan menunjuk ke jalur lain. Inilah sifat HMAC yang menjadi dasar keamanan skema ini, yaitu perubahan sekecil apa pun pada pesan menghasilkan tanda tangan yang tidak cocok. Waktu kedaluwarsa juga menjadi bagian dari pesan, sehingga URL yang sama otomatis ditolak setelah waktunya lewat tanpa tindakan apa pun dari origin.

Kesalahan umum#

  • Menyimpan respons pribadi di cache bersama. Apabila respons berbeda untuk setiap pengguna tetapi URL-nya sama, salinan milik satu pengguna dapat dikirim ke pengguna lain. Perbaikannya adalah menyetel Cache-Control: private, no-store pada respons pribadi dan memakai signed URL untuk mendistribusikan berkasnya.
  • Mengandalkan invalidasi sebagai alur kerja rutin. Konten yang sering berubah sebaiknya dipublikasikan dengan URL berversi sehingga purge hanya menjadi langkah darurat.
  • Menyetel max-age terlalu panjang untuk konten yang ternyata masih berubah harian. Perbaikannya berasal dari perencanaan, yaitu memisahkan konten yang benar-benar statis dari konten yang diperbarui berkala, lalu memberi masa berlaku yang sesuai pada masing-masing.

Ringkasan#

  • CDN menyimpan salinan konten statis pada server tepi, sehingga cache hit menurunkan latensi bagi pengguna sekaligus membebani origin lebih sedikit.
  • Masa berlaku salinan diatur oleh header Cache-Control, sedangkan invalidasi dipakai sebagai langkah darurat, dan URL berversi menghindarkan kebutuhan purge sama sekali.
  • URL bertanda tangan memindahkan otorisasi konten privat ke HMAC atas jalur dan kedaluwarsa, sehingga server tepi dapat menolak permintaan tanpa bertanya kepada origin.

Referensi#