WEB / WEB-09.02
Browser ve shared HTTP cache
Cache bir kopyayı saklamanın yanında ne zaman yeniden kullanacağını seçer. Browser ve shared cache’i aynı response, açık clock ve ayrı policy kararlarıyla karşılaştır.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Shared hit
- Tekrar GET isteği
Duru aynı public target’ı ister. Shared entry’nin tam olduğu ve Vary context’inin eşleştiği başlangıç koşulu olarak verilmiştir.
- Browser / Duru
- GET ready
- Shared cache
- Copy stored; Age at receive12
- Origin / Atlas
- No new request
- Browser HTTP cache
- Same policy; lifetime60
- Request cache’e ulaştı
GET shared cache’e ulaşır; bu aşamada origin bu request’i henüz görmemiştir.
- Browser / Duru
- Waiting response
- Shared cache
- GET received; copy candidate
- Origin / Atlas
- No new request
- Browser HTTP cache
- Same policy; lifetime60
- Current age hesabı
UTC örneğinde initial age 14 ile resident time 10 toplanır: current_age 24’tür. Shared lifetime 30 olduğu için kopya fresh’tir.
- Browser / Duru
- Waiting response
- Shared cache
- Fresh: age24 < lifetime30
- Origin / Atlas
- No new request
- Browser HTTP cache
- Same age24 < lifetime60
- Cached 200 ulaştı
Shared cache sakladığı body’yi Age 24 ile gönderir; bu alışverişte origin’e gidiş dönüş yoktur.
- Browser / Duru
- 200 received; Çay; Age24
- Shared cache
- Served stored body; Age24
- Origin / Atlas
- No new request
- Browser HTTP cache
- Copy eligible; lifetime60
- Sınır zamanı seçildi
Saat 00:00:26 olduğunda resident time 16, age 30 olur. Local saatin ilerlemesi bir wire paketi değildir.
- Browser / Duru
- Last received Age24
- Shared cache
- age30 = shared lifetime30
- Origin / Atlas
- No new request
- Browser HTTP cache
- age30 < private lifetime60
- Ayrı reuse kararı
Shared entry artık fresh değildir ve s-maxage nedeniyle validation gerekir. Browser’ın private kopyası hâlâ fresh olabilir.
- Browser / Duru
- Displayed copy unchanged
- Shared cache
- Next shared reuse needs validation
- Origin / Atlas
- No new request
- Browser HTTP cache
- Private copy still fresh
Private copy
- Private response seçildi
Bu ayrı alışverişte origin private, max-age=60 döndürecektir; başlangıçta yeni response’un hiçbir kopyası yoktur.
- Browser / Duru
- GET ready
- Shared cache
- Empty for this exchange
- Origin / Atlas
- private response policy selected
- Browser HTTP cache
- Empty
- GET cache’e ulaştı
Shared cache request’i alır; kullanılabilir stored response olmadığı için origin’e forwarding hazırlanır.
- Browser / Duru
- Waiting response
- Shared cache
- GET received; miss
- Origin / Atlas
- No request yet
- Browser HTTP cache
- Empty
- GET origin’e ulaştı
İletilen request origin’e ulaşır. Response için private policy seçilmiştir ama response henüz client’a gelmemiştir.
- Browser / Duru
- Waiting response
- Shared cache
- Waiting origin
- Origin / Atlas
- GET received; 200 private ready
- Browser HTTP cache
- Empty
- Private 200 ulaştı
Shared cache response’u alır; field-name argument’i olmayan private nedeniyle yeni body’yi saklamaz.
- Browser / Duru
- Waiting response
- Shared cache
- 200 received; shared store=false
- Origin / Atlas
- 200 private ready
- Browser HTTP cache
- Empty
- Response browser’da
Private response browser’a iletilir; private cache’in saklama kararı şimdi local olarak verilebilir.
- Browser / Duru
- 200 received; Çay
- Shared cache
- Forwarded; shared store=false
- Origin / Atlas
- 200 private ready
- Browser HTTP cache
- Not yet stored
- Private kopya saklandı
Diğer storage eligibility kuralları bu örnekte uygundur; browser cache private kopyayı saklar.
- Browser / Duru
- 200 received; Çay
- Shared cache
- No copy stored
- Origin / Atlas
- Exchange complete
- Browser HTTP cache
- Private copy stored; lifetime60
Validation required
- Fresh no-cache kopyası
Browser’da no-cache, max-age=60 kopyası vardır. Age 24 ile fresh olsa da successful validation henüz yapılmamıştır.
- Browser / Duru
- GET intent
- Shared cache
- Not on selected direct path
- Origin / Atlas
- No request yet
- Browser HTTP cache
- Stored; age24; validated=false
- Local reuse kontrolü
Field-name argument’i olmayan no-cache, reuse’ı durdurur. Kopyayı saklamak ile yeniden kullanmak farklı kararlardır.
- Browser / Duru
- Validation request prepared
- Shared cache
- Not on selected direct path
- Origin / Atlas
- No request yet
- Browser HTTP cache
- Stored but cannot reuse
- Validation request’i ulaştı
Browser origin’e conditional GET gönderir; bu örnekte eşleşen request context’i ve validator başlangıç koşulu olarak verilmiştir.
- Browser / Duru
- Waiting validation
- Shared cache
- Not on selected direct path
- Origin / Atlas
- Conditional GET received
- Browser HTTP cache
- Stored but cannot reuse
- Yeni representation seçildi
Origin farklı bir representation seçtiği için tam 200 hazırlamıştır; eski body’nin kullanılmasını onaylamaz.
- Browser / Duru
- Waiting validation
- Shared cache
- Not on selected direct path
- Origin / Atlas
- 200 full replacement ready
- Browser HTTP cache
- Stored old copy
- Tam response ulaştı
Yeni 200 content browser’a ulaşır. 304 ile eski body’nin korunması WEB-09.03’te ayrıca gösterilir.
- Browser / Duru
- New 200 received; Atlas note
- Shared cache
- Not on selected direct path
- Origin / Atlas
- 200 full replacement ready
- Browser HTTP cache
- Stored old copy
- Local kopya değiştirildi
Saklanmaya uygun yeni response eski kopyanın yerini alır; no-cache nedeniyle sonraki reuse da validation ister.
- Browser / Duru
- Use newly received body
- Shared cache
- Not on selected direct path
- Origin / Atlas
- Exchange complete
- Browser HTTP cache
- New copy stored; next reuse validates
No-store response
- Policy değişimi
Bu alışverişte eski entry’den ayrı yeni bir origin response’u alınır; eski kopyanın silineceği garanti edilmez.
- Browser / Duru
- New GET ready
- Shared cache
- Old entry retained separately
- Origin / Atlas
- No request yet
- Browser HTTP cache
- Old entry retained separately
- GET origin’e ulaştı
Doğrudan GET origin’e ulaşır. no-store yeni response için seçilir; geçmişte saklanmış entry’leri silme işlemi değildir.
- Browser / Duru
- Waiting response
- Shared cache
- Old entry retained separately
- Origin / Atlas
- GET received; no-store policy
- Browser HTTP cache
- Old entry retained separately
- Yeni 200 hazırlandı
Origin yeni content’i no-store ile hazırlar. Bu cache policy, content’in şifreli olduğu anlamına gelmez.
- Browser / Duru
- Waiting response
- Shared cache
- Old entry retained separately
- Origin / Atlas
- 200 no-store ready
- Browser HTTP cache
- Old entry retained separately
- No-store response ulaştı
Browser response’u alır; bu response cache’e yazılamaz ve sonraki request’lerde yeniden kullanılamaz.
- Browser / Duru
- 200 no-store received
- Shared cache
- Old entry retained separately
- Origin / Atlas
- 200 no-store ready
- Browser HTTP cache
- Old entry retained separately
- Yeni kopya tutulmadı
Browser yeni response’u cache’e yazmaz; daha önce saklanan entry’nin otomatik silindiği de söylenmez.
- Browser / Duru
- Use immediate body
- Shared cache
- Old entry retained separately
- Origin / Atlas
- Exchange complete
- Browser HTTP cache
- New store=false; old entry retained
- Eski state ayrı tutuldu
Örnekte eski entry ayrı tutulur. Eski bir kopyanın daha sonra kullanılabilmesi ayrıca storage ve reuse kurallarına bağlıdır.
- Browser / Duru
- New response not reusable
- Shared cache
- No retroactive purge guarantee
- Origin / Atlas
- Exchange complete
- Browser HTTP cache
- No retroactive purge guarantee
ROLLER · STATE · VERİ AKIŞI
Kopya kimin için tutuluyor?
Duru aynı public Çay sayfasını tekrar açar. Browser HTTP cache tek kullanıcının request’leri için private cache olabilir; shared proxy veya CDN cache ise birden çok client’a hizmet verir. Service Worker Cache Storage farklı bir API ve store’dur. Burada HTTP cache’in neyi saklayıp ne zaman kullanabileceğini inceliyoruz. Shared olması, bir representation’ın her kullanıcıya uygun olduğu anlamına gelmez.
Bir response’u saklayabilmek ile onu bu request için yeniden kullanabilmek farklı kararlardır. Method ve status, target ve varsa Vary’nin seçtiği request alanları uygun olmalıdır. Saklanmış bir response bile policy veya freshness nedeniyle kullanılamayabilir. Örnekte public GET, tam body ve eşleşen Vary: Accept context’i vardır. Authenticated response ve partial representation bu başlangıç koşullarına dahil değildir.
Cache’in cevap vermesi, origin’in o anda request’i gördüğü anlamına gelmez. Fresh shared hit durumunda request proxy’ye ulaşır ve saklanmış response Duru’ya gönderilir. Browser kendi fresh kopyasını kullanıyorsa dışarıya request göndermesine bile gerek olmayabilir. Local lookup’ı network hop gibi çizmek bu farkı gizler.
HTTPS yolunda shared cache’in HTTP content’ini görebilmesi için güvenilen bir endpoint veya TLS termination düzeni gerekir. Opaque TLS tunnel’daki şifreli byte’ları taşıyan proxy, response body’yi okuyup cache kararı veremez. Atlas örneğinde shared endpoint’in decoded HTTP message’ı görebildiği başlangıç koşulu olarak verilmiştir. Bu sahne TLS termination’ını veya certificate doğrulamasını ayrıca çalıştırmaz.
Age sayacını nereden başlatıyoruz?
Saatleri sırayla okuyalım: Date 00:00:00, request_time 00:00:08, response_time 00:00:10 ve gelen Age 12 saniyedir. Hepsi aynı sentetik UTC günündedir. apparent_age = max(0, 10 − 0) = 10; response_delay = 10 − 8 = 2; corrected_age_value = 12 + 2 = 14 olur. Örnek, temkinli hesabı seçer: corrected_initial_age = max(10, 14) = 14. RFC, corrected_age_value’ın doğrudan kullanılmasına da izin verir; max biçimi her implementation için tek zorunlu formül değildir.
Saat 00:00:20 olduğunda response cache’te 10 saniyedir: resident_time = 20 − 10 = 10. Dolayısıyla current_age = 14 + 10 = 24 olur. Yalnız gelen Age 12’yi kullanmak, aktarımda ve cache’te geçen süreyi atlar. Response Date, uygulamadaki nesnenin son değişme zamanı değildir. Hesapta saatlerin eşzamanlı olduğu verilmiştir; gerçek clock drift ve resolution bu örneğin dışında kalır.
Cache-Control: public, max-age=60, s-maxage=30 için private browser cache’in freshness lifetime’ı 60, shared cache’inki 30 saniyedir. Lifetime, current_age’dan büyükse response fresh’tir. Saat 00:00:26’da age 30 olur: shared kopya artık fresh değildir, browser kopyası hâlâ fresh’tir. s-maxage, shared cache için max-age/Expires’ın önüne geçer ve stale reuse öncesinde validation ister. Burada stale response’u ayrıca kullanmaya izin veren bir extension yoktur.
Üç directive üç farklı karar verir
Field-name argument’i olmayan private, shared cache’in response’u saklamasını engeller; browser’ın private cache’i diğer kurallar uygunsa saklayabilir. Bu bir content encryption veya oturum isolation mekanizması değildir. Aynı biçimdeki no-cache ise saklamayı yasaklamaz: response’un yeniden kullanılması için request’in origin’e iletilmesi ve successful validation gerekir. Age’in lifetime’dan küçük olması bu zorunluluğu kaldırmaz.
no-store, bu request/response’un cache’te saklanmamasını ve sonraki request’leri karşılamak için kullanılmamasını ister. Aynı URL için daha önce saklanan response’u geriye dönük silme komutu değildir. Policy değiştiğinde eski kopyalar için invalidation veya validation stratejisi ayrıca gerekir. Örnekte önceki entry ayrı tutulur; yeni no-store response onun yerine yazılmaz.
Burada no-cache ve private, field-name argument’i olmadan kullanılır. Qualified biçimlerin daha dar kuralları vardır; onları bu örneğin sonucundan çıkaramayız. Directive’leri “kim saklar, kim kullanır, ne zaman doğrular?” sorularına bağla. HTTP cache’in kuralları, browser history veya back/forward cache’in bütün davranışını açıklamaz.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Storage scope
- Private directive cache türüne bağlandı
private, max-age=60 satırı sharedMayStore false, privateMayStore true verir. Browser private cache’in bu response’u tutması tek başına violation değildir. Private sözcüğü encryption veya user identity proof sağlamaz.
- Cache policy ledger
- Private: shared store false / private store true
- Store/reuse gate
- Decision bekliyor
- Recipient boundary
- Verdict yok
- Freshness storage eligibility’yi telafi etmedi
Shared cache için private response saklama koşulu false’tur; age sıfır olsa bile değişmez. Public Çay eligibility’sini personalized response’a kopyalamak yanlış recipient boundary kurar. Storage policy, süre hesabından önce kendi şartını korur.
- Cache policy ledger
- Private: shared store false / private store true
- Store/reuse gate
- Private shared storage disallowed regardless of age
- Recipient boundary
- Verdict yok
- Cache sınıflandırması permission kararı olmadı
Entry’nin fresh olması authentication, object permission veya representation selection’ın doğruluğunu kanıtlamaz. Application account state değişiklikleri bütün cache’leri otomatik düzeltmez; etkilenen representations ayrıca tanımlanmalıdır.
- Cache policy ledger
- Private: shared store false / private store true
- Store/reuse gate
- Private shared storage disallowed regardless of age
- Recipient boundary
- Fresh ≠ authorized recipient
- No-store yeni response’un policy’si olarak okundu
no-store satırı yeni response için shared ve private storage’ı false verir. retroactiveEraseGuaranteed false, priorEntryInLedgerRetained true’dur. Directive’i geçmişteki bütün copies’i silen komut gibi yorumlamak yanlıştır.
- Cache policy ledger
- No-store: new storage false / old entry retained
- Store/reuse gate
- Private shared storage disallowed regardless of age
- Recipient boundary
- Fresh ≠ authorized recipient
- Purge ile storage control ayrıldı
Bu response için reuseThisResponsePermitted false olur. Eski entry’nin retention’ı ayrı policy ve cache behavior sorusudur. no-store, browser history veya Service Worker state’inin bütünü için otomatik erase evidence sağlamaz.
- Cache policy ledger
- No-store: new storage false / old entry retained
- Store/reuse gate
- New response not reused / purge separate
- Recipient boundary
- Fresh ≠ authorized recipient
- Storage review doğru risk sınırında kaldı
Bu inert ledger policy anlamlarını ayırır; cross-user serving veya gerçek browser cache çalıştırılmaz. Confidentiality değerlendirmesi recipient, response classification ve gerçek store/reuse evidence ister. Directive adı tek başına bütün boundary’yi kanıtlamaz.
- Cache policy ledger
- No-store: new storage false / old entry retained
- Store/reuse gate
- New response not reused / purge separate
- Recipient boundary
- Policy meaning known / actual confidentiality unmeasured
Validation gate
- No-cache storage ile reuse’u ayırdı
no-cache, max-age=60 response’u shared ve private cache saklayabilir. reuseRequiresValidation true’dur. Entry’nin fresh lifetime içinde olması bu validation requirement’ı kaldırmaz; no-cache hiç saklama anlamına gelmez.
- Cache policy ledger
- May store / validation required before reuse
- Store/reuse gate
- Decision bekliyor
- Recipient boundary
- Verdict yok
- Validation tamamlanmadan reuse yapılmadı
validationCompleteSupplied false olduğunda reusePermitted false kalır. Freshness ve validation farklı gate’lerdir. Cache’in response’u saklaması origin’e danışma aşamasının başarılı olduğunu göstermez.
- Cache policy ledger
- May store / validation required before reuse
- Store/reuse gate
- Validation false / reuse false
- Recipient boundary
- Verdict yok
- Pending validation normal durum olarak tutuldu
Bu bekleme malicious cache davranışı veya application deny değildir. Review, origin round trip ve policy decision’ı ayrıca gözlemlemelidir. Timeout veya stale serving bu fixture’da enabled sayılmaz.
- Cache policy ledger
- May store / validation required before reuse
- Store/reuse gate
- Validation false / reuse false
- Recipient boundary
- Validation pending / stale serving not enabled
- Changed representation validation ledger’ına girdi
Stored tag atlas-v1 ve body Çay’dır. If-None-Match request’ine origin current atlas-v2 ve Atlas note ile 200 verir. Yeni response 10 byte content taşır; 304 gibi old body retain edilmez.
- Cache policy ledger
- Validation response 200 / atlas-v2 / Atlas note
- Store/reuse gate
- Validation false / reuse false
- Recipient boundary
- Validation pending / stale serving not enabled
- Replacement tag ve body birlikte güncellendi
Ledger cacheAfterTag atlas-v2 ve cacheAfterBody Atlas note verir. nextReuseRequiresValidation true kalır; bir başarılı validation no-cache policy’sini kalıcı olarak kaldırmaz. Store update ile sonraki reuse şartı ayrı kararlardır.
- Cache policy ledger
- Validation response 200 / atlas-v2 / Atlas note
- Store/reuse gate
- Cached v2/body replaced / next validation required
- Recipient boundary
- Validation pending / stale serving not enabled
- Normal validation application güveni sayılmadı
Bu public GET ledger’ı için store/reuse koşulları açıktır. Authenticated cache, production permission veya tüm dependency invalidation’ı ölçülmez. Correct cache policy, yanlış user/object authorization’ı telafi etmez.
- Cache policy ledger
- Validation response 200 / atlas-v2 / Atlas note
- Store/reuse gate
- Cached v2/body replaced / next validation required
- Recipient boundary
- Validation semantics known / authz separate
VARSAYIM · SINIR · KONTROL
Fresh olmak doğru kullanıcıya ait olmak değildir
Bir account summary saniyeler önce üretilmiş olabilir ama shared cache’te saklanması policy’ye aykırı olabilir. Cache’in age hesabının doğru olması identity, permission veya representation seçimlerinin doğru olduğunu kanıtlamaz. Hata koşulu personalized response’u public tea gibi kabul etmek ve reuse eligibility’yi yalnız süreye indirgemektir.
Etki yanlış recipient’a content sunulması veya eski policy ile bir ekranın kullanılması olabilir. Kontrol response classification, private/no-store gereksinimi ve seçilen representation context’ini beraber gözden geçirmektir. Authorization field içeren request’ler için shared reuse’ın ayrıca RFC kuralları vardır; credential’ın varlığını tek başına “asla cache olmaz” garantisi sayma.
Login/logout gibi application state değişikliği bütün ara cache’leri kendiliğinden doğru hale getirmez. Cache unsafe method için non-error 2xx/3xx response aldığında target invalidation uygular; bunun bütün bağımlı URL’leri ve browser görüntüsünü temizlediği sonucu çıkmaz. Policy’nin etkilediği representation’lar ürün sözleşmesinde belirlenmelidir.
Policy adlarını birbirinin yerine kullanma
no-cache’i hiç saklama, private’ı şifreli ve no-store’u geçmişi sil diye yorumlamak üç ayrı yanlış kabul üretir. Fresh no-cache entry’si validation olmadan reuse edilirse yanlıştır; private cache’te private entry bulunması tek başına ihlal değildir. Eski copy’nin no-store sonrası hâlâ var olması da directive’in retroaktif purge olmadığı sınırını gösterir.
Kontrol sadece response headers’i görmekten daha geniştir: store kararını ve sonraki normal request’te reuse kararını gözlemek gerekir. Bu ders inert policy ledger’ı üzerinden condition, consequence ve expected control’u açıklar. Cache poisoning, key collision veya üçüncü taraf target denemesi içermez; kişisel veri de kullanılmaz.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Age ledger
- Üç zaman noktası origin Date’ten ayrıldı
Buradaki zaman defterini örneğin hesaplayıcısı, validationRequired/validated/reused satırlarını ise sentetik gözlem fixture’ı üretir. Bunlar gerçek cache log’u değildir. Public hit dalında origin’e hiç request gitmez; private ve no-cache dallarındaki origin gözlemi ancak ilgili message ulaştığında vardır. Eksik response veya reuse kaydı, doğru davranışın kanıtı olmaz. Date 00:00:00, request time 00:00:08 ve response time 00:00:10’dur. Received Age 12 saniyedir. Response delay 2, apparent age 10 olarak bağımsız hesaplanır; Age business modification time değildir.
- Time/policy record
- Apparent age 10 / response delay 2 / received Age 12
- Age/validation review
- Decision bekliyor
- Evidence verdict
- Verdict yok
- Conservative initial age doğru input’larla hesaplandı
Corrected age value 12+2=14’tür. Seçilmiş conservative rule max(10,14) ile initial age 14 verir. Bu seçim verilmiş clock hesabıdır; drift, origin clock doğruluğu veya gerçek cache transit ölçülmez.
- Time/policy record
- Apparent age 10 / response delay 2 / received Age 12
- Age/validation review
- Corrected initial age max(10,14)=14
- Evidence verdict
- Verdict yok
- Resident time current age’e ayrıca eklendi
Now 00:00:20’de resident time 10 olur; currentAgeSeconds 24’tür. Shared hit Age 24 üretir. Received Age 12’yi değişmeden client’a taşımak elapsed residence’ı yok sayar.
- Time/policy record
- Resident 10 / current age 24 / hit Age 24
- Age/validation review
- Corrected initial age max(10,14)=14
- Evidence verdict
- Verdict yok
- Freshness cache türünün lifetime’ıyla karşılaştırıldı
public policy private lifetime 60, shared lifetime 30 verir. Age 24 ikisinde fresh’tir. Later now 00:00:26’da age 30 olur; equality noktasında sharedFresh false, privateFresh true kalır.
- Time/policy record
- Resident 10 / current age 24 / hit Age 24
- Age/validation review
- At age30: shared stale / private fresh
- Evidence verdict
- Verdict yok
- Eligibility varsayımları freshness hükmüne eşlik etti
Complete GET 200, matching target/Vary, no Authorization ve no stale extension verilmiştir. Hesap bu context’tedir. Fresh hit sonucunu authenticated request veya başka representation’a taşımak evidence scope’unu aşar.
- Time/policy record
- Resident 10 / current age 24 / hit Age 24
- Age/validation review
- At age30: shared stale / private fresh
- Evidence verdict
- Age known under supplied eligibility
- Clock regression gerçek runtime iddiası olmadı
Timestamp ve age hesabı yeniden üretilebilir; gerçek browser/proxy cache çalışması değildir. Store type, selecting fields ve current age birlikte kontrol edilir. Tek Age field’ı privacy veya authorization verdict’i üretmez.
- Time/policy record
- Resident 10 / current age 24 / hit Age 24
- Age/validation review
- At age30: shared stale / private fresh
- Evidence verdict
- Arithmetic reproducible / runtime unmeasured
Validation gap
- Selector required validation kararını seçti
Buradaki zaman defterini örneğin hesaplayıcısı, validationRequired/validated/reused satırlarını ise sentetik gözlem fixture’ı üretir. Bunlar gerçek cache log’u değildir. Public hit dalında origin’e hiç request gitmez; private ve no-cache dallarındaki origin gözlemi ancak ilgili message ulaştığında vardır. Eksik response veya reuse kaydı, doğru davranışın kanıtı olmaz. Normal XML validationRequired true, validated false ve reused false bildirir. Bu authored observation no-cache gate’iyle tutarlıdır. XML field’ları gerçek cache ürünü log schema’sı olarak sunulmaz.
- Time/policy record
- Required=true / validated=false / reused=false
- Age/validation review
- Decision bekliyor
- Evidence verdict
- Verdict yok
- Normal ve positive control aynı predicate’i sınadı
Normal count sıfırdır. Positive XML validated false iken reused true verir ve bir match üretir. Bu kontrol, violation observation’ını seçebilen oracle’ı sınar; gerçek cache violation’ın oluştuğunu söylemez.
- Time/policy record
- Required=true / validated=false / reused=false
- Age/validation review
- Normal 0 / positive control 1
- Evidence verdict
- Verdict yok
- Missing reuse event zero match verebilir
Alternatif review’de reuse decision observation’ı yoktur. Selector mevcut tutarsız row bulmayabilir. Normal fixture’ın reused false değerini eksik event yerine kopyalamak gerçek coverage boşluğunu gizler.
- Time/policy record
- Reuse observation absent
- Age/validation review
- Normal 0 / positive control 1
- Evidence verdict
- Verdict yok
- Store evidence validation evidence yerine geçmedi
Entry’nin cache’te mevcut olması validation’ın tamamlandığını söylemez. Origin response, seçilmiş candidate ve next reuse policy ayrı görülmelidir. Pending validation’ın nedenini yalnız missing row’dan çıkarmak doğru değildir.
- Time/policy record
- Reuse observation absent
- Age/validation review
- Stored entry ≠ validation completed
- Evidence verdict
- Verdict yok
- Reuse correctness unknown kaldı
Validation ve reuse coverage tamamlanmadan correctness verdict UNKNOWN kalır. Missing event, clean cache veya malicious serving kanıtı değildir. Required policy ile gerçek observation kaynakları birbirinden ayrılır.
- Time/policy record
- Reuse observation absent
- Age/validation review
- Stored entry ≠ validation completed
- Evidence verdict
- UNKNOWN: validation/reuse coverage
- Yeni evidence minimum context’e sınırlandı
İlerlemek için policy class, seçilmiş entry, validation outcome ve reuse decision gerekir. Full content veya credential toplamak zorunlu değildir. Normal hit ve origin round trip ayrı observation olarak değerlendirilir.
- Time/policy record
- Reuse observation absent
- Age/validation review
- Stored entry ≠ validation completed
- Evidence verdict
- Needed: policy/entry/validation/reuse scope
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Zaman defterini yeniden hesapla
Buradaki zaman defterini örneğin hesaplayıcısı, validationRequired/validated/reused satırlarını ise sentetik gözlem fixture’ı üretir. Bunlar gerçek cache log’u değildir. Public hit dalında origin’e hiç request gitmez; private ve no-cache dallarındaki origin gözlemi ancak ilgili message ulaştığında vardır. Eksik response veya reuse kaydı, doğru davranışın kanıtı olmaz. Manual exercise’de önce Date, request_time, response_time, received Age ve now alanlarını bul. Apparent age ve response delay’i bağımsız hesapla; selected conservative initial age’i neden 14 seçtiğini söyle. now 20 ve 26 noktalarında resident_time ve current_age’i ayrı yaz. Tek Age header’ını kopyalayarak sonucu tahmin etme.
Sonra cache türünü seç. Shared için 30, browser için 60 lifetime kullan; equality noktasında fresh false olduğunu karşılaştır. Cache stored response’u validation olmadan gönderdiğinde Age’i current_age’a göre üretir; sahnede Duru’nun aldığı Age 24’tür. Entry’nin saklandığı andaki Age 12’yi ileri taşımak doğru current observation olmaz.
Selector validationRequired=true ama validated=false ve reused=true olan authored observation’ı seçer. Normal fixture 0, positive fixture 1 verir; eksik event 0 olsa bile reuse kontrolü yapılmış sayılmaz. Bu XML bir cache ürünü log schema’sı değildir; gerçek cache kararı için request/response ve zaman context’i gerekir.
Store ve reuse için ayrı kabul ölçütü yaz
Public branch’te eligible ve fresh copy’nin origin’e gitmeden servis edilmesini bekle. Private branch’te shared store false, browser store true seçimini kontrol et. no-cache branch’te response’un tutulabildiğini ama origin validation tamamlanmadan reuse yapılamadığını not et. no-store branch’te yeni response’un tutulmadığını; eski entry için genel purge garantisi olmadığını yaz.
Cache davranışını değerlendirirken normal hit, origin round trip ve policy değişikliği ayrı gözlemler olsun. Ağ kesikken stale serving başka kurallara bağlıdır; burada bu yolu enabled saymıyoruz. WEB-09.03 validator ve 304 üzerinden başarılı validation’ın body’yi nasıl koruduğunu açar. Bu dersteki policy ledger gerçek browser/proxy cache çalıştırması değildir.
Handler, response’un kime ait olduğuna ve nasıl kullanılacağına göre Cache-Control üretmelidir. Kişiselleştirilmiş content yalnız o client’ın cache’inde saklanacaksa private seç; cookie bulunmasına güvenerek shared cache’in kendiliğinden bunu anlayacağını varsayma. Yeni response’un hiçbir cache’te saklanmaması gerekirse no-store, her reuse öncesi origin doğrulaması gerekirse no-cache farklı kararlardır. Public Çay örneğinin policy’sini kişisel verilere aynen taşımak yerine store ve reuse beklentilerini ayrı doğrula.
ŞİMDİ VAKAYA UYGULA
Freshness, private/no-cache/no-store ve validation hangi ayrı kararları üretir?
Çay response’unun age’i UTC defterinde 24 saniyedir. Shared lifetime 30, private lifetime 60 saniye olur; age 30’a gelince sonuçlar ayrılır. Private storage, no-cache validation ve no-store retention farklı koşullarla değerlendirilir.
Vakadaki representation hangi cache owner’dan geliyor? Key kapsamı, freshness ve kullanıcının context’ini birlikte değerlendir; hit olması doğru viewer’a ait olduğunu kanıtlamaz.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Cache policy ve UTC age defteri
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"target": "https://library.atlas.example/tea?view=plain",
"representation": {
"content": "Çay",
"contentOctets": 4,
"vary": "Accept",
"originalRequestAccept": "text/plain"
},
"clock": {
"date": "2026-10-08T00:00:00Z",
"requestTime": "2026-10-08T00:00:08Z",
"responseTime": "2026-10-08T00:00:10Z",
"receivedAgeSeconds": 12,
"now": "2026-10-08T00:00:20Z",
"apparentAgeSeconds": 10,
"responseDelaySeconds": 2,
"correctedAgeValueSeconds": 14,
"selectedInitialAgeRule": "conservative max(apparent_age, corrected_age_value)",
"correctedInitialAgeSeconds": 14,
"residentTimeSeconds": 10,
"currentAgeSeconds": 24
},
"publicPolicy": {
"cacheControl": "public, max-age=60, s-maxage=30",
"privateLifetimeSeconds": 60,
"sharedLifetimeSeconds": 30,
"sharedFreshNow": true,
"privateFreshNow": true,
"sharedHitGeneratedAge": 24,
"laterNow": "2026-10-08T00:00:26Z",
"laterResidentSeconds": 16,
"laterCurrentAgeSeconds": 30,
"laterSharedFresh": false,
"laterPrivateFresh": true
},
"policies": [
{
"id": "private",
"cacheControl": "private, max-age=60",
"sharedMayStore": false,
"privateMayStore": true,
"reuseRequiresValidation": false
},
{
"id": "no-cache",
"cacheControl": "no-cache, max-age=60",
"sharedMayStore": true,
"privateMayStore": true,
"reuseRequiresValidation": true,
"validationCompleteSupplied": false,
"reusePermitted": false
},
{
"id": "no-store",
"cacheControl": "no-store",
"sharedMayStore": false,
"privateMayStore": false,
"reuseThisResponsePermitted": false,
"retroactiveEraseGuaranteed": false,
"priorEntryInLedgerRetained": true
}
],
"eligibilitySupplied": {
"completeGet200": true,
"targetAndVaryMatch": true,
"requestAuthorizationAbsent": true,
"noStaleExtensionEnabled": true,
"noQualifiedFieldNameDirectives": true
},
"selector": {
"language": "XPath",
"xml": "<observations><reuse validationRequired=\"true\" validated=\"false\" reused=\"false\"/></observations>",
"xpath": "count(/observations/reuse[@validationRequired=\"true\" and @validated=\"false\" and @reused=\"true\"])",
"expected": 0,
"positiveFixtureXml": "<observations><reuse validationRequired=\"true\" validated=\"false\" reused=\"true\"/></observations>",
"positiveExpected": 1,
"scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
"missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
},
"validationExchange": {
"storedBeforeTag": "\"atlas-v1\"",
"storedBeforeBody": "Çay",
"requestHeader": {
"If-None-Match": "\"atlas-v1\""
},
"originCurrentTagSupplied": "\"atlas-v2\"",
"originCurrentBodySupplied": "Atlas note",
"responseStatus": 200,
"responseBody": "Atlas note",
"responseContentOctets": 10,
"responseCacheControl": "no-cache, max-age=60",
"cacheAfterTag": "\"atlas-v2\"",
"cacheAfterBody": "Atlas note",
"nextReuseRequiresValidation": true
}
}- clock
- Response’un origin/cache transit/local residence hesabı; business modification time değil.
- publicPolicy
- Aynı age için private60/shared30; equality shared fresh false.
- policies
- Store, validation ve reuse birbirinden ayrı kararlar.
- priorEntryInLedgerRetained
- no-store sonrası eski entry’nin otomatik silindiğini varsaymayan öğretim state’i.
Clocks, store eligibility ve policy engine authored/supplied. Browser history, Service Worker, gerçek proxy, drift, stale extensions ve authenticated cache sonucu ölçülmez.
İki yanlış kanı
no-cache varsa response cache’te bulunamaz.
Saklanabilir; unqualified no-cache başarılı origin validation olmadan sonraki request için reuse edilmesini engeller.
no-store geldiğinde eski bütün kopyalar silinir; Age yalnız header’daki sayıdır.
no-store retroaktif purge değildir. current_age received Age yanında response delay ve local residence hesabını da içerir.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
currentAge=30; shared lifetime=30, private lifetime=60. Hangi cache fresh?
- Shared stale; private fresh.
- İkisi de fresh. Eşitlik bir ek saniye sağlar.
Gerekçeli cevabı oku
Shared stale; private fresh. — Shared age lifetime’a eşittir, bu yüzden fresh değildir. Private lifetime henüz tüketilmemiştir.
no-cache response saklanabiliyor. Neden reusePermitted=false?
Dersten seçilen artifact alanları; öğretim örneği
- policies[1]
- {"id":"no-cache","cacheControl":"no-cache, max-age=60","sharedMayStore":true,"privateMayStore":true,"reuseRequiresValidation":true,"validationCompleteSupplied":false,"reusePermitted":false}
- no-cache ve no-store aynı; saklama imkânsız.
- Başarılı validation henüz verilmemiş.
Gerekçeli cevabı oku
Başarılı validation henüz verilmemiş. — no-cache saklama yasağı değildir. reuseRequiresValidation=true ve validationCompleteSupplied=false olduğu için reuse kapalıdır.
Apparent age=10, alınan Age=12, response delay=2, residence=10. Current age neden 24? Age=12 neden yetmez?
Gerekçeli cevabı oku
Corrected age value 12+2=14 olur. Bu örneğin hesabında initial age=max(10, 14)=14; residence 10 eklenince current age=24. Age header’ının alındığı andaki değeri güncel age saymak, cache içinde geçen süreyi atlar. Bunlar verilen clock değerleriyle yapılan hesaptır; gerçek cache timer ölçümü değildir.
□ Response delay ve residence değerlerini hesaba kattım.
□ Clock hesabını gerçek runtime ölçümü saymadım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- RFC 9111 — HTTP Caching1 Introduction · 3 Storing Responses in Caches · 3.2 Updating Stored Header Fields · 3.5 Storing Responses to Authenticated Requests · 4 Constructing Responses from Caches · 4.1 Calculating Cache Keys with the Vary Header Field · 4.2 Freshness · 4.2.1 Calculating Freshness Lifetime · 4.2.3 Calculating Age · 4.3.3 Handling a Validation Response · 4.3.4 Freshening Stored Responses upon Validation · 4.4 Invalidating Stored Responses · 5.2.2.4 no-cache · 5.2.2.5 no-store · 5.2.2.7 private · 5.2.2.10 s-maxage
- MDN — HTTP cachingPrivate caches · Shared cache · Fresh and stale based on age · Provide up-to-date content every time · Validation