HTTP önbellekleme, bir HTTP yanıtının tarayıcıda veya ara önbellekte saklanıp daha sonraki isteklerde yeniden kullanılmasını sağlar. Temel amaç yalnız yanıtı saklamak değildir; saklanan yanıtın hangi istek için geçerli olduğunu, ne kadar süre taze sayılacağını ve eskidiğinde nasıl doğrulanacağını belirlemektir. Buradaki tazelik, önbellek kurallarının yanıtı ne kadar süre yeniden doğrulamadan kullanmaya izin verdiğini anlatır; kaynak sunucudaki içeriğin bu sırada hiç değişmediğini garanti etmez.

Bir kaynağın istemciye sunulan belirli içerik biçimine temsil denir. Örneğin aynı sayfanın farklı dillerdeki veya farklı biçimde sıkıştırılmış içerikleri ayrı temsiller olabilir.

Bu modelde Cache-Control saklama ve tazelik kurallarını belirler. ETag, sunucunun temsil için verdiği sürüm etiketini; Last-Modified ise son değişiklik zamanını bildirir. Önbellek bu değerlerle saklanan temsilin yeniden kullanılabilirliğini doğrulayabilir. Vary, seçilen temsilin hangi istek başlıklarına bağlı olduğunu bildirir. Yeniden doğrulamayı zorunlu tutan bir kural yoksa ve diğer eşleşme koşulları sağlanıyorsa önbellek taze yanıtı kaynak sunucuya gitmeden kullanabilir. Doğrulama gerektiğinde, kaydındaki ETag veya Last-Modified değerini içeren koşullu bir istekle mevcut yanıtın yeniden kullanılıp kullanılamayacağını sorabilir.

Yanıtın Saklanma ve Yeniden Kullanılma Koşulları

HTTP önbelleği iki ayrı soruyu yanıtlar: Bir yanıt saklanabilir mi ve saklanan yanıt daha sonraki istekte kullanılabilir mi? Bir yanıtın depolanmış olması, daha sonraki her isteğe doğrudan verilebileceği anlamına gelmez. Önbellek URL, istek yöntemi, ilgili Cache-Control kuralları, tazelik durumu ve varsa Vary tarafından belirtilen istek başlıklarını birlikte değerlendirir.

Özel ve Paylaşımlı Önbellekler Arasındaki Farklar

Tarayıcı önbelleği tipik bir özel önbellek örneğidir ve tek kullanıcı bağlamında çalışır. Ara sunucular veya içeriği farklı konumlardaki sunuculardan sunan CDN’ler, birden fazla kullanıcıya yanıt veren paylaşımlı önbellek işlevi görebilir. Cache-Control içindeki private, public ve s-maxage gibi talimatlara direktif denir; bu direktiflerin etkisi önbelleğin türüne göre değişir.

Cache-Control Tazelik ve Yeniden Kullanım Kurallarını Belirler

Cache-Control tek bir aç/kapat anahtarı değildir. Birden fazla direktif aynı yanıtta birlikte kullanılarak tazelik süresi, paylaşımlı önbellek davranışı ve yeniden doğrulama gereksinimi tanımlanabilir. Aşağıdaki tablo, yanıt başlığında kullanılan temel direktifleri gösterir.

Kaynağın değişim sıklığı, kullanıcıya özel olup olmadığı ve güncellemelerin ne kadar hızlı görünmesi gerektiği uygun önbellek politikasını belirler. Tek bir Cache-Control değeri bütün site için doğru değildir; örneklerdeki süreler her kaynak için ayrıca seçilmelidir.

DirektifTemel etkisi
max-ageYanıtın yaşı belirtilen saniye sayısına ulaştığında yanıt bayat kabul edilir.
s-maxagePaylaşımlı önbellek için tazelik süresini belirler; max-age veya son geçerlilik tarihini bildiren Expires başlığının önüne geçer. Bayat yanıtı doğrulamadan kullanmaya izin vermez.
no-cacheYanıt saklanabilse bile başka isteği karşılamadan önce başarılı doğrulama gerektirir.
no-storeİstek veya yanıtın önbellekte saklanmasını engeller.
privatePaylaşımlı önbelleğin yanıtı saklamasını engeller; özel önbellek için saklama mümkün olabilir.
publicYanıtı, normalde saklama engeli olabilecek bazı durumlarda açıkça önbelleklenebilir olarak işaretler.
must-revalidateYanıt bayatladıktan sonra başarılı doğrulama olmadan yeniden kullanılmasını engeller.

max-age ve s-maxage Tazelik Süresini Belirler

Cache-Control: public, max-age=3600 örneğinde tazelik süresi 3600 saniyedir. Bu süre, yanıtın her önbelleğe ulaştığı anda sıfırdan başlamaz. Önbellek, yanıtın oluşturulmasından veya son başarılı doğrulamasından beri geçen yaşı hesaplar; Age başlığı önceki önbelleklerde geçen süreyi de bu hesaba taşır. Örneğin yanıtın hesaplanan yaşı 1200 saniyeyse taze kalabileceği süre 3600 değil, 2400 saniyedir.

Taze yanıt, diğer eşleşme ve saklama koşulları da sağlanıyorsa ve no-cache gibi bir kural doğrulama istemiyorsa kaynak sunucuya yeni istek göndermeden kullanılabilir. s-maxage ise yalnız paylaşımlı önbellek için ayrı süre belirler; bu süre dolduğunda paylaşımlı önbellek yanıtı doğrulamadan yeniden kullanamaz.

no-cache ile no-store Arasındaki Farklar

Cache-Control: no-cache ifadesi adındaki "no" nedeniyle sıkça yanlış yorumlanır. Bu direktif yanıtın hiç saklanamayacağını söylemez; saklanan yanıtın sonraki bir isteği karşılamadan önce başarılı biçimde doğrulanmasını gerektirir. Cache-Control: no-store ise depolamayı engeller ve iki direktif bu nedenle farklı ihtiyaçlara yöneliktir. no-store, kötü niyetli bir önbelleğin içeriği saklamasını teknik olarak durduran bir güvenlik mekanizması değildir; erişim kontrolü ve bağlantının şifrelenmesi ayrıca gereklidir.

private ve public Depolama Kapsamını Etkiler

private, yanıtın tek kullanıcıya yönelik olduğunu belirterek paylaşımlı önbelleğin saklamasını engeller; tarayıcı gibi özel bir önbellek yine saklayabilir. public ise diğer kurallar engellemiyorsa önbelleğin yanıtı saklamasına açıkça izin verir. Kullanıcıya özel içerikte private kullanımı, paylaşımlı bir önbelleğin aynı yanıtı başka kullanıcıya sunma riskini azaltır; fakat içeriği şifrelemez veya erişim izni vermez.

Örneğin Cache-Control: private, max-age=300, diğer koşullar da uygunsa yanıtın özel önbellekte saklanmasına ve yaşı 300 saniyeye ulaşana kadar taze sayılmasına izin verir. Böyle bir yanıtın tarayıcıda tutulması da istenmiyorsa no-store kullanılır.

ETag ve Last-Modified Doğrulama İçin Kullanılır

Tazelik süresi dolduğunda önbelleğin tek seçeneği yanıt gövdesini yeniden indirmek değildir. Sunucu bir doğrulayıcı sağlamışsa istemci veya önbellek koşullu istek göndererek saklanan temsilin güncelliğini koruyup korumadığını sorabilir. Değişiklik yoksa mevcut gövde korunur; değişiklik varsa yeni yanıt alınır.

ETag ve If-None-Match İlişkisi

ETag, sunucunun seçilen temsil için ürettiği bir doğrulayıcı değeridir. Örneğin daha önce ETag: "v17" alınmışsa doğrulama isteği If-None-Match: "v17" ile gönderilebilir. Sunucunun seçtiği temsil bu etiketle eşleşiyorsa GET veya HEAD isteğinde 304 Not Modified yanıtı verilebilir.

Sunucu ETag değerini güçlü doğrulayıcı olarak veya W/ önekiyle zayıf doğrulayıcı olarak üretebilir. Zayıf etiket bayt düzeyinde tam özdeşlik iddiası taşımaz, ancak If-None-Match ile önbellek doğrulamasında kullanılabilir. Karşılaştırma kuralını kullanılan koşul başlığı belirler: If-None-Match zayıf karşılaştırma yapar ve W/ işaretinden bağımsız olarak etiket değerini karşılaştırır. Örneğin W/"v17" ile "v17" bu karşılaştırmada eşleşir.

Last-Modified ve If-Modified-Since İlişkisi

Last-Modified, kaynağın seçilen temsilinin son değişiklik zamanını HTTP tarih biçiminde bildirir. Önbellek bu değeri daha sonra If-Modified-Since başlığında göndererek tarih tabanlı doğrulama yapabilir. ETag bulunan bir yanıttan sonra önbellek, doğrulama isteğinde bu değeri If-None-Match başlığına; uygun koşullarda Last-Modified değerini de If-Modified-Since başlığına ekleyebilir.

Aynı koşullu istekte hem If-None-Match hem If-Modified-Since bulunuyorsa If-None-Match önceliklidir. Bu nedenle ETag, özellikle tarih bilgisinin değişiklikleri yeterince ayırt edemediği durumlarda daha kesin bir doğrulama mekanizması oluşturabilir.

304 Not Modified Yanıtı Veri Aktarımını Nasıl Azaltır?

304 Not Modified, koşullu GET veya HEAD isteğinde doğrulanan önbellek kaydının yeniden kullanılabileceğini bildirir ve içerik gövdesi taşımaz. Koşullu GET isteğinde böylece içerik tekrar indirilmez; HEAD yanıtı zaten gövdesizdir. Önbellek, 304 yanıtındaki uygun başlık bilgileriyle saklanan yanıtını güncelleyebilir.

  1. İlk GET isteğinde sunucu, içerik gövdesi ve ETag gibi bir doğrulayıcı taşıyan 200 OK yanıtı gönderir.
  2. Önbellek yanıtı saklar ve Cache-Control kurallarına göre tazelik süresini izler.
  3. Yanıt bayatladığında istemci veya önbellek If-None-Match ya da uygun durumda If-Modified-Since içeren koşullu istek gönderir.
  4. Temsil değişmemişse sunucu 304 Not Modified döner; tam içerik gövdesi yeniden aktarılmaz.
  5. Temsil değişmişse sunucu yeni tam yanıtı gönderir ve önbellek uygun koşullarda saklanan kopyasını yeniler.

Vary Yanlış Temsilin Kullanılmasını Nasıl Önler?

Aynı URL her istek için aynı içeriği üretmek zorunda değildir. Sunucu, istemcinin kabul ettiği sıkıştırma biçimlerini bildiren Accept-Encoding veya dil tercihlerini bildiren Accept-Language gibi istek başlıklarına göre farklı bir temsil seçebilir. Vary, önbelleğe hangi başlıkların seçimde etkili olduğunu bildirir. Önbellek, Vary içinde adı geçen istek başlıklarının değerleri önceki istekteki değerlerle eşleşmiyorsa saklanan yanıtı yeniden doğrulamadan kullanamaz.

Örneğin sıkıştırılmış ve sıkıştırılmamış yanıtlar aynı URL'de üretiliyorsa Vary: Accept-Encoding bu ayrımı önbellek anahtarına taşır. Vary gereksiz veya aşırı geniş kullanılırsa aynı URL için daha fazla ayrı önbellek girdisi oluşabilir; eksik kullanılırsa da yanlış temsilin seçilmesi riski doğar.