Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

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.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Preference cookie taşınıyor

  1. İ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
  2. İ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ı
  3. 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
  4. 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
  5. 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=/
  6. 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
  7. 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
  8. 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

  1. İ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
  2. İ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ı
  3. 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
  4. 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
  5. 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=/
  6. 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
  7. 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
  8. 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

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

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

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

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

  1. tr/compact; HTTP önceki seçimi kendiliğinden hatırlar.
  2. 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"]
  1. Set-Cookie response’tadır; Cookie sonraki request’te uygun değerleri taşır.
  2. 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