Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

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.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Shared hit

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. Üç 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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?

  1. Shared stale; private fresh.
  2. İ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}
  1. no-cache ve no-store aynı; saklama imkânsız.
  2. 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