WEB / WEB-12.01
Cookie ile HTTP’ye state eklemek
Bir dil tercihini Set-Cookie’den Browser jar’a ve sonraki Cookie header’a kadar izleyerek state’in nerede taşındığını anla.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Preference cookie taşınıyor
- İlk request’te preference yok
Cookie jar bu örnekte boş. Browser library.outreason.example/books için request hazırlıyor. Dil veya view seçimi bir authentication sonucu değildir.
- Browser · cookie jar
- Jar: boş
- Application · HTTP handler
- Request henüz yok
- Request · context
- HTTPS · /books · same-site
- İlk HTTP request ulaştı
Bu request Cookie preference alanı taşımıyor. Application kendi default dil ve görünümünü kullanabilir. Cookie yokluğu bir transport hatası değildir.
- Browser · cookie jar
- Response bekliyor
- Application · HTTP handler
- Cookie yok → en / comfortable
- Request · context
- İlk GET alındı
- Response cookie alanlarını kurar
Application iki ayrı Set-Cookie response field hazırlar: hd_language=tr; Path=/ ve hd_view=compact; Path=/. Bu tercih değerleri bir session identity değildir.
- Browser · cookie jar
- Jar hâlâ boş
- Application · HTTP handler
- İki Set-Cookie hazır
- Request · context
- Response bekliyor
- Cookie response browser’a ulaştı
Browser kendi cookie işlemesini yapacak headers’ı aldı. Set-Cookie frontend fetch response headers API’sinden okunabilen sıradan bir header değildir.
- Browser · cookie jar
- Headers geldi; storage ayrı
- Application · HTTP handler
- Set-Cookie response gönderildi
- Request · context
- Response headers geldi
- Jar browser’ın local state’idir
Bu kontrollü örnekte browser iki cookie’yi kabul eder; Domain verilmediğinden host-only ve Path=/ metadata’sı jar’a aittir. Acceptance genel bir browser garantisi değildir.
- Browser · cookie jar
- Jar: hd_language / hd_view
- Application · HTTP handler
- Sonraki request gelmedi
- Request · context
- Host-only · Path=/
- Sonraki request adayları seçer
Aynı host/path bağlamında adaylar bu fixture’da eligible. Request Cookie alanına yalnız name=value çiftleri konur; Path attribute request’e kopyalanmaz.
- Browser · cookie jar
- Cookie: hd_language=tr; hd_view=compact
- Application · HTTP handler
- Request henüz gelmedi
- Request · context
- GET /books hazırlanıyor
- Sonraki request application’da
Cookie request alanı name/value taşır. Server response attribute’larını bu alanın içinde görmez; uygulama desteklediği preference değerlerini doğrular ve diğer durumda default seçer.
- Browser · cookie jar
- Response bekliyor
- Application · HTTP handler
- Preference: tr / compact
- Request · context
- GET + Cookie name=value
- Preference, principal değildir
Application görünümü seçer. Cookie inclusion ne verified identity ne resource permission kanıtıdır; session ve authorization modelleri sonraki kararları ayrıca gösterir.
- Browser · cookie jar
- UI tercihi hazırlanabilir
- Application · HTTP handler
- tr / compact; authn kurulmadı
- Request · context
- Bu request gözlemi tamamlandı
Preference yok
- İlk request’te preference yok
Cookie jar bu örnekte boş. Browser library.outreason.example/books için request hazırlıyor. Dil veya view seçimi bir authentication sonucu değildir.
- Browser · cookie jar
- Jar: boş
- Application · HTTP handler
- Request henüz yok
- Request · context
- HTTPS · /books · same-site
- İlk HTTP request ulaştı
Bu request Cookie preference alanı taşımıyor. Application kendi default dil ve görünümünü kullanabilir. Cookie yokluğu bir transport hatası değildir.
- Browser · cookie jar
- Response bekliyor
- Application · HTTP handler
- Cookie yok → en / comfortable
- Request · context
- İlk GET alındı
- Response cookie alanlarını kurar
Application iki ayrı Set-Cookie response field hazırlar: hd_language=tr; Path=/ ve hd_view=compact; Path=/. Bu tercih değerleri bir session identity değildir.
- Browser · cookie jar
- Jar hâlâ boş
- Application · HTTP handler
- İki Set-Cookie hazır
- Request · context
- Response bekliyor
- Cookie response browser’a ulaştı
Browser kendi cookie işlemesini yapacak headers’ı aldı. Set-Cookie frontend fetch response headers API’sinden okunabilen sıradan bir header değildir.
- Browser · cookie jar
- Headers geldi; storage ayrı
- Application · HTTP handler
- Set-Cookie response gönderildi
- Request · context
- Response headers geldi
- Jar browser’ın local state’idir
Bu kontrollü örnekte browser iki cookie’yi kabul eder; Domain verilmediğinden host-only ve Path=/ metadata’sı jar’a aittir. Acceptance genel bir browser garantisi değildir.
- Browser · cookie jar
- Jar: hd_language / hd_view
- Application · HTTP handler
- Sonraki request gelmedi
- Request · context
- Host-only · Path=/
- Sonraki request adayları seçer
Bu alternatif fixture’da sonraki request preference taşımıyor: kullanıcı temizlemiş veya browser state’i taşımamış olabilir. Application yalnız bu request’te cookie yokluğunu gözler; nedenini uydurmaz.
- Browser · cookie jar
- Sonraki request: Cookie yok
- Application · HTTP handler
- Request henüz gelmedi
- Request · context
- GET /books hazırlanıyor
- Sonraki request application’da
Cookie request alanı name/value taşır. Server response attribute’larını bu alanın içinde görmez; uygulama desteklediği preference değerlerini doğrular ve diğer durumda default seçer.
- Browser · cookie jar
- Response bekliyor
- Application · HTTP handler
- Default: en / comfortable
- Request · context
- GET + no preference Cookie
- Preference, principal değildir
Application görünümü seçer. Cookie inclusion ne verified identity ne resource permission kanıtıdır; session ve authorization modelleri sonraki kararları ayrıca gösterir.
- Browser · cookie jar
- UI tercihi hazırlanabilir
- Application · HTTP handler
- en / comfortable; authn kurulmadı
- Request · context
- Bu request gözlemi tamamlandı
ROLLER · STATE · VERİ AKIŞI
Sayfa dilini ikinci request nasıl hatırlar?
Duru, Atlas kitaplığının dili için Türkçe ve görünümü için compact seçer. Bir sonraki sayfa aynı tercihleri göstermelidir. HTTP’nin stateless olması uygulamanın hafıza tutamayacağı anlamına gelmez; request’in anlamı bir önceki mesajın hangi bağlantıda geldiğine dayanmaz. Uygulama devamlılığı, sonraki request’e eklenen veri ve application state ile kurar.
Cookie bu devamlılık için Browser tarafından yönetilen küçük bir name/value kaydıdır. Bu örnekte hd_language=tr ve hd_view=compact yalnız görünüm tercihidir. Login yapılmaz; iki tercih bir kullanıcı kimliğini kanıtlamaz. Böylece state kurmak ile authentication kurmak arasındaki farkı baştan görebiliriz.
Set-Cookie: server’ın önerisi Browser’a gelir
Application Duru’nun seçimini işler ve response’a iki ayrı Set-Cookie field ekler. Birincisi hd_language=tr; Path=/, ikincisi hd_view=compact; Path=/ içerir. Her biri farklı cookie kaydı içindir. İki Set-Cookie field’ını tek comma-separated listeye dönüştürmek doğru genel birleştirme yöntemi değildir.
Response yoldayken Application tercih sonucunu hazırlamıştır, Browser jar henüz değişmemiştir. Response arrival’dan sonra Browser cookie policy’sine göre kaydı kabul eder, saklar veya reddeder. Set-Cookie göndermek ile jar’da cookie görmek ayrı aşamalardır. Cookie scope/lifetime ayrıntıları WEB-12.02’de açılır; burada aynı host, Path=/ ve izin veren Browser policy’si seçilmiştir.
Cookie: Browser’ın sonraki request için yaptığı seçim
Duru kitap listesine geçince Browser uygun kayıtları seçer ve request’e Cookie: hd_language=tr; hd_view=compact ekler. Bu field’daki semicolon iki name/value çiftini ayırır. Set-Cookie’deki Path=/ gibi attributes request Cookie field’ında tekrar listelenmez.
Bu, response’u geri göndermek değildir. Browser jar’dan request bağlamına uygun state’i serialize eder. Mevcut jar’da başka sitenin cookie’si bulunması onun da bu request’e eklendiğini göstermez. Gönderim seçimi host, path, süre ve policy koşullarına bağlıdır; HTTP connection’ın tekrar kullanılması cookie seçiminin yerine geçmez.
Server bu veriyi yeniden yorumlar
Application ikinci request’te iki tercihi parse eder. Modelin allowed language kümesi tr/en, allowed view kümesi compact/comfortable’dır. Geçerli çiftler response görünümünü etkiler. Cookie yoksa application kendi default’u olan en/comfortable ile devam eder. Her iki sonucun da nedeni aynı endpoint sözleşmesinde tanımlıdır.
Cookie value client’tan gelen veridir. Browser’ın önce server’dan almış olması, server’ın sonraki request’te gelen değeri her durumda güvenilir saymasına izin vermez. Bu örnekte seçimi sınırlı bir preference olarak kabul ediyoruz; role, tenant veya kitap sahipliği cookie’deki serbest metinden kurulmaz.
Cookie mekanizması ile kullanılan state biçimini ayır
Bir cookie doğrudan language gibi bir preference tutabilir veya server’daki kayda işaret eden opaque handle taşıyabilir. İkinci biçimde büyük state Cookie header’ın içinde değildir; handle application’a hangi kaydı değerlendireceğini söyler. WEB-13.01 bu ayrımı session örneğinde işler.
Cookie kaynağı yalnız Set-Cookie değildir: uygun cookie’ler script API’leriyle de oluşturulabilir. HttpOnly gibi kısıtlar buna ayrı sınır koyar. Frontend response.headers üzerinden Set-Cookie okumaya çalışmak, Browser jar kabulünü gözlemekle aynı şey değildir; Browser frontend erişiminden bu response header’ını filtreler.
State ne zaman kaybolur?
Duru cookie’yi temizlerse sonraki request preference çiftlerini taşımayabilir ve default görünüm gelir. Bu durumda Atlas’ın bütün database’i veya başka server state’i silinmiş değildir. Browser’ın tercihi bırakması ile application’ın kendi kayıtlarını değiştirmesi bağımsızdır.
Öğrenme kontrolü için ikinci request’i üç parçayla açıklayabilmelisin: jar’daki aday kayıt, request’te gönderilen çiftler ve application’ın bunlardan çıkardığı sınırlı sonuç. Sadece sayfanın Türkçe görünmesi bu üç aşamanın hangisinin gerçekleştiğini tek başına anlatmaz.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Tercih var
- Tercih request’i hazır
Browser’ın bu örnekteki tercihi dil ve görünüm içindir. Henüz handler’a ulaşmamış bir request, application kararı oluşturmaz.
- Browser
- hd_language=tr; hd_view=compact
- Preference handler
- Request alınmadı
- Application kararı
- Kimlik kararı yok
- Preference girdisi ulaştı
Normal preference request’i handler’a ulaştı. Cookie çiftlerinin bulunması veya bulunmaması yalnız bu girdinin durumunu gösterir.
- Browser
- Sonuç bekleniyor
- Preference handler
- Cookie çiftleri alındı
- Application kararı
- Kimlik kararı yok
- Allowed değerler seçildi
Application languages=[tr,en] ve views=[compact,comfortable] kümelerini kullanır. Bu branch tr ve compact değerlerini bu kümelerden seçer.
- Browser
- Sonuç bekleniyor
- Preference handler
- language=tr; view=compact
- Application kararı
- Kimlik kararı yok
- Preference authority oluşturmaz
Dil ve görünüm seçilmiş olsa da artifact herhangi bir login, role veya tenant grant’i üretmez. Preference sonucu bu kararların yerine kullanılamaz.
- Browser
- Sonuç bekleniyor
- Preference handler
- Tercih seçimi tamam
- Application kararı
- Yalnız görünüm context’i
- Görünüm response’u hazır
Handler tr dili ve compact görünümü için sonucu hazırlar. Bu response bir authentication belgesi veya hassas işlem onayı değildir.
- Browser
- Sonuç bekleniyor
- Preference handler
- Preference sonucu hazır
- Application kararı
- Yalnız görünüm context’i
- Tercih sonucu browser’da
Browser seçilen görünüm sonucunu aldı. Cookie varlığı yalnız preference seçiminin kaynağını açıklar; kimlik kanıtı olarak genişletilmez.
- Browser
- language=tr; view=compact
- Preference handler
- Response hazır
- Application kararı
- Kimlik kararı yok
Tercih yok
- Tercih request’i hazır
Browser’ın bu örnekteki tercihi dil ve görünüm içindir. Henüz handler’a ulaşmamış bir request, application kararı oluşturmaz.
- Browser
- Cookie yok
- Preference handler
- Request alınmadı
- Application kararı
- Kimlik kararı yok
- Preference girdisi ulaştı
Normal preference request’i handler’a ulaştı. Cookie çiftlerinin bulunması veya bulunmaması yalnız bu girdinin durumunu gösterir.
- Browser
- Sonuç bekleniyor
- Preference handler
- Cookie gönderilmedi
- Application kararı
- Kimlik kararı yok
- Allowed değerler seçildi
Application languages=[tr,en] ve views=[compact,comfortable] kümelerini kullanır. Bu branch girdi olmadığında en ve comfortable default’larını seçer.
- Browser
- Sonuç bekleniyor
- Preference handler
- language=en; view=comfortable
- Application kararı
- Kimlik kararı yok
- Preference authority oluşturmaz
Dil ve görünüm seçilmiş olsa da artifact herhangi bir login, role veya tenant grant’i üretmez. Preference sonucu bu kararların yerine kullanılamaz.
- Browser
- Sonuç bekleniyor
- Preference handler
- Tercih seçimi tamam
- Application kararı
- Yalnız görünüm context’i
- Görünüm response’u hazır
Handler en dili ve comfortable görünümü için sonucu hazırlar. Bu response bir authentication belgesi veya hassas işlem onayı değildir.
- Browser
- Sonuç bekleniyor
- Preference handler
- Preference sonucu hazır
- Application kararı
- Yalnız görünüm context’i
- Tercih sonucu browser’da
Browser seçilen görünüm sonucunu aldı. Default’a geçilmesi normal ürüne ait bir branch’tir; cookie yokluğu saldırı veya login başarısızlığı sayılmaz.
- Browser
- language=en; view=comfortable
- Preference handler
- Response hazır
- Application kararı
- Kimlik kararı yok
VARSAYIM · SINIR · KONTROL
Preference değeri authority’ye dönüşmesin
Normal işlev dil ve layout seçmektir. Gerekli kontrol, gelen değerleri bu iki küçük allowed kümeyle sınırlamaktır. “Server bunu daha önce yazdı” varsayımıyla cookie’yi bir yetki belgesine çevirmek client state’e gereğinden fazla authority verir.
Bu örnekte bozulan preference validation en fazla yanlış görünüm veya default’a dönüş gibi bir etki doğurur. Aynı mekanizmanın role/tenant kararı için kullanılmasının riski ise farklıdır; o karar server-owned identity ve authorization policy gerektirir. Etkiyi cookie kelimesinden değil, value’nun hangi karara sokulduğundan çıkar.
Otomatik gönderim uygulama kontrolünü kaldırmaz
Browser’ın Cookie header’ını otomatik oluşturması bütün request’in kullanıcı tarafından bilinçli olarak onaylandığını kanıtlamaz. Cookie state’i sonraki işleme context taşır; işlemin niyetini veya güvenliğini kendi başına doğrulamaz.
Buradaki benign preference request’i authenticated işlem gibi sunmuyoruz. Daha hassas bir action’da korunacak boundary ayrı tanımlanır: input validation, identity çözümü ve resource/action policy. WEB-11 browser security ve WEB-14 authorization dersleri bu kontrollerin nasıl ayrıldığını açar.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Cookie kaynağı
- Preference observation seçildi
İnceleme pref-1 kaydından başlar. Raw Cookie değerleri yerine cookiePresent ve karar kaynağı alanları kullanılır.
- Observation kaydı
- requestId=pref-1; cookiePresent=true
- Branch karşılaştırması
- Henüz eşleştirilmedi
- İnceleme sonucu
- Hüküm yok
- Karar kaynağı okundu
Aynı observation içinde languageDecision=cookie ve viewDecision=cookie kayıtlıdır. Bu alanlar uygulamanın örnek şemasıdır; HTTP’nin standart log alanları değildir.
- Observation kaydı
- requestId=pref-1; cookiePresent=true
- Branch karşılaştırması
- languageDecision=cookie; viewDecision=cookie
- İnceleme sonucu
- Hüküm yok
- Branch beklentisi karşılaştırıldı
Artifact’in with-preferences branch’i tr ve compact seçer. Observation bu karar kaynağıyla karşılaştırılır; browser görünümü henüz kanıtlanmış değildir.
- Observation kaydı
- requestId=pref-1; cookiePresent=true
- Branch karşılaştırması
- Beklenen branch uyumlu
- İnceleme sonucu
- Hüküm yok
- XPath seçimi sınırlandı
Default kaynağını ve cookiePresent=false koşulunu birleştiren XPath yalnız pref-2’yi seçer. pref-1’in seçilmemesi, kayıt bulunmadığı anlamına gelmez.
- Observation kaydı
- requestId=pref-1; cookiePresent=true
- Branch karşılaştırması
- XPath: seçilmedi
- İnceleme sonucu
- Hüküm yok
- UI kanıtı ayrıca istenir
Sunulan observation karar kaynağını gösterir. UI’ın dili farklı görünürse aynı request’e ait cache, başka state kaynağı ve render gözlemi gerekir; bu kayıt tek başına nedeni açıklamaz.
- Observation kaydı
- requestId=pref-1; cookiePresent=true
- Branch karşılaştırması
- Karar kaynağı biliniyor
- İnceleme sonucu
- UI sonucu bilinmiyor
- Preference hükmü korundu
Bu branch için cookie/default kararı açıklanabilir. Authentication, cookie acceptance’ın gerçek browser sonucu ve piksel görünümü ayrı kanıt ister.
- Observation kaydı
- requestId=pref-1; cookiePresent=true
- Branch karşılaştırması
- Karar kaynağı: cookie
- İnceleme sonucu
- Kimlik ve UI kanıtı yok
Default kaynağı
- Preference observation seçildi
İnceleme pref-2 kaydından başlar. Raw Cookie değerleri yerine cookiePresent ve karar kaynağı alanları kullanılır.
- Observation kaydı
- requestId=pref-2; cookiePresent=false
- Branch karşılaştırması
- Henüz eşleştirilmedi
- İnceleme sonucu
- Hüküm yok
- Karar kaynağı okundu
Aynı observation içinde languageDecision=default ve viewDecision=default kayıtlıdır. Bu alanlar uygulamanın örnek şemasıdır; HTTP’nin standart log alanları değildir.
- Observation kaydı
- requestId=pref-2; cookiePresent=false
- Branch karşılaştırması
- languageDecision=default; viewDecision=default
- İnceleme sonucu
- Hüküm yok
- Branch beklentisi karşılaştırıldı
Artifact’in without-preferences branch’i en ve comfortable seçer. Observation bu karar kaynağıyla karşılaştırılır; browser görünümü henüz kanıtlanmış değildir.
- Observation kaydı
- requestId=pref-2; cookiePresent=false
- Branch karşılaştırması
- Beklenen branch uyumlu
- İnceleme sonucu
- Hüküm yok
- XPath seçimi sınırlandı
Default kaynağını ve cookiePresent=false koşulunu birleştiren XPath yalnız pref-2’yi seçer. pref-2’nin seçilmesi bir saldırı bulgusu değildir.
- Observation kaydı
- requestId=pref-2; cookiePresent=false
- Branch karşılaştırması
- XPath: pref-2 seçildi
- İnceleme sonucu
- Hüküm yok
- UI kanıtı ayrıca istenir
Sunulan observation karar kaynağını gösterir. UI’ın dili farklı görünürse aynı request’e ait cache, başka state kaynağı ve render gözlemi gerekir; bu kayıt tek başına nedeni açıklamaz.
- Observation kaydı
- requestId=pref-2; cookiePresent=false
- Branch karşılaştırması
- Karar kaynağı biliniyor
- İnceleme sonucu
- UI sonucu bilinmiyor
- Preference hükmü korundu
Bu branch için cookie/default kararı açıklanabilir. Authentication, cookie acceptance’ın gerçek browser sonucu ve piksel görünümü ayrı kanıt ister.
- Observation kaydı
- requestId=pref-2; cookiePresent=false
- Branch karşılaştırması
- Karar kaynağı: default
- İnceleme sonucu
- Kimlik ve UI kanıtı yok
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Gönderilen header ile kabul edilen kaydı ayır
Network response’unda iki Set-Cookie field’ını, cookie storage’da iki kaydı ve sonraki request’te bir Cookie field içindeki çiftleri karşılaştır. Bunlar tek ekranın üç kopyası değildir. Response arrival ile cookie acceptance arasında policy değerlendirmesi vardır; sonraki request gönderimi de yeni bir seçimdir.
Gerçek Browser gözleminde blocked reason veya scope farkı görürsen yalnız server’ın response’una bakarak “cookie oluştu” deme. Bu dersin artifact’i beklenen izinli path’i ve missing-cookie branch’ini içerir; gerçek bir HAR veya gerçek Browser capture değildir.
Credential taşımadan tercih kararını izle
Fixture’ın observation kaydı requestId, cookiePresent, languageDecision ve viewDecision alanlarından oluşur. Bu alanlar bizim application-owned örnek şemamızdır. Raw Cookie header’ı genel log’a kopyalamak yerine yalnız karar için gereken, sınırlı preference sonucu kullanılır; gelecekte aynı header’da session credential da bulunabilir.
Fixture’daki XML üstünde /observations/preferenceObservation[@cookiePresent="false" and @languageDecision="default"] XPath seçimi yalnız default branch’i döndürür. Benign missing-cookie case’i hata veya saldırı diye sınıflandırmaz. Aynı requestId’de UI Türkçe görünürken observation default diyorsa başka state kaynağı, cache veya eksik trace araştırılır; bu tek başına kötü niyet kanıtı değildir.
Kontrolün sonucu görünüm ve kaynakla birlikte açıklanmalı
Kalıcı tasarımda cookie tüketen endpoint’in allowed preference değerlerini, default davranışını ve Browser privacy ayarlarıyla çalışmasını belgele. Cookie silinince kritik işlevin hangi fallback’e geçtiğini ayrıca doğrula. Bütün cookie’leri aynı policy’ye zorlamak yerine preference ile authenticated handle’ın farklı veri sınıfları olduğunu koru.
Başarı ölçütü tercihlerin hiç kaybolmaması değildir. Öğrenci aynı sayfanın neden cookie branch’inden veya default branch’inden geldiğini header, jar ve application kararından açıklayabilmelidir.
ŞİMDİ VAKAYA UYGULA
Cookie’den gelen dil tercihi hangi kararı taşır?
İki küçük preference değeri cookie branch’inde kullanılır; bulunmadığında default’lar seçilir. Sahne preference kaynağını kimlik ve görünüm kanıtından ayırır.
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
İki preference cookie’sinin response–jar–request izi
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"host": "library.outreason.example",
"responseFields": [
"Set-Cookie: hd_language=tr; Path=/",
"Set-Cookie: hd_view=compact; Path=/"
],
"jarAfterArrival": [
{
"name": "hd_language",
"value": "tr",
"hostOnly": true,
"path": "/"
},
{
"name": "hd_view",
"value": "compact",
"hostOnly": true,
"path": "/"
}
],
"nextRequestFields": [
"Host: library.outreason.example",
"Cookie: hd_language=tr; hd_view=compact"
],
"applicationPolicy": {
"languages": [
"tr",
"en"
],
"views": [
"compact",
"comfortable"
],
"defaults": {
"language": "en",
"view": "comfortable"
}
},
"branches": [
{
"id": "with-preferences",
"cookiePresent": true,
"language": "tr",
"view": "compact",
"languageDecision": "cookie",
"viewDecision": "cookie"
},
{
"id": "without-preferences",
"cookiePresent": false,
"language": "en",
"view": "comfortable",
"languageDecision": "default",
"viewDecision": "default"
}
],
"observationXML": "<observations><preferenceObservation requestId=\"pref-1\" cookiePresent=\"true\" languageDecision=\"cookie\" viewDecision=\"cookie\"/><preferenceObservation requestId=\"pref-2\" cookiePresent=\"false\" languageDecision=\"default\" viewDecision=\"default\"/></observations>",
"localXPath": "/observations/preferenceObservation[@cookiePresent=\"false\" and @languageDecision=\"default\"]",
"expectedSelectedRequestIds": [
"pref-2"
]
}- responseFields
- Her cookie için ayrı Set-Cookie field; comma-separated tek field gibi parse edilmez.
- jarAfterArrival
- Arrival ve izinli Browser policy sonrası oluşması beklenen kayıtlar; gerçek storage capture değil.
- nextRequestFields
- Gönderilen name/value çiftleri; Path attributes burada yer almaz.
- applicationPolicy / branches
- Preference allowlist ve yokluğunda default; authentication veya kitap permission sonucu değil.
- observationXML / localXPath
- Bizim sentetik XML üstünde yerel selection; network veya zaman korelasyonu yapmaz.
Cookie preferences inert ve secrets-free’tir. HTTP metadata gösterimi wire capture değildir; model cookie parser, Browser privacy engine veya gerçek endpoint çalıştırmaz. XPath yalnız bu XML fixture’ı seçer.
İki yanlış kanı
HTTP stateless ise site bir önceki seçimi hatırlayamaz.
Stateless protokol, application state’i yasaklamaz. Cookie gibi sonraki request verisi ve application kayıtları devamlılık kurabilir.
Set-Cookie ve Cookie aynı header’ın iki adıdır.
Set-Cookie response’ta Browser’a kayıt talimatı verir; Cookie request’te seçilmiş name/value çiftlerini taşır. Attributes Cookie içinde tekrar gönderilmez.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Cookie bulunmadığında application hangi language ve view değerlerini seçer?
- tr/compact; HTTP önceki seçimi kendiliğinden hatırlar.
- en/comfortable; application’ın varsayılanları.
Gerekçeli cevabı oku
en/comfortable; application’ın varsayılanları. — without-preferences branch’i cookiePresent=false için varsayılanları uygular. HTTP önceki seçimi kendiliğinden saklamaz.
Set-Cookie ve Cookie neden aynı yöndeki alanın iki adı değildir?
Dersten seçilen artifact alanları; öğretim örneği
- responseFields
- ["Set-Cookie: hd_language=tr; Path=/","Set-Cookie: hd_view=compact; Path=/"]
- nextRequestFields
- ["Host: library.outreason.example","Cookie: hd_language=tr; hd_view=compact"]
- Set-Cookie response’tadır; Cookie sonraki request’te uygun değerleri taşır.
- Browser Set-Cookie alanını request authorization header’ı olarak yollar.
Gerekçeli cevabı oku
Set-Cookie response’tadır; Cookie sonraki request’te uygun değerleri taşır. — İki ayrı Set-Cookie field iki preference kaydını saklama talimatı taşır. Bu örnekte Browser, response geldikten ve cookie policy’si kabul ettikten sonra kayıtları oluşturur. Sonraki request’in Cookie field’ında ise yalnız gönderime uygun name/value çiftleri bulunur.
Browser hd_language=tr sakladı. Server neden bu değeri language allowlist’iyle kontrol etmelidir?
Gerekçeli cevabı oku
Cookie, browser’ın request ile taşıdığı veridir. Application language için tr/en, view için compact/comfortable sözleşmesine göre değerleri yorumlar. Jar’da kayıt bulunması authentication veya business input’un kabul edildiği kanıtı değildir. Application bu state katmanını HTTP’nin stateless semantics’i üzerinde kurar.
□ Browser kaydını güvenilen policy saymadım.
□ Varsayılanları ve allowlist’i application’ın belirlediğini açıkladım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- RFC 9110 — HTTP Semantics3.3 Connections, Clients, and Servers: stateless semantics
- RFC 6265 — HTTP State Management Mechanism3 Overview · 4.1 Set-Cookie · 4.2 Cookie · 4.2.2 Semantics
- MDN — Using HTTP cookiesWhat cookies are used for · Creating, removing, and updating cookies · Updating cookies via JavaScript
- MDN — Set-Cookie headerIntroduction: separate Set-Cookie headers and forbidden response header name · Syntax
- MDN — Cookie headerSyntax · Directives