Sanyanggae LogoSanyanggae

💻 Web ve ön yüz geliştirme

HTTP önbelleğinde no-cache ve no-store farkı: ETag ve 304 ile güncellemeyi denetlemek

Saklama ile yeniden doğrulamayı ayırın; varsayımsal bir çalışma saatleri örneğinde Cache-Control, ETag ve 304 yanıtlarını yorumlayarak eski ekranın nedenini daraltın.

사냥개 (Sanyanggae)Yayımlanma Güncelleme 17 dakika

Bu, Korece özgün metnin çevirisidir. Korece özgün metin · Çeviri incelemesi: Yapay zekâ incelemesi

HTTP önbelleğini açıklayan kavram şeması: saklama ve yeniden kullanım, ETag ile doğrulama, 200 ve 304 yanıtları.
Sanyanggae tarafından hazırlanan açıklama şeması. Saklama ve yeniden kullanım, ETag doğrulaması ve 200/304 yanıtları arasındaki ayrımı özetler.

Bir kütüphanenin ana sayfasında bugünkü çalışma saatlerini değiştirdiğinizi, ancak bazı ziyaretçilerin hâlâ eski saatleri gördüğünü düşünün. Önce sunucudaki asıl içeriğin güncellenmemesi, tarayıcının sakladığı yanıtı yeniden kullanması ve aradaki bir sunucunun eski sürümü vermesi olasılıklarını ayırmak gerekir. Sayfayı birçok kez yenilemiş olmak, sorunun hangi aşamada bulunduğunu tek başına göstermez.

HTTP önbelleği, alınan yanıtları saklayıp koşullar uygun olduğunda yeniden kullanan bir mekanizmadır. Bu makale, herkese açık bir çalışma saatleri çizelgesi üzerinden kurulan varsayımsal örnekle Cache-Control saklama/doğrulama yönergelerini ETag ve 304 yanıtlarına bağlar. Aşağıdaki iletişim kayıtları açıklama amacıyla kısaltılmıştır; gerçek bir kütüphanede veya belirli bir sunucuda yapılmış ölçümler değildir. Amaç, bütün önbellekleri kaldırmayı önermekten çok hangi yanıtın ne zaman yeniden kullanılabilmesi gerektiğini açıklamaktır.

1. Saklamak, denetleyip kullanmak ve paylaşmak

Bir önbellek politikasını okurken üç soruyu ayrı yazın: Yanıt saklanabilir mi, saklanan kopya sonraki istekte doğrudan kullanılabilir mi ve birden fazla kullanıcıyla paylaşılabilir mi? Saklama izni, her zaman yeniden kullanım izni anlamına gelmez; güncelliğin denetlenmesi de başka kullanıcılarla paylaşımı uygun hâle getirmez. HTTP önbellekleme standardı RFC 9111, bu koşulları ayrı yönergelerle tanımlar. Burada, başlık alanı adlarının ayrıca argüman olarak verilmediği yanıt yönergeleri ele alınmaktadır.

Sorulacak soruİlgili yanıt yönergesiAyırt edilecek anlam
Yanıtın saklanması yasak mı?no-storeDaha sonra yeniden kullanmak üzere saklamayı yasaklayan yönerge
Yeniden kullanmadan önce denetim gerekli mi?no-cacheSaklanabilir, fakat yeniden kullanımdan önce başarılı doğrulama gerekir
Birden fazla kullanıcıyla paylaşılabilir mi?privatePaylaşılan önbellekte saklamayı engeller; özel önbellekte saklamayı bütünüyle yasaklamaz

Örneğin herkese açık saatleri aynı adreste sık sık değiştiriyorsanız, saklanan kopya bulunsa bile kullanmadan önce denetlenmesi gereksinimini değerlendirebilirsiniz. Kişiye özel ekranların paylaşım koşulları, herkese açık çizelgeninkinden farklıdır. private, paylaşılan önbelleğe ilişkin bir yönergedir; oturum açma ve yetki denetimlerinin yerine geçmez. Farklı amaçlara hizmet eden ayarları tek cümlede birleştirirseniz hızı iyileştirirken bilginin kimlere gösterileceğini yanlış belirleyebilirsiniz.

Politika tablosunda yalnızca yönergeyi değil, gerekçesini de kaydedin. Çizelgenin değişiklik denetimi gerektiren kamusal bilgi olup olmadığını, logonun içeriği sabit bir dosya olup olmadığını ve aynı adresten kişiselleştirilmiş bilgi sunulup sunulmadığını birlikte belirtin. Bu tablo bütün sitelere uygulanacak hazır bir yapılandırma değil, gerçek yanıtları sınıflandırmaya başlamanın bir yoludur. Tarayıcı veya CDN gibi hangi depoya uygulandığını da ayırmalısınız.

2. no-cache ile no-store arasında yalnızca ada bakarak seçim yapmayın

no-cache adını saklama yasağı gibi okumak kolaydır; oysa yanıttaki no-cache, saklanan kopyanın yeniden kullanılmadan önce doğrulanmasını ister. Sunucu değişiklik olmadığını doğrularsa saklanmış gövdeyi yeniden kullanmak mümkün olabilir. no-store ise bu yanıtın saklanmamasını isteyen yönergedir. Neyin tutulacağı ve sonraki istekte neyin denetleneceği farklı olduğundan iki ayarın aynı şekilde davranmasını beklemeyin.

Önbellekte fresh, politikanın ek doğrulama olmadan yeniden kullanıma izin verdiği durumu belirtir. Bu, işletmecinin o sırada içeriği değiştirmediğinin garantisi değildir. Yeniden kullanım süresi max-age ile belirlenmişse asıl içerik bu süre içinde değişse de önceden saklanan yanıt seçilmeye devam edebilir. Önce kabul edilebilir güncelleme gecikmesini belirleyip bu gereksinimi yönergeyle ilişkilendirin. Gelişigüzel uzun bir saklama süresini performans iyileştirmenin doğru cevabıymış gibi kopyalamayın.

MDN HTTP önbellekleme rehberi, yeni yanıta no-store eklemenin aynı URL için önceden saklanmış eski yanıtı silmediğini açıklar. Eski kopya hâlâ geçerliyse ve yeni yanıt için istek yapılmıyorsa yeni başlık da hiç ulaşmayabilir. no-store ifadesini bütün önbelleği temizleme komutu veya gizliliğin yeterli koşulu olarak görmeyin; mevcut yanıtların ömrünü ve yönetebildiğiniz önbelleklerin güncellenme sürecini de inceleyin.

3. ETag ve 304 ile bir yeniden ziyareti izlemek

Varsayımsal /hours.json adresinin başlangıçta kapanış saatini 18:00 olarak bildirdiğini düşünün. Aşağıdaki açıklayıcı HTTP/1.1 örneğinde yalnızca gerekli kısımlar tutulmuş, gerçek yanıtta gereken diğer başlıklar çıkarılmıştır. hours-v1, bu örnekte sunucunun seçtiği temsilin tanımlayıcısıdır; saat hesaplayan bir formül veya gerçek dosya özeti değildir.

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache
ETag: "hours-v1"

{"closes":"18:00"}

Tarayıcı bu yanıtı sakladıysa daha sonra ETag değerini koşullu isteğin If-None-Match başlığında gönderebilir. Sunucu, koşulun seçtiği güncel temsille eşleştiğini ve değişiklik olmadığını belirlerse 304 Not Modified ile yanıt verir. Aşağıdaki blok, isteği ve buna verilen yanıtı art arda gösteren kısaltılmış bir kayıttır. 304 sonrasında çizelge JSON gövdesinin yeniden gönderildiği bir örnek değildir.

GET /hours.json HTTP/1.1
Host: library.example
If-None-Match: "hours-v1"

HTTP/1.1 304 Not Modified
Cache-Control: no-cache
ETag: "hours-v1"

MDN ETag açıklamasında olduğu gibi istemci bu durumda saklanan gövdeyi kullanır. 304 yeni bir gövde içermez, fakat istek ve doğrulama için iletişim yine gerçekleşir. İşletmeci kapanış saatini 19:00 olarak değiştirmiş ve sunucunun temsili de değişmişse eski koşula karşı yeni gövdeyi ve yeni tanımlayıcıyı içeren bir 200 yanıtı beklenebilir. no-cache kullanmak, her seferinde 304 alınacağı veya veritabanı sorgusunun ortadan kalkacağı anlamına gelmez.

Denetlenecek şey tek başına durum kodundan çok içerikle tanımlayıcının uyumudur. İçerik değişmişken sunucu eski ETag değerini kullanmaya devam ederse doğrulama yanlış sonuç verebilir. Tersine, içerik aynı kaldığı hâlde tanımlayıcı sürekli değişirse gövde daha sık yeniden gönderilebilir. Üretim yöntemiyle seçilen temsil arasındaki ilişki sunucuda incelenmelidir; ETag bulunması tek başına uygulamanın doğru olduğunu kanıtlamaz.

4. Sık değişen belgeyi yeni adlı varlıktan ayırmak

İçeriği aynı URL altında değişen çizelge gibi belgelerle, içerik değiştiğinde yeni dosya adı verilen logo veya betikler farklı güncelleme stratejileri gerektirebilir. Örneğin logo.a1.png yerine logo.b2.png kullanılan bir tasarımda yeni belgenin yeni adrese başvurması gerekir. Dosya adına tanımlayıcı ekleyip sonra eski dosyanın içeriğini üzerine yazarsanız içerikle adresi birlikte yönetme sözünü bozmuş olursunuz.

Yeni dosyayı yüklemek, ziyaretçinin yeni adresi isteyeceği anlamına gelmez. Ziyaretçinin aldığı HTML hâlâ eski logo adresini gösteriyorsa eski varlık yeniden kullanılabilir. Bu yüzden yalnızca varlığın önbellek ayarına değil, ona başvuran belgenin güncellenme yoluna da bakın. Belgeyle varlığın saklama süresini aynı yapmak yerine her birinin ne kadar gecikmeyle değişebileceğini açıklayabilmelisiniz.

Dağıtım sırasında eski ve yeni belgeler kısa süre birlikte kullanılabilir. Yeni varlık hazır olmadan yeni belgeyi yayımlamak veya eski varlığı çok erken silmek ayrı arızalara yol açabilir. Bu varsayımsal örnekte hem yeni belgenin başvurduğu dosyaların varlığı hem eski belgenin başvurduğu dosyalara erişim denetlenebilir. Dosya adını değiştirmek önbellek tasarımının bir aracıdır; dağıtım sırası ve geri alma sorunlarının hepsini kendiliğinden çözmez.

5. Network panelinde her seferinde tek bir varsayımı sınamak

Doğrudan incelemeye başlarken önce önbelleğe izin verilen durumda bir başlangıç kaydı alın. Tam URL ve sorguyu, ekranda görünen çizelge sürümünü, yanıt durumunu, istekteki If-None-Match ile yanıttaki Cache-Control ve ETag değerlerini birlikte inceleyin. İstek ve yanıt başlıkları aynı ada sahip olsa bile farklı tarafların koşullarını belirtir; hangisini okuduğunuzu kaydedin. Chrome DevTools Network belgesi, bu öğelerin Headers bölümünde nasıl ayrılacağını açıklar.

Varsayımsal sınama durumuBirlikte incelenecek kayıtAceleyle çıkarılmaması gereken sonuç
Aynı çizelgeyi yeniden istemeKoşullu istek, durum, ekrandaki saat304 olduğuna göre hiç iletişim olmadı
Asıl saati değiştirip istek yapmaYeni gövde, ETag, gerçek istek URL’siKaydetme başarılı göründüğüne göre herkese yansıdı
Tarayıcı önbelleği kapalıyken istek yapmaİlk indirme ile olağan yeniden ziyaretin farkıBu sonuç normal yeniden ziyaret hızıyla aynıdır
Geri düğmesiyle dönmeYeni isteğin oluşup oluşmadığı ve geri yüklenen ekranEkran göründüğüne göre mutlaka yeni HTTP doğrulaması oldu

Ardından tarayıcı önbelleğini devre dışı bırakmayı ayrı bir koşul olarak deneyin. Chrome Disable cache ayarı, DevTools açık olduğu sürece uygulanır; bu nedenle aracın açık olup olmadığını ve ayar değerini birlikte kaydedin. Bu, ilk indirmeyi incelemek için yararlıdır; fakat olağan bir yeniden ziyarette saklanan kopyanın nasıl kullanıldığını sınamakla aynı değildir. Ayarı açtığınızı kaydetmezseniz sürekli yeni indirilen sonuçlara bakıp önbelleğin çalışmadığı sonucuna varabilirsiniz. Önbelleğin yeniden izinli olduğu koşula dönüp karşılaştırabilmek için deney koşullarını saklayın.

Gözlem sırasında birden fazla değişikliği ve isteği aynı anda yapmamak nedeni daraltmayı kolaylaştırır. Önce içeriği değiştirmeden yeniden ziyareti inceleyin, sonra saatlerden birini değiştirip yanıtın nasıl farklılaştığına bakın. Belge URL’si, sunucu ayarı ve dosya adı aynı anda değişirse hangi değişikliğin sonucu doğurduğunu ayırmak güçleşir. Beklenen 200 veya 304 gelmediyse yeni ayarlar eklemeden önce gerçek istek ve yanıtı yeniden okuyun.

6. Diğer saklama yollarını ve tamamlanma ölçütünü birlikte denetlemek

Tarayıcının HTTP önbelleğini devre dışı bırakmanın sunucunun önündeki CDN’yi veya uygulamanın diğer saklama yollarını da ortadan kaldırdığını varsaymayın. Bir service worker’ın isteği işleyip işlemediğini, aradaki sunucunun hangi yanıtı seçtiğini ve uygulamanın önceden aldığı veriyi ekranda tutup tutmadığını ayrı ayrı inceleyebilirsiniz. Aynı URL’nin görünmesi, bütün katmanların aynı kopyayı kullandığını göstermez.

Geri düğmesini de yeni HTTP isteğinden ayrı inceleyin. Tarayıcı önceki oturumun ekranını geri yüklediğinde no-cache bulunsa bile beklediğiniz yeniden doğrulama isteği görünmeyebilir. Bunu hemen sunucunun başlığı yok saydığına kanıt saymak yanlış nedene götürebilir. Yeni gezinme, yenileme ve geri dönüş için gerçekten istek oluşup oluşmadığını ayrı kaydetmek, farklı olayları tek sorun altında toplamayı önler.

Çizelge örneğinde tamamlanma ölçütü yalnızca önbellek isabet oranı değildir. İçerik değişmediğinde saklanan kopyadan doğru yararlanıldığını, değişiklikten sonra kabul edilen süre içinde yeni bilginin göründüğünü ve yanıtın doğru kullanıcı grubuyla paylaşıldığını denetleyin. Değişiklik zamanı, gözlem zamanı, koşullar ve gerçek gövde kaydedilirse başkaları aynı durumu daha kolay yeniden oluşturabilir. Hız değerleri iyileşmiş ama yanlış çalışma saatleri uzun süre görünmüşse asıl gereksinim karşılanmış değildir.

Üretime uygularken yanıt türlerine göre politikayı, güncelleme ve geri alma süreciyle birlikte inceleyin. Herkese açık belgenin önbellek yönergelerini kişiye özel yanıta kopyalamayın; doğrulamanın başarılı olmasını erişim yetkisi denetiminin de tamamlandığı şeklinde yorumlamayın. Başlıklar, saklama ve yeniden kullanım kurallarını ileten araçlardır. Neyin saklandığını ve hangi denetimlerden geçerek mevcut ekrana ulaştığını açıklayabildiğinizde eski ekran sorununu daha doğru teşhis edebilirsiniz.

Kanıtlar ve kaynaklar

Bu yazı kamuya açık kaynaklara dayanır. Bir kuruluşun kaynak gösterilmesi, yazıyı incelediği veya onayladığı anlamına gelmez.

Yayıncı hakkında ve iletişim

Aynı konudaki diğer yazılar