WEB / WEB-12.03
Browser storage seçenekleri
Duru’nun okuma tercihi, açık sekmedeki taslağı, offline notları ve kapak cache’i aynı state değildir. Storage seçimi veri türünü, bekleme biçimini ve kayıp ihtimalini belirler.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Transaction commit
- Taslak memory’de
Duru yeni notu görüyor; henüz yerel commit yok. B sekmesi açılmadı.
- Sekme A / UI
- UI: unsaved draft
- Yerel IndexedDB
- Kayıt: previous note
- Sekme B
- Açılmadı
- Asynchronous write bekleniyor
Yerel API bir transaction içinde request planladı. Bu adım HTTP aktarımı değildir.
- Sekme A / UI
- UI: saving locally
- Yerel IndexedDB
- Transaction: pending; previous note committed
- Sekme B
- Açılmadı
- Request success, transaction pending
Request başarılı, fakat transaction sonucu henüz belli değil. UI saved durumuna geçmez.
- Sekme A / UI
- UI: saving locally
- Yerel IndexedDB
- Request success; transaction pending
- Sekme B
- Açılmadı
- Transaction complete
Transaction commit edildi. Yeni not yerel record’dur; server acceptance bu sahnede yok.
- Sekme A / UI
- UI: saving locally
- Yerel IndexedDB
- Committed: new note
- Sekme B
- Açılmadı
- UI yerel başarıyı gösterir
Complete sonucu işlendi; yalnız “yerel olarak kaydedildi” denebilir.
- Sekme A / UI
- UI: saved locally
- Yerel IndexedDB
- Committed: new note
- Sekme B
- Açılmadı
Transaction abort
- Önceki record korunuyor
Yeni taslak memory’de; eski not son committed record.
- Sekme A / UI
- UI: unsaved draft
- Yerel IndexedDB
- Committed: previous note
- Sekme B
- Açılmadı
- İlk request başarılı
İlk write success bildirse de aynı transaction’da ikinci değişiklik tamamlanmadı.
- Sekme A / UI
- UI: saving locally
- Yerel IndexedDB
- Request success; transaction pending
- Sekme B
- Açılmadı
- Transaction abort
Bu branch’te sonraki hata ele alınmadan transaction’ı abort eder; değişiklikler geri alınır.
- Sekme A / UI
- UI: saving locally
- Yerel IndexedDB
- Aborted; committed previous note
- Sekme B
- Açılmadı
- Taslak unsaved kalır
UI başarısızlığı işler; memory taslağı korunur ve yerel save iddiası yapılmaz.
- Sekme A / UI
- UI: unsaved; retry/export available
- Yerel IndexedDB
- Aborted; committed previous note
- Sekme B
- Açılmadı
Opener copy
- A’nın page session’ı
Bu case IndexedDB kullanmaz; sessionStorage başlangıç değeri A’da bulunur.
- Sekme A / UI
- sessionStorage: first draft
- Yerel IndexedDB
- Bu case’te kullanılmıyor
- Sekme B
- Açılmadı
- B opener ile açılır
Aynı origin’de opener ilişkisi korunmuştur. B başlangıç kopyasını alır; ağ transferi yoktur.
- Sekme A / UI
- sessionStorage: first draft
- Yerel IndexedDB
- Bu case’te kullanılmıyor
- Sekme B
- sessionStorage: first draft
- B kendi kopyasını değiştirir
B ikinci taslağı yazar. İki sessionStorage alanı canlı ortak record değildir.
- Sekme A / UI
- sessionStorage: first draft
- Yerel IndexedDB
- Bu case’te kullanılmıyor
- Sekme B
- sessionStorage: second draft
- A reload sonrası aynı değeri görür
Bu fixture’da A’nın page session’ı sürer; reload A’nın first draft değerini silmez.
- Sekme A / UI
- sessionStorage: first draft; reload survived
- Yerel IndexedDB
- Bu case’te kullanılmıyor
- Sekme B
- sessionStorage: second draft
ROLLER · STATE · VERİ AKIŞI
Verinin nerede yaşaması gerekiyor?
Atlas okuma uygulamasında tema tercihi küçük bir string’dir. Bir kitaba yazılan not ise başlık, metin ve güncelleme zamanı içeren bir record olabilir. Offline kapak, başka bir tür olan HTTP Response’dur. “Browser’da tutacağız” kararı bu farkları çözmez.
Bu API’ler cookie gibi eşleşen HTTP request’e kendiliğinden eklenmez. Uygulama gerektiğinde veriyi açıkça okur ve göndermeyi seçer. Browser’a yazılan not ile server’ın kabul ettiği notun ayrı durumu vardır; bu ders önce yerel depolamayı inceler.
localStorage: küçük, origin’e ait string state
localStorage key/value string saklar ve aynı origin’in sekmeleri ortak storage alanını kullanır. Origin scheme, host ve port ile belirlenir; HTTP ve HTTPS sürümleri aynı storage alanı sayılmaz. /books ile /profile gibi path’ler ayrı güvenlik bölmesi değildir.
Normal kullanımda veri Browser yeniden açıldığında kalabilir ve kendiliğinden bir expiry zamanı yoktur. Bu kalıcılık kullanıcı silmesine, privacy ayarlarına veya özel gezinme davranışına karşı garanti değildir. Tema gibi tekrar üretilebilen küçük tercih için uygundur; tek kopyası burada duran kritik belge için zayıf bir varsayımdır.
Web Storage çağrıları synchronous’tur. Büyük veri serileştirme ve sık yazma, JavaScript’in diğer işlerini geciktirebilir. JSON string’e çevirmek, API’yi transactional object database’e dönüştürmez.
sessionStorage: sekmeye ait, fakat her zaman boş başlamayan state
sessionStorage origin’e ve top-level browsing context’e, pratikte sekmeye göre ayrılır. Duru’nun A sekmesindeki form taslağını B sekmesiyle sürekli ortak tutmaz. Reload ve page restore sırasında aynı page session devam edebilir; sayfayı yenilemek storage’ı temizleme komutu değildir.
Yeni pencerenin opener’ı varsa sessionStorage başlangıçta opener’ın alanından kopyalanabilir. Sonra iki kopya bağımsızdır: B’de “ikinci taslak” yazmak A’daki “ilk taslak” değerini değiştirmez. Bu başlangıç kopyası, iki sekmenin ortak canlı state kullandığı anlamına gelmez. Opener ilişkisini kaldıran açılışta bu kopya beklentisi geçerli değildir.
Tab/window kapandığında page session sona erer. Buradaki “session”, uygulamanın authenticated session’ı değildir; server login kaydının ömrünü bu isimden çıkaramazsın.
IndexedDB: asynchronous record ve transaction
IndexedDB structured record’lar, object store’lar ve index’ler sunar; okuma/yazma asynchronous isteklerle gerçekleşir. Duru’nun offline kitap notları, tema string’inden daha doğal bir IndexedDB adayıdır. Desteklenen değerler structured clone kurallarıyla saklanır; her JavaScript nesnesinin davranışı olduğu gibi taşınmaz. Özellikle custom prototype chain ve property descriptor’lar kopyalanmaz; geri okunan record’un class method veya readonly davranışını korumasını bekleme. Veriyi açık alanlarla sakla, davranışı uygulama kodunda kur.
Bir write request’in success olayı, onu kapsayan transaction’ın tamamlandığı anlamına gelmez. Aynı transaction’ın sonraki işi hata verebilir ve abort bütün transaction değişikliklerini geri alabilir. UI “yerel olarak kaydedildi” durumunu transaction complete ile ilişkilendirmelidir; request success tek başına erken bir işarettir.
Transaction atomicity, birlikte yürütülen değişikliklerin commit/abort sınırıdır. Fiziksel diske kalıcı yazım garantisi ayrı bir konudur; Browser ve durability davranışı farklı olabilir. Transaction complete, verinin server’a gönderildiğini de söylemez.
Cache Storage: HTTP cache ile aynı mekanizma değil
Cache Storage named cache’ler üzerinden Request/Response çiftleri tutar. Uygulama offline kapak Response’unu bir cache’te saklayıp daha sonra seçebilir. Cache API window ve worker context’lerinde kullanılabilir; mutlaka bir service worker’ın içinde olması gerekmez. API secure context gerektirir.
Normal HTTP cache’in freshness kuralları ile Cache API’nin explicit yaşam döngüsünü ayır. Cache API, Cache-Control header’ından otomatik expiry kararı üretmez. Bir cover Response’unda max-age yazması, named cache entry’sinin süre dolunca kendiliğinden silineceğini söylemez; uygulama güncelleme ve temizleme politikasını kurmalıdır.
Cache’te match olmaması normal bir sonuç olabilir. Uygulama offline placeholder gösterebilir veya bağlantı varsa normal fetch yoluna geçebilir. Bir cache entry’si kalıcı kayıt ya da kullanıcı yetkisi yerine geçmez.
Kapasite ve privacy de veri akışının parçası
Browser storage sınırsız değildir. Yazma quota nedeniyle başarısız olabilir; IndexedDB ve Cache Storage’ın varsayılan best-effort verileri storage pressure altında evict edilebilir. Persistent storage talebi Browser’ın kararına bağlıdır ve kullanıcı silmesini önlemez. Her API ve Browser için tek bir evrensel kapasite sayısı kullanma.
Üçüncü taraf context’lerde storage erişimi privacy ve partitioning politikalarına bağlıdır. Kendi top-level origin’inde çalışan örneği bütün embedded context’lere genelleme. Bir erişim hatası, boş key veya cache miss ile aynı olay değildir.
Bir kayıp durumunda doğru ürün davranışı “başarı” bildirmek değil, yerel taslağı açıkça pending/unsaved göstermek ve kullanıcıya yeniden deneme ya da dışa aktarma seçeneği vermektir. Yerel state önemliyse server senkronizasyonu ve kayıp sınırları ayrıca tasarlanır.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Tab kopyası
- Yerel state sınıfı seçildi
sessionStorage örneği note-draft için iki tab’ın başlangıç değerini taşır. Sekmeye bağlı lifetime, veriyi bir secret vault veya doğrulanmış identity yapmaz.
- Browser storage
- Origin: https://atlas.example
- Yerel record
- Veri incelenmedi
- Tüketim sınırı
- Server yetkisi yok
- Verinin başlangıcı okundu
Opener ile açılan tab B, first draft değerinin başlangıç kopyasını alır. Tab A ve tab B’nin sonraki kayıtları tek ortak state değildir.
- Browser storage
- Origin: https://atlas.example
- Yerel record
- A: first draft; B: first draft
- Tüketim sınırı
- Server yetkisi yok
- Değişimin sınırı gösterildi
Tab B’de second draft yazılırken tab A first draft değerinde kalır. Başlangıç kopyası devamlı senkronizasyon ilişkisi değildir.
- Browser storage
- Origin: https://atlas.example
- Yerel record
- A: first draft; B: second draft
- Tüketim sınırı
- Server yetkisi yok
- Yerel veri yetki sayılmadı
Bu değerler browser’da çalışan script’lerin erişebildiği application girdileridir. Bir tercih veya notun bulunması, server’ın kullanıcıyı doğruladığını ya da resource izni verdiğini göstermez.
- Browser storage
- Origin: https://atlas.example
- Yerel record
- Yerel veri; authority değil
- Tüketim sınırı
- Kimlik ve policy ayrıca gerekir
- Tüketim kontrolü ayrıldı
Veri server’a sunulursa identity, iş alanları ve object/action policy orada değerlendirilir. Bu sahnede network gönderimi veya server kabulü gösterilmiyor.
- Browser storage
- Origin: https://atlas.example
- Yerel record
- İçerik data olarak tutulur
- Tüketim sınırı
- Server sonucu bilinmiyor
- Güven aktarımı durduruldu
Tab ayrımı ve clone davranışı kendi veri sınırlarını açıklar. Bağımsız taslaklar, tab B’nin değişikliği için tab A’da onay oluştuğunu kanıtlamaz.
- Browser storage
- Origin: https://atlas.example
- Yerel record
- Yerel veri sınırı açık
- Tüketim sınırı
- Authority üretilmedi
Data record
- Yerel state sınıfı seçildi
IndexedDB örneği book-17 için düz not verisi taşır. Storage API’nin adı veya origin sınırı, kaydı server açısından trusted authority yapmaz.
- Browser storage
- Origin: https://atlas.example
- Yerel record
- Veri incelenmedi
- Tüketim sınırı
- Server yetkisi yok
- Verinin başlangıcı okundu
Kaydın alanları bookId=book-17 ve note=A harmless reading draft’tır. Bu içerik not verisidir; artifact bir tenant veya role grant’i üretmez.
- Browser storage
- Origin: https://atlas.example
- Yerel record
- bookId=book-17; plain data
- Tüketim sınırı
- Server yetkisi yok
- Değişimin sınırı gösterildi
Structured clone düz veri alanlarını taşır; custom prototype chain ve property descriptor korunmuş sayılmaz. Function değerleri desteklenmez.
- Browser storage
- Origin: https://atlas.example
- Yerel record
- Prototype/descriptor korunmadı
- Tüketim sınırı
- Server yetkisi yok
- Yerel veri yetki sayılmadı
Bu değerler browser’da çalışan script’lerin erişebildiği application girdileridir. Bir tercih veya notun bulunması, server’ın kullanıcıyı doğruladığını ya da resource izni verdiğini göstermez.
- Browser storage
- Origin: https://atlas.example
- Yerel record
- Yerel veri; authority değil
- Tüketim sınırı
- Kimlik ve policy ayrıca gerekir
- Tüketim kontrolü ayrıldı
Veri server’a sunulursa identity, iş alanları ve object/action policy orada değerlendirilir. Bu sahnede network gönderimi veya server kabulü gösterilmiyor.
- Browser storage
- Origin: https://atlas.example
- Yerel record
- İçerik data olarak tutulur
- Tüketim sınırı
- Server sonucu bilinmiyor
- Güven aktarımı durduruldu
Tab ayrımı ve clone davranışı kendi veri sınırlarını açıklar. Prototype kaybı, kaydın güvenli veya izinli olduğu anlamına gelmez; doğrulama tüketim noktasında devam eder.
- Browser storage
- Origin: https://atlas.example
- Yerel record
- Yerel veri sınırı açık
- Tüketim sınırı
- Authority üretilmedi
VARSAYIM · SINIR · KONTROL
Storage adı, güvenlik sınırı değildir
Defensive review’da önce veriye hangi script’in erişebildiğini sor. localStorage, sessionStorage ve IndexedDB origin’de çalışan JavaScript için erişilebilir alanlardır; sekmeye ayrılmış olmak sessionStorage’ı secret vault yapmaz. Bir frontend bundle’a koyulan secret de istemciye teslim edilmiştir.
Session identifier veya uzun ömürlü bearer credential’ı localStorage’a yerleştirmeyi sıradan tercih verisiyle aynı karar sayma. OWASP bu kullanımın script erişimi riskini vurgular. HttpOnly cookie, JavaScript cookie API’sinden okunmayı sınırlar; uygulamanın bütün güvenlik sorunlarını çözmez ve Browser hâlâ eşleşen request’lerde cookie taşıyabilir.
Yerel kaydı input olarak değerlendir
Duru’nun bir not record’unda tenant veya role alanı bulunması, server’ın o alanı trusted authority kabul etmesi için gerekçe değildir. Yerel veri eski, bozuk veya kullanıcı tarafından değiştirilmiş olabilir. Security review server’ın bu veriyi nasıl doğruladığına odaklanır.
Cache review’da kişisel Response’un ortak bir cache key’e yanlış bağlanıp bağlanmadığını ve hesap değişiminde eski içeriğin gösterilip gösterilmediğini değerlendir. Bu dersin cache fixture’ı yalnız public cover içerir; kişisel içeriğin cache tasarımı ayrıca identity ve temizleme politikasını gerektirir.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Abort sonucu
- Write gözlemi seçildi
İnceleme IndexedDB not kaydının request-success aşamasından başlar. UI için memory’de veri bulunması ve storage transaction sonucu farklı durumlardır.
- Write kaydı
- book-17 write gözlemi
- Transaction incelemesi
- Completion incelenmedi
- UI hükmü
- Saved hükmü yok
- Request sonucu ayrıldı
Artifact request-success sırasında transaction=pending ve uiSaved=false gösterir. Tek request’in başarılı olması transaction’ın tamamını commit edilmiş saydırmaz.
- Write kaydı
- book-17 write gözlemi
- Transaction incelemesi
- request-success; pending
- UI hükmü
- uiSaved=false
- Son transaction kanıtı okundu
Bu branch’te transaction-abort kaydı vardır. transaction=aborted olur, oldRecord=previous note korunur ve uiSaved=false kalır.
- Write kaydı
- book-17 write gözlemi
- Transaction incelemesi
- transaction=aborted
- UI hükmü
- uiSaved=false
- Saved göstergesi sınırlandı
Abort nedeniyle yeni notun kalıcı olarak kaydedildiği söylenemez. Eski record’un korunması, yeni memory taslağının da kaybolduğu anlamına gelmez.
- Write kaydı
- book-17 write gözlemi
- Transaction incelemesi
- Commit yok
- UI hükmü
- Unsaved durumu korunur
- Selector beklentisi okundu
Ana XML fixture’da saved=true ve transaction!=committed birlikte olan kayıt sayısı 0’dır. Ayrı positiveFixtureXml bu tutarsızlığı bir satırla gösterir; ana branch’in sonucu değiştirilmez.
- Write kaydı
- book-17 write gözlemi
- Transaction incelemesi
- Ana count=0; positive=1
- UI hükmü
- Selector ile ürün sonucu ayrı
- Persistence hükmü korundu
Bu branch abort ve eski record’un korunmasını gösterir. Quota nedeni, kullanıcıya gösterilen uyarı ve server kabulü ayrıca kanıtlanmadan eklenmez.
- Write kaydı
- book-17 write gözlemi
- Transaction incelemesi
- Abort gözlendi
- UI hükmü
- Yeni kayıt commit olmadı
Request success
- Write gözlemi seçildi
İnceleme IndexedDB not kaydının request-success aşamasından başlar. UI için memory’de veri bulunması ve storage transaction sonucu farklı durumlardır.
- Write kaydı
- book-17 write gözlemi
- Transaction incelemesi
- Completion incelenmedi
- UI hükmü
- Saved hükmü yok
- Request sonucu ayrıldı
Artifact request-success sırasında transaction=pending ve uiSaved=false gösterir. Tek request’in başarılı olması transaction’ın tamamını commit edilmiş saydırmaz.
- Write kaydı
- book-17 write gözlemi
- Transaction incelemesi
- request-success; pending
- UI hükmü
- uiSaved=false
- Son transaction kanıtı okundu
Bu branch yalnız request-success aşamasını inceler; transaction-complete veya transaction-abort gözlemi verilmemiştir. Nihai sonuç eksik kanıt olarak kalır.
- Write kaydı
- book-17 write gözlemi
- Transaction incelemesi
- transaction=pending
- UI hükmü
- uiSaved=false
- Saved göstergesi sınırlandı
Completion bilinmediği için UI’a kalıcı kaydedildi sonucu verilmez. Pending gözlemi başarısızlık kanıtı da değildir; completion ayrıca gerekir.
- Write kaydı
- book-17 write gözlemi
- Transaction incelemesi
- Completion bilinmiyor
- UI hükmü
- Unsaved durumu korunur
- Selector beklentisi okundu
Ana XML fixture’da saved=true ve transaction!=committed birlikte olan kayıt sayısı 0’dır. Ayrı positiveFixtureXml bu tutarsızlığı bir satırla gösterir; ana branch’in sonucu değiştirilmez.
- Write kaydı
- book-17 write gözlemi
- Transaction incelemesi
- Ana count=0; positive=1
- UI hükmü
- Selector ile ürün sonucu ayrı
- Persistence hükmü korundu
Request başarısı bilinir; transaction sonucu UNKNOWN kalır. Memory, transaction commit ve server kabulü aynı “kaydedildi” sözcüğüne sıkıştırılmaz.
- Write kaydı
- book-17 write gözlemi
- Transaction incelemesi
- Request success gözlendi
- UI hükmü
- UNKNOWN: completion
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Storage kararını state türüne bağla
Küçük ve yeniden üretilebilir tercih için localStorage; sekmeye bağlı geçici taslak için sessionStorage; ilişkili structured offline record’lar için IndexedDB; uygulamanın yönettiği offline Response’lar için Cache Storage düşün. Bunlar zorunlu eşleştirmeler değil, lifetime ve veri modeli üzerinden gerekçelendirilen başlangıçlardır.
Başarı göstergesini ilgili boundary’ye bağla. Memory’de görünen taslak, IndexedDB transaction completion ve server acceptance ayrı durumlar olmalıdır. Kullanıcıya “kaydedildi” derken hangisini kastettiğini belirt.
Failure branch’i gerçek bir ürün durumu yap
Quota veya transaction abort için taslağı memory’de koru ve unsaved uyarısını sürdür. Cache miss’i normal fallback’e yönlendir. Browser storage’ın temizlenmiş olması uygulamanın yeni authenticated session üretmesi için gerekçe değildir.
İzole fixture’da opener’lı başlangıç kopyasını ve sonraki bağımsız yazmayı ayrı gözlemlerle kontrol et. IndexedDB kontrolünde tek request’i değil transaction’ın nihai sonucunu izle; gerekirse aynı transaction’daki iki değişiklikten birinin başarısız olduğu sentetik branch’i kullan.
Secret ve authority’yi azalt
Frontend’a server secret verme; session credential taşımasını ayrı threat model ile seç ve platformun session desteğini tercih et. Client storage’da saklanan her iş alanını server’da doğrula. Bir preference key’inin bulunması login kanıtı değildir.
Cache version ve purge politikası yaz, private içerik ile public asset’leri aynı varsayımla yönetme. Eviction ve erişim hatalarını secret içermeyen tür bilgisiyle izle; ham session credential veya kullanıcının not metni telemetry’ye gerekli değildir.
ŞİMDİ VAKAYA UYGULA
Yerel veri, bağımsız tab ve commit sonucu nasıl ayrılır?
Atlas not taslağı sessionStorage ve IndexedDB üzerinden farklı boundary’ler gösterir. Sahne yerel verinin authority olmamasını ve saved göstergesinin doğru completion kanıtını açıklar.
Vakadaki browser verisi hangi owner’ın state’idir? Bir client değerinin bulunması veya silinmesiyle server-side session sonucunun neden aynı şey olmadığını açıkla.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Atlas yerel state karar defteri
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"origin": "https://atlas.example",
"records": [
{
"api": "localStorage",
"key": "reading-theme",
"valueType": "string",
"value": "light",
"boundary": "origin; shared among its tabs",
"completion": "synchronous return; access may fail"
},
{
"api": "sessionStorage",
"key": "note-draft",
"valueType": "string",
"tabAInitial": "first draft",
"tabBWithOpenerInitial": "first draft",
"tabBEdited": "second draft",
"tabAAfterEdit": "first draft",
"boundary": "origin + top-level tab; initial opener copy only"
},
{
"api": "IndexedDB",
"store": "book-notes",
"record": {
"bookId": "book-17",
"note": "A harmless reading draft"
},
"stages": [
{
"event": "request-success",
"transaction": "pending",
"uiSaved": false
},
{
"event": "transaction-complete",
"transaction": "committed",
"uiSaved": true
}
],
"failureBranch": {
"event": "transaction-abort",
"transaction": "aborted",
"oldRecord": "previous note",
"uiSaved": false
},
"structuredCloneBoundary": {
"storedDataClass": "plain data fields",
"customPrototypeChainPreserved": false,
"propertyDescriptorsPreserved": false,
"functionValuesSupported": false
}
},
{
"api": "Cache Storage",
"cacheName": "public-covers-v1",
"request": "https://atlas.example/covers/book-17",
"responseClass": "public cover placeholder",
"responseCacheControl": "max-age=60",
"automaticCacheApiExpiry": false,
"missFallback": "offline placeholder"
}
],
"selector": {
"xml": "<storage><write event=\"request-success\" transaction=\"pending\" saved=\"false\"/><write event=\"transaction-complete\" transaction=\"committed\" saved=\"true\"/><write event=\"transaction-abort\" transaction=\"aborted\" saved=\"false\"/></storage>",
"xpath": "count(/storage/write[@saved=\"true\" and @transaction!=\"committed\"])",
"expected": 0,
"positiveFixtureXml": "<storage><write transaction=\"aborted\" saved=\"true\"/></storage>",
"positiveExpected": 1
}
}- boundary
- API’nin görünürlük kapsamı; authenticated authorization sınırı değildir.
- transaction / uiSaved
- Request success öncesi/sonrası değil, transaction sonucu üzerinden yerel başarı durumu.
- automaticCacheApiExpiry
- Cache-Control değerinden named cache expiry çıkarılamaz.
- selector
- İki sentetik XML üzerinde çalışan yerel tutarlılık sorgusu; Browser storage ölçümü değildir.
Top-level first-party origin varsayımıdır. Gerçek quota, disk flush, embedded privacy veya Browser storage API yürütmesi ölçülmedi. Cover ve record içerikleri inert placeholder’dır.
İki yanlış kanı
sessionStorage her yeni sekmede boş başlar ve reload ile temizlenir.
Opener varsa başlangıç kopyası olabilir; sonra alanlar bağımsızdır. Aynı page session reload ve restore sırasında devam edebilir.
IndexedDB request success veya Cache-Control max-age, verinin gerekli süre boyunca güvenle kaldığını kanıtlar.
IndexedDB için transaction sonucu ayrı, fiziksel durability ayrı konudur. Cache API Cache-Control’dan otomatik expiry üretmez; quota, eviction ve kullanıcı silmesi ayrıca ele alınır.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
IndexedDB request-success geldi, fakat transaction pending. UI saved gösterebilir mi?
- Evet. Her request success kalıcı transaction commit’tir.
- Hayır. saved için transaction-complete beklenir.
Gerekçeli cevabı oku
Hayır. saved için transaction-complete beklenir. — Request başarılı olsa da transaction daha sonra abort olabilir. Bu örnekte pending sırasında uiSaved=false kalır.
tabB, opener’dan ilk draft kopyasını aldı. tabB’de yapılan edit neden tabA’yı değiştirmiyor?
Dersten seçilen artifact alanları; öğretim örneği
- records[1]
- {"api":"sessionStorage","key":"note-draft","valueType":"string","tabAInitial":"first draft","tabBWithOpenerInitial":"first draft","tabBEdited":"second draft","tabAAfterEdit":"first draft","boundary":"origin + top-level tab; initial opener copy only"}
- sessionStorage kopyaları sonrasında tab’lar bağımsızdır.
- İlk kopya iki tab’ın sonsuza kadar aynı object’i paylaşmasını sağlar.
Gerekçeli cevabı oku
sessionStorage kopyaları sonrasında tab’lar bağımsızdır. — tabBEdited second draft, tabAAfterEdit first draft. Origin ve top-level tab sınırı korunur.
Public cover response’undaki max-age=60, Cache Storage entry’sini otomatik expire eder mi? Quota ve server state sınırlarını da açıkla.
Gerekçeli cevabı oku
Cache Storage, Request/Response object’lerini açıkça saklar; automaticCacheApiExpiry=false. Application eviction, version ve uygunluk policy’sini kendisi kurmalıdır. Quota veya erişim hataları olabilir. Yerel entry server session authority veya server record commit’i değildir. Offline placeholder, cache miss için seçilen fallback’tir; remote body’nin alındığını göstermez.
□ Cache API’yi otomatik HTTP freshness uygulayan mekanizma saymadım.
□ Yerel storage başarısını server commit saymadım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- MDN — Web Storage APIConcepts and usage · Determining storage access by a third party
- MDN — Window.localStorageDescription · Exceptions
- MDN — Window.sessionStorageValue: origin and top-level browsing context; opener copy; reload/restore; closing tab
- MDN — IndexedDB APIKey concepts and usage · Synchronous and asynchronous
- MDN — IDBTransactionTransaction failures · Firefox durability guarantees · Instance methods: abort · Events: complete
- MDN — CacheDescription: explicit update; HTTP caching headers; secure context · Instance methods: match
- MDN — Storage quotas and eviction criteriaDoes browser-stored data persist? · What happens when an origin fills its quota? · When is data evicted?
- OWASP — HTML5 Security Cheat SheetStorage APIs: Local Storage · Storage APIs: IndexedDB
- OWASP — Session Management Cheat SheetHttpOnly Attribute · Web Content Caching and Clear-Site-Data
- MDN — The structured clone algorithmThings that don't work with structured clone · Supported types