D P U S E C

Http Headers / Cache-Control

Bugün Http başlıklarından biri olan Cache-Control başlığını inceleyeceğiz.Keyifli okumalar..

Cache-Control

Programatik olarak değiştirilmesi yasak olan başlıklardandır.

– Hem request hemde response başlığıdır.

– Önbelleğe almayı kontrol eden talimatları tutar.

– Önbelleğe alma yönergeleri büyük/küçük harfe duyarlı değildir. Ancak, bazı uygulamalar büyük harfli yönergeleri tanımadığı için küçük harf kullanılması önerilir.

– Birden fazla yönergeye izin verilir ve virgülle ayrılmalıdır (örn. “Cache-control: max-age=180, public”).

– Bazı yönergelerin karşılıkları ‘=’ işareti ile belirtilir ve sayısal değer oldukları için tırnak içerisine alınmazlar.

Bazı Http Cache Control Tanımlamaları

 HTTP Cache

  1. – Sonraki isteklerde yeniden kullanılmak üzere istekleri ve yanıtları tutan uygulama.
  • – Paylaşılan bir önbellek veya özel bir önbellek olabilir.
  •  

Shared Cache

– Kaynak sunucu ile istemciler arasında bulunan önbellek (örn. Proxy, CDN). Tek bir yanıtı depolar ve birden fazla kullanıcı ile yeniden kullanır – bu nedenle geliştiriciler paylaşılan önbellekte önbelleğe alınacak kişiselleştirilmiş içerikleri depolamaktan kaçınmalıdır.

Private Cache

– İstemcide var olan önbellektir.

– Yerel önbellek veya tarayıcı önbelleği olarak da adlandırılır.

– Tek bir kullanıcı için kişiselleştirilmiş içeriği depolayabilir ve yeniden kullanabilir.

Store Response

– Yanıt önbelleğe alınabilir olduğunda bir yanıtı önbelleklerde depolama demektir . Ancak, önbelleğe alınan yanıt her zaman olduğu gibi yeniden kullanılmaz. (Genellikle “önbellek” bir yanıtın depolanması anlamına gelir).

Reuse Response

– Önbelleğe alınan yanıtları sonraki istekler için yeniden kullanma demektir.

Revalidate Response

– Revalidate yeniden doğrulama demektir.

– Kaynak sunucuya depolanan yanıtın hala taze olup olmadığını sormaktır. Genellikle, yeniden doğrulama bir koşullu istek aracılığıyla yapılır.

Fresh Response

– Yanıtın taze olduğunu gösterir. 

– Bu genellikle, istek yönergelerine bağlı olarak yanıtın sonraki istekler için yeniden kullanılabileceği anlamına gelir.

Stale Response

– Stale bayat demektir.

– Yanıtın eski bir yanıt olduğunu gösterir.

– Bu genellikle yanıtın olduğu gibi yeniden kullanılamayacağı anlamına gelir.

– Önbellek depolamanın bayat yanıtları hemen kaldırması gerekmez çünkü yeniden doğrulama, yanıtı bayat olmaktan çıkarıp yeniden taze hale getirebilir.

Age

– Bir yanıtın oluşturulmasından bu yana geçen süreyi belirtir.

– Bir yanıtın yeni veya eski olup olmadığına ilişkin bir ölçüttür.

Cache-Control Direktifleri (attributes)


Response attributes

 

max-age

 
 – Yanıtın ne kadar süre taze kalacağını belirtir. 
– Önbellekler bu yanıt taze ise bunu kullanabilirler.
– Max-age değerinin yanıtın alınmasından bu yana geçen süre değil, yanıtın kaynak sunucuda oluşturulmasından bu yana geçen süre olduğunu unutmayın.
– Maksimum age değeri negatifse (örneğin, -1) veya tam sayı değilse (örneğin, 3599,99), önbelleğe alma davranışı belirtilmez. Önbelleklerin bu değere 0’mış gibi davranması önerilir.
– Hem private hem shared önbelleklerde geçerlidir.

 

s-maxage

 
– max-age ile aynı şeyi belirtir
– lakin varsa max-ageyi ve Expires başlığını (paylaşımlı önbelleklerde olur) ezer.
– sadece shared önbelleklerde geçerlidir.

 no-cache

 
-Yanıtın önbelleklerde saklanabileceğini belirtir, ancak önbellek kaynak sunucudan bağlantısı kesildiğinde bile yanıtın her yeniden kullanımdan önce kaynak sunucuda doğrulanması gerekir.
 
– Saklanan içeriği yeniden kullanırken önbelleklerin her zaman içerik güncellemelerini kontrol etmesini istiyorsanız, no-cache kullanılacak yönergedir. Bunu, önbelleklerin her isteği kaynak sunucu ile yeniden doğrulamasını gerektirerek yapar.
 
– no-cache’in “önbelleğe alma” anlamına gelmediğini unutmayın. no-cache önbelleklerin bir yanıtı saklamasına izin verir, ancak yeniden kullanmadan önce yeniden doğrulamalarını gerektirir. Eğer istediğiniz “önbelleğe alma” anlamı aslında “saklama” ise, o zaman no-store kullanılacak yönergedir.
 
 

must-revalidate

 
-Revalidate yeniden doğrulama demektir.
 
– must-revalidate yanıt yönergesi, yanıtın önbelleklerde saklanabileceğini ve tazeyken yeniden kullanılabileceğini belirtir. Yanıt eski hale gelirse, yeniden kullanılmadan önce kaynak sunucu ile doğrulanmalıdır.
 
– Genellikle must-revalidate, max-age ile birlikte kullanılır.
 
– HTTP, önbelleklerin kaynak sunucuyla bağlantısı kesildiğinde eski yanıtları yeniden kullanmasına izin verir. must-revalidate bunun olmasını önlemenin bir yoludur.
 

 

proxy-revalidate

 
-Proxy-revalidate yanıt yönergesi must-revalidate ile eşdeğerdir, ancak sadece paylaşımlı ( shared cache’den yukarıda bahsetmiştik) önbellekler içindir.
 

no-store

 
– private ya da shared farketmeksizin herhangi bir önbelleğin yanıtı saklamaması gerektiğini belirtir.
 
 

private

 
-Sadece özel önbelleklerde saklanabileceğini gösterir yani istemcinin tarayıcısı.
 
– Özellikle oturum açtıktan sonra alınan yanıtlar ve çerezler aracılığıyla yönetilen oturumlar için kullanıcıya özel içerik için private yönergesi eklenir.
 
– Kişiselleştirilmiş içeriğe sahip bir yanıta private eklenmemişse, bu yanıt paylaşılan bir önbellekte depolanabilir ve birden fazla kullanıcı için yeniden kullanılabilir, bu da kişisel bilgilerin sızmasına neden olur.
 
 
 

public

 
– Yanıtın shared(paylaşılan) bir önbellekte saklanabileceğini belirtir paylaşılan önbelleklerde saklanabilen bir bilgi doğal olarak private önbelleklerde de saklanabilir. 
 
– Authorization(yetkilendirme) başlık alanları içeren isteklerin yanıtları paylaşılan bir önbellekte saklanmamalıdır; ancak, public yönergesi bu tür yanıtların paylaşılan bir önbellekte saklanmasına neden olur.
 
– Genel olarak, sayfalar Basic Auth veya Digest Auth altında olduğunda, tarayıcı istekleri Authorization başlığı ile gönderir. Bu, yanıtın kısıtlı kullanıcılar (hesabı olan) için erişim kontrollü olduğu ve max-age sahip olsa bile temelde paylaşılabilir önbelleğe alınamayacağı anlamına gelir.Bu kısıtlamayı kaldırmak için public yönergesini kullanabilirsiniz.
 
– Aynı yanıtı birçok yetkili kullanıcıya hızlı bir şekilde sunmak isteyebilirsiniz. İşte bu durumda `Cache-Control: public` yönergesi devreye girer. `public` yönergesi, bu yanıtların paylaşılan önbelleklerde saklanmasına izin verir.
 
 

must-understand

 
-bir önbelleğin yanıtı yalnızca durum koduna dayalı önbelleğe alma gereksinimlerini anlıyorsa saklaması gerektiğini belirtir.
 
– must-understand geri dönüş davranışı için no-store ile birleştirilmelidir.
 
– Bir önbellek must-understand’i desteklemiyorsa, no-store devreye girer ve cevap önbellekte tutulmaz.
 
– Bir önbellek must-understand özelliğini destekliyorsa, yanıtı durum koduna göre önbellek gereksinimlerini anlayarak saklar.
 
– Örnek 1: Önbelleğin Desteklemediği Bir Durum;
– Bir web uygulamanızda, bir yanıtın yalnızca belirli durumlarda önbelleğe alınmasını istiyorsunuz. Örneğin, bir API yanıtı belirli bir durum koduna (örneğin, `202 Accepted`) sahip olduğunda, önbelleğin bu durumu anlaması ve yanıtı uygun şekilde saklaması gerekir. Eğer önbellek bu durumu anlamıyorsa ve yanıtı yanlışlıkla saklarsa, kullanıcılar yanlış bilgiler alabilir.Must-understandyanıtın yalnızca önbelleğin belirli önbellekleme kurallarını anlayıp uygulayabileceği durumlarda saklanmasını sağlar. Eğer önbellek `must-understand` direktifini desteklemiyorsa, `no-store` devreye girer ve yanıt saklanmaz. Bu, yanıtın yanlış koşullar altında saklanmasını önler. 
 
 
 

no-transform

 
-Bazı aracılar içerik türünü boyutu azaltmak için dönüştürebilir,bu başık bunun yapılmasının istenmediği durumlarda kullanılır.
 

immutable

 
-Yanıt fresh (taze) olduğu sürece yani max-age’si geçmediği sürece güncellenmeyeceğini belirtir.
 
– Cache-Busting Deseni: Statik kaynaklar (örneğin, JavaScript, CSS dosyaları) için en iyi uygulamalardan biri, bu kaynakların URL’lerinde sürüm numaraları veya hash değerleri bulundurmaktır. Bu kaynakların içerikleri değiştirildiğinde, URL’leri de değiştirilir (örneğin, `react.0.0.0.js` yerine `react.0.0.1.js` gibi). Böylece, tarayıcı eski dosyayı değil, yeni dosyayı yükler. Bu yaklaşıma “cache-busting” denir.
 
– Bir kullanıcı tarayıcıyı yeniden yüklediğinde, tarayıcı genellikle sunucuya kaynakların geçerli olup olmadığını sorar (conditional request). Ancak, `immutable` direktifi sayesinde, bu tür statik kaynaklar için bu yeniden doğrulama gerekmez çünkü bu kaynakların değişmeyeceği varsayılır.
 
– Eğer kaynaklar için uzun bir `max-age` (önbellekte kalma süresi) belirlediyseniz ve bu kaynaklarda cache-busting desenini kullanıyorsanız, `immutable` direktifini ekleyerek gereksiz sunucu isteklerinden kaçınabilirsiniz.
 

 

stale-while-revalidate

 
 -Kısaca özetlemek gerekrise; maxage değeri 7 gün olsun bahsettiğimiz başlığın değeri ise 1 gün.İstek bir hafta boyunca taze kalacaktır.Kullanıcı bir haftanın hemen sonunda siteye gitmek isterse önbellekte olan sayfa gösterilir ama arka planda istek atılır ve istek tazelenir.Böylece kullanıcı hızlı bir deneyim yaşamış olur.

 

stale-if-error

 
-Bir önceki başlığa benzer bir mantık sözkonusu.Bu sefer eğer 500,502,503,504 hatalarından birisi ile karşılaşılırsa ve istek stale duruma gelmişse eğer stale-if-error süreside dolmadığı halde eski cevap görüntülenebilir.Eğer bu süre de dolduysa kullanıcı hata mesajını görecektir.
 
 
 

Request attributes 

 

no-cache

 
– No-cache istek yönergesi, önbelleklerden yeniden kullanmadan önce yanıtı kaynak sunucu ile doğrulamalarını ister.
– no-cache, önbellekte yeni bir yanıt olsa bile istemcilerin en güncel yanıtı talep etmesini sağlar.
– Tarayıcılar genellikle kullanıcılar bir sayfayı yeniden yüklemeye zorlandığında isteklere no-cache ekler.
– özet : Eğer bu direktif varsa isteğin talep ettiği şey önbellekte tutulan cevaplarla verilmez  zorla yeniden yükletilir.
 

no-store

 
-Eğer istekte bu direktif varsa tarayıcı sunucuya veya ilgili proxiye gelen isteği ve bu isteğe gelen yanıtı hiçbir şekilde önbelleğe almamasını söyler.Bunun sebebi istekte önemli veriler olabilir ve açığa çıkması güvenlik problemi olabilir.
 

max-age

 
– Request bazında 2 kullanım amacı vardır
 
– Birincisi : eğer proxyde veya sunucunun önbelleğinde dönebilecek bir cevap varsa bu yanıtın maxage değerini yani zaman aralığını belirtir.
 
– İkincisi : max-age=0 kullanımıdır.Bunun amacı ise no-cache http 1.0 de desteklenmez dolayısı ile onun yerine kullanılır.
 
– Yani responsedeki max-age kullanımıyla benzer bir işlev görmüyor diyebiliriz.
 

max-stale

 
-Bir süre belirtir ve bu süre sunucudan kabul edeceği isteğin bayatlaması üzerine geçen süredir.
 
– Örneğin yukarıdaki örnekte sunucuya 1 saat önceye kadar bayatlamış istekleri gönderebilirsin demektir.
 
– Eğer n değeri belirtilmezse kullanıcı herhangi bir bayat isteği dönebilir.
 
– İstemciler, kaynak sunucu kapalı veya çok yavaş olduğunda bu başlığı kullanabilir ve biraz eski olsalar bile önbelleklerden gelen önbelleğe alınmış yanıtları kabul edebilirler.
 
– Ayrıca desteklese bile dönecek cevap sunucunun konfigürasyonuna bağlı olarak değişebilir.
 
– Başlıca tarayıcıların max-stale içeren istekleri desteklemediğini unutmayın.
 

min-fresh

 
-istemcinin (tarayıcı gibi) en az N saniye boyunca taze kalacak bir yanıt talep ettiğini belirtir.
 
– istemcinin yalnızca taze bir yanıt almak istemediği, aynı zamanda bu yanıtın belirli bir süre boyunca güncellenmeyeceği garantisini istediği yerlerde kullanılır.
 
– Örneğin, `Cache-Control: min-fresh=600` direktifi, istemcinin yanıtın en az 600 saniye daha taze kalmasını istediğini ifade eder. Eğer önbellekteki bir yanıt 3600 saniyelik bir `max-age` ile saklanmışsa ve bu yanıt 51 dakika önce (3060 saniye) saklanmışsa, bu yanıt artık `min-fresh=600` kriterini karşılamaz ve önbellek bu yanıtı yeniden kullanamaz. Bu durumda, istemci yeni bir yanıt almak zorunda kalır.
 
– max-stale gibi bu direktifte bir çok tarayıcı tarafından desteklenmez.
 
 

no-transform

 
-Bir yanıt için no-transform’un sahip olduğu anlamın aynısı, ancak bunun yerine bir istek için.
 

only-if-cached

 
 – İstemci, zaten önbelleğe alınmış bir yanıtın döndürülmesi gerektiğini belirtir.
– Önbellekte depolanmış bir yanıt varsa eski bile olsa döndürülür.
– Eğer yoksa 504 döndürülür.
 
Http’nin önemli başlıklarından biri olan Cache-Control’ü inceledik.Okuduğunuz için teşekkür ederim. 🙂 
İlgili Etiketler:
Sosyal Medyada Paylaş