Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-13.03

Session lifecycle, login ve logout

Browser cookie jar ile server session state’ini aynı hikâyede izleyerek login rotation, expiry ve logout kararlarının nerede oluştuğunu ayır.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Login rotation

  1. Anonymous login request’i hazır

    Browser sid-a anonymous handle alias’ını taşır ve login request’i hazırlar. Yeni identity veya generation henüz yok; raw credential gösterilmez.

    Browser · cookie jar
    Cookie: sid-a alias
    Application · acceptance
    Login request alınmadı
    Aynı process · session store
    ledger-a anonymous
  2. Login request’i Application’da

    Login request’i Application’a ulaştı. Password/MFA doğrulamasının sonucu sonraki yerel geçişin verilen önkoşuludur; burada gerçek verifier çalıştırılmaz.

    Browser · cookie jar
    Response bekleniyor
    Application · acceptance
    Login request alındı; check bekliyor
    Aynı process · session store
    ledger-a anonymous
  3. Yeni generation server’da kuruldu

    t=10’da verilmiş Duru/Atlas identity sonucu ile ledger-b active olur, ledger-a invalidated olur. Application ve store aynı process’in mantıksal bileşenleridir; Browser hâlâ sid-a tutar.

    Browser · cookie jar
    Cookie hâlâ sid-a
    Application · acceptance
    Duru/Atlas; yeni Set-Cookie hazırlanabilir
    Aynı process · session store
    ledger-a invalidated; ledger-b active
  4. Yeni Cookie response’u bekliyor

    response_pending / not_arrived aşamasında server yeni generation’ı tanır. Hazırlanan __Host-hd_session response’u Browser’a henüz ulaşmadığından jar değiştirilmez.

    Browser · cookie jar
    Cookie hâlâ sid-a
    Application · acceptance
    Set-Cookie hazır; receipt yok
    Aynı process · session store
    ledger-a invalidated; ledger-b active
  5. Cookie arrival tamamlandı

    Bu seçilmiş izinli Browser policy’sinde cookie_arrived / stored gerçekleşti. Browser sid-b alias’ını saklar; server rotation daha önce tamamlanmıştır.

    Browser · cookie jar
    Cookie: sid-b alias
    Application · acceptance
    Login response gönderildi
    Aynı process · session store
    ledger-b active; createdAt_s=10
  6. Taşıma ve acceptance ayrıldı

    sid-b jar’da bulunur, fakat sonraki protected request için generation, idle/absolute süre ve ayrıca resource policy değerlendirilir. Cookie flags bu kararları otomatik geçirmez.

    Browser · cookie jar
    sid-b var; yeni request kararı ayrı
    Application · acceptance
    Resource policy ayrıca gerekli
    Aynı process · session store
    ledger-b active; absoluteDeadline_s=1810

Idle sınırı

  1. Son accepted activity t=70

    Sahne ledger seq=5 sonrasından başlar: session_check accepted ve lastSeen_s=70 verilmiştir. Browser sid-b tutar; absolute deadline=1810 ve idle timeout=300’dür.

    Browser · cookie jar
    Cookie: sid-b alias
    Application · acceptance
    t=70 check accepted verilmiş
    Aynı process · session store
    ledger-b active; lastSeen_s=70; absolute=1810
  2. Yeni request t=370 için hazır

    Öğretim clock’u now=370 seçer ve Browser protected check hazırlar. Clock seçimi yereldir; yalnız request hazırlamak lastSeen’i yenilemez.

    Browser · cookie jar
    sid-b var; now=370
    Application · acceptance
    Yeni check henüz alınmadı
    Aynı process · session store
    ledger-b active; lastSeen_s=70; absolute=1810
  3. Protected check Application’da

    sid-b check’i Application’a ulaştı; Browser sonucu bekler. Jar’daki handle’ın bulunması, server lifetime koşulunun sağlandığını göstermez.

    Browser · cookie jar
    Response bekleniyor
    Application · acceptance
    now=370; lifetime check bekliyor
    Aynı process · session store
    ledger-b active; lastSeen_s=70; absolute=1810
  4. Idle equality ret verir

    370−70=300, idle timeout’a tam eşittir; now >= deadline kuralı idle_expired sonucu verir. 370 < 1810 olduğundan gerekçe absolute expiry değildir. lastSeen_s=70 kalır.

    Browser · cookie jar
    Response bekleniyor
    Application · acceptance
    REJECT: idle_expired; response hazırlanabilir
    Aynı process · session store
    ledger-b expired; lastSeen_s=70
  5. Ret response’u hazırlandı

    Application session_check rejected sonucunu hazırlar. Bu check accepted activity olmadığı için deadline’ı ileri taşımaz; authenticated processing ve protected body verilmez.

    Browser · cookie jar
    Response bekleniyor
    Application · acceptance
    Authn-required response hazır
    Aynı process · session store
    ledger-b expired; lastSeen_s=70
  6. Browser ret sonucunu öğrendi

    Ret sonucu Browser’a ulaştı. Cookie saklama süresi bitmemiş olabilir; server idle expiry jar’ı sihirli biçimde silmez. Yeni authenticated session bağımsız geçerli authentication gerektirir.

    Browser · cookie jar
    sid-b var; session rejected
    Application · acceptance
    Authn-required response hazır
    Aynı process · session store
    ledger-b expired; lastSeen_s=70

Bu session logout

  1. Logout için active başlangıç

    Bu alternatif branch, expiry’den sonra değil, seq=5 t=70 accepted state’inden ayrılır. Browser sid-b tutar ve server generation active’tir.

    Browser · cookie jar
    Cookie: sid-b alias
    Application · acceptance
    t=70 accepted başlangıç
    Aynı process · session store
    ledger-b active; lastSeen_s=70; absolute=1810
  2. Logout niyeti t=90’da hazır

    Duru logout seçer ve Browser t=90 request’ini hazırlar. Kullanıcının niyeti henüz server’a ulaşmadı; store active ve cookie jar değişmemiştir.

    Browser · cookie jar
    Cookie: sid-b alias
    Application · acceptance
    Logout henüz alınmadı
    Aynı process · session store
    ledger-b active; lastSeen_s=70; absolute=1810
  3. Logout request’i Application’da

    Logout request’i Application’a ulaştı. Browser clearing response’u bekler; store revocation sıradaki local geçiştir, henüz cookie silinmemiştir.

    Browser · cookie jar
    Cookie: sid-b alias
    Application · acceptance
    Logout alındı; revocation bekliyor
    Aynı process · session store
    ledger-b active; lastSeen_s=70; absolute=1810
  4. Mevcut generation revoked oldu

    Seq=6 session_revoked / user_logout ledger-b’yi kapatır. Browser’daki sid-b hâlâ durabilir; server revocation cookie cleanup’ı beklemez. Bu local same-process store geçişidir.

    Browser · cookie jar
    Cookie: sid-b alias
    Application · acceptance
    Max-Age=0 hazırlanabilir
    Aynı process · session store
    ledger-b revoked
  5. Cookie clearing response’u bekliyor

    Seq=7 response_pending / not_arrived: matching name ve Path=/ için Max-Age=0 instruction hazırlanır. Response kaybolsa bile revoked generation sonraki protected check’te kabul edilmez.

    Browser · cookie jar
    Cookie: sid-b alias
    Application · acceptance
    Clearing response hazır; receipt yok
    Aynı process · session store
    ledger-b revoked; acceptance kapalı
  6. Cookie cleanup Browser’da tamamlandı

    Seq=8 cookie_cleared / removed, izinli Browser’da matching cookie’yi temizler. Bu, mevcut generation logout’udur; bütün cihazlar, access token’lar veya IdP session’ı için sonuç eklenmez.

    Browser · cookie jar
    Cookie temizlendi
    Application · acceptance
    Clearing response gönderildi
    Aynı process · session store
    ledger-b revoked; acceptance kapalı

ROLLER · STATE · VERİ AKIŞI

Cookie taşıyıcıdır; session kararı server’da yaşar

Duru, Atlas kitaplığına login olduktan sonra ikinci sayfayı açar. Bu yeni HTTP request ilk login işleminin hafızasını taşımaz. Browser uygun cookie’yi request’e ekler; application ise aldığı identifier’ı session store’da kontrol eder. Bu örnekte cookie bir opaque handle taşır: kimliğin, authentication durumunun ve sürelerin anlamı server kaydındadır. Cookie değerinin bulunması tek başına geçerli session olduğunu göstermez.

Üç ayrı alanı izle: Browser cookie jar identifier’ı saklar. Application her korumalı request için kabul kararını verir. Session store aktif kaydı ve lifecycle state’ini tutar. Store aynı process içindeki memory de olabilir, paylaşılan persistence da; çizimde ayrı görünmesi zorunlu olarak ayrı network servisi olduğu anlamına gelmez.

Ön bilgi: WEB-12.01/12.02 cookie anatomy; WEB-13.01/13.02 identifier ve store ayrımı. Bu dersin kısa primer’ı şudur: Set-Cookie bir response header’dır, Cookie sonraki request’in taşıdığı name/value çiftleridir. Cookie attributes request’te tekrar listelenmez; application bunları Cookie header’dan okuyarak güvenlik garantisi çıkaramaz.

Login iki tarafta aynı anda gerçekleşmez

İlk sahnede Browser sid-a etiketiyle gösterilen anonymous session’a sahiptir. Duru’nun kimliğinin doğrulandığı t=10 anında application sid-b olarak çizilen yeni authenticated session generation’ı oluşturur; eski anonymous identifier authenticated kimliğe yükseltilmez. sid-a ve sid-b eğitim etiketidir, kullanılabilir credential veya üretim identifier formatı değildir.

Modelde server kaydı güncellendikten sonra Set-Cookie response’u yola çıkar. Response Browser’a henüz ulaşmadıysa store yeni generation’ı tanır, cookie jar ise hâlâ eski etiketi tutar. Arrival adımında Browser cookie’yi kabul eder. Bu ara durum bir animasyon detayı değildir: bağlantı koparsa server transition tamamlandığı hâlde client yeni identifier’ı alamamış olabilir.

Burada rotation sırasında eski generation hemen geçersizleşir. Eşzamanlı request’lerin olduğu gerçek uygulamalarda geçiş davranışı ayrıca tasarlanır; framework’ün migration ve invalidation sözleşmesi incelenir. Authentication öncesi identifier’ın hangi koşulda kabul edildiği ile privilege değişimi sonrasındaki identifier aynı mesele değildir.

Korumalı request: lookup, süre kontrolü, ardından resource policy

Duru t=70’te bir kitap kaydını açar. Browser’ın cookie inclusion kuralları uygun identifier’ı application’a taşır. Application store kaydını bulur, generation’ın active olduğunu ve süre sınırlarının geçilmediğini kontrol eder. Bu örnekte check başarılı olunca lastSeen=70 olur. Hangi request’lerin activity sayılacağı uygulama policy’sidir; background polling’in her zaman kullanıcı faaliyeti sayılması gerekmez.

Session kabulü bir authenticated subject üretir; resource authorization ayrı karardır. Duru’nun identity’sinin bulunması başka tenant’ın kitabını okuma yetkisi oluşturmaz. WEB-14.05 bu sonraki subject/action/object/context kararını açar. Bu dersin modeli session rejected ise protected işleme geçmez; kabul edildiğinde de resource policy’yi atlamaz.

Lookup sonucu yoksa, kayıt revoked ise veya süre bitmişse aynı yeşil “logged in” UI’ı kararı değiştiremez. Örnek application yeniden login gerektirir. HTTP status ve redirect davranışı endpoint sözleşmesine bağlıdır; bütün expiry durumları için tek evrensel response kodu yoktur.

Üç saat aynı şey değildir

Örneğin policy’si idle=300 saniye ve absolute=1800 saniyedir. Bunlar öğretim için seçilmiş sayılardır, her ürüne önerilen güvenlik ayarı değildir. Login t=10’da yeni session oluşturur; absolute deadline=1810 olur. t=70’teki kabul edilmiş işlemden sonra idle deadline=370 olur. t=370 sınırında now−lastSeen >= 300 olduğu için yeni request reddedilir; o request lastSeen’i ilerletip kendisini kurtaramaz.

Idle süre son kabul edilen activity’ye göre yürür. Absolute süre session’ın başlangıcından yürür; activity’nin artması onu ileri taşımaz. Identifier rotation tek başına yeniden authentication veya sonsuz session ömrü değildir: sürelerin yeniden başlatılıp başlatılmayacağı ayrı policy kararıdır.

Cookie Max-Age=1800 ise Browser’ın identifier’ı saklama süresini anlatır. Server’ın idle kontrolü cookie daha jar’da dururken session’ı geçersiz sayabilir. Cookie’nin erken silinmesi ise server kaydını otomatik silmez. Expires ile Max-Age birlikteyse Max-Age önceliklidir; attributes bulunmayan session cookie için Browser session restore davranışı da hesaba katılır.

Logout: server invalidation ve cookie temizliği

Logout branch’i t=70’teki geçerli session’dan ayrılır. Duru t=90’da logout seçer. Application current generation’ı revoked yapar; ardından Browser’a aynı cookie name, Path ve varsa Domain scope’u için Max-Age=0 gönderir. Server invalidation, response receipt ve cookie jar temizliği farklı transitions olarak çizilir.

Response kaybolursa Browser eski cookie’yi tutabilir; server revoked kaydı kabul etmez. Browser’ın yalnız cookie’yi silmesi ters durumu yaratır: client handle’ı bırakmış olur, server state’in iptal edildiği bundan çıkarılamaz. UI’da logout mesajı görünmesi veya bir sekmenin kapanması da server invalidation kanıtı değildir.

Bu branch yalnız current session generation’ını kapatır. “Bütün cihazlardan çıkış”, password değişimi veya federated identity provider logout’u daha geniş policy ve yayılım gerektirebilir. Çok node’lu bir sistemde invalidation’ın hangi store/cache okumasına ne zaman yansıdığı da logout garantisinin parçasıdır.

Cookie flags farklı sınırları korur

Synthetic HTTPS örneğinde __Host-hd_session; Path=/; Secure; HttpOnly; SameSite=Lax kullanılır ve Domain verilmez. __Host- kuralını destekleyen Browser bu isim için Secure, host-only scope ve Path=/ koşullarını arar. Prefix bütün Browser sürümleri için otomatik uyumluluk garantisi sayılmaz.

Secure taşıma kanalını, HttpOnly script ile cookie erişimini, SameSite cross-site inclusion koşullarını etkiler. Hiçbiri store’daki revoked kaydı active yapmaz veya resource authorization sağlamaz. Path bir gönderim filtresidir; aynı host içindeki uygulamalar arasında sağlam bir güvenlik izolasyonu gibi kullanılmaz.

HttpOnly cookie’nin değeri document.cookie üzerinden görünmez; buna karşın uygun JavaScript kaynaklı request’lere cookie eklenebilir. Frontend fetch response’u üzerinden Set-Cookie header’ını okumak da beklenen yöntem değildir. DevTools cookie ve network gözlemi ile application log’u farklı erişim ve kanıt yüzeyleridir.

Self-contained token’a geçince logout sorusu değişir

Opaque handle modelinde application her kabul kararını server state’e bağlar. Self-contained token kullanan bir tasarımda verifier signature ve beklenen issuer/audience/time koşullarını kendi başına değerlendiriyorsa, Browser’ın token’ı silmesi o verifier’a yeni bir iptal bilgisi göndermez. Geçerli kriptografi ile güncel kullanım yetkisi farklı sorulardır.

JWT exp claim’i varsa token o zaman ve sonrasında kabul edilmez; clock-skew toleransı ve zorunlu claim set’i kullanılan profile’a bağlıdır. “JWT zaten stateless, logout olamaz” genellemesi de yanlıştır. Bir tasarım revocation state, session version, introspection veya kısa access-token ömrü kullanabilir; bunun state, communication ve gecikme maliyeti vardır.

Refresh token’ın iptali yeni access token alınmasını durdurabilir; hâlihazırdaki access token’ın bütün resource server’larda aynı anda iptal edildiği ayrıca kanıtlanmalıdır. Refresh-token rotation ile bu dersin Browser session identifier rotation’ı farklı mekanizmalardır. WEB-14.03/14.S03 ve WEB-15 identity dersleri token doğrulaması ve delegation ayrıntılarını açar.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Idle eşiği

  1. Cookie kabul kararı değildir

    Browser sid-b öğretim alias’ını hâlâ taşır. Server generation’ı sona ermiş olsa da browser state’i henüz değişmemiştir.

    Browser cookie jar
    sid-b var
    Acceptance gate
    Check yok
    Session store
    ledger-b: expired
    Protected resource
    Protected veri verilmedi
  2. Check application’a ulaştı

    Normal protected check sid-b alias’ıyla application’a ulaştı. Cookie flags veya browser’da kalması server validity kontrolünü ortadan kaldırmaz.

    Browser cookie jar
    Response bekliyor
    Acceptance gate
    sid-b check alındı
    Session store
    ledger-b: expired
    Protected resource
    Protected veri verilmedi
  3. Generation state okundu

    Session store bu örnekte application’ın mantıksal state sahibidir; zorunlu bir network hop değildir. Son accepted activity t=70’tedir. Idle timeout 300 saniye olduğundan t=370 anında acceptance eşiğine ulaşılır.

    Browser cookie jar
    Response bekliyor
    Acceptance gate
    Validity sonucu bekliyor
    Session store
    ledger-b: expired
    Protected resource
    Protected veri verilmedi
  4. Acceptance gate kapandı

    now >= deadline kuralı t=370 check’ini idle_expired gerekçesiyle reddeder. Reddedilen check lastSeen_s=70 değerini yenilemez.

    Browser cookie jar
    Response bekliyor
    Acceptance gate
    REJECT: idle_expired
    Session store
    ledger-b: expired
    Protected resource
    Protected veri verilmedi
  5. Resource sınırı korunuyor

    Session acceptance başarısız olduğu için authenticated context resource işlemine aktarılmaz. Bu gate resource authorization kurallarının yerine geçmez; önceki zorunlu koşuldur.

    Browser cookie jar
    Response bekliyor
    Acceptance gate
    REJECT: idle_expired
    Session store
    ledger-b: expired
    Protected resource
    Body withheld
  6. Sonuç browser’a döndü

    Authn-required öğretim sonucu browser’a ulaştı. Cookie’nin görünmesi ile server’ın session’ı kabul etmesi artık ayrı kartlarda gösterilir; HTTP status burada yeni bir sayıyla uydurulmaz.

    Browser cookie jar
    sid-b var; kabul yok
    Acceptance gate
    REJECT: idle_expired
    Session store
    ledger-b: expired
    Protected resource
    Body withheld

Logout sonrası

  1. Cookie kabul kararı değildir

    Browser sid-b öğretim alias’ını hâlâ taşır. Server generation’ı sona ermiş olsa da browser state’i henüz değişmemiştir.

    Browser cookie jar
    sid-b var
    Acceptance gate
    Check yok
    Session store
    ledger-b: revoked
    Protected resource
    Protected veri verilmedi
  2. Check application’a ulaştı

    Normal protected check sid-b alias’ıyla application’a ulaştı. Cookie flags veya browser’da kalması server validity kontrolünü ortadan kaldırmaz.

    Browser cookie jar
    Response bekliyor
    Acceptance gate
    sid-b check alındı
    Session store
    ledger-b: revoked
    Protected resource
    Protected veri verilmedi
  3. Generation state okundu

    Store bu örnekte application’ın mantıksal veri sahibidir; zorunlu bir ağ hop’u çizilmez. t=90 session_revoked kaydı generation’ı sonlandırır; cookie temizleme response’u henüz ulaşmamış olabilir.

    Browser cookie jar
    Response bekliyor
    Acceptance gate
    Validity sonucu bekliyor
    Session store
    ledger-b: revoked
    Protected resource
    Protected veri verilmedi
  4. Acceptance gate kapandı

    Revoked generation kabul edilmez. Cookie temizleme response’u kaybolsa bile server kararını browser state’ine devretmez.

    Browser cookie jar
    Response bekliyor
    Acceptance gate
    REJECT: user_logout
    Session store
    ledger-b: revoked
    Protected resource
    Protected veri verilmedi
  5. Resource sınırı korunuyor

    Session acceptance başarısız olduğu için authenticated context resource işlemine aktarılmaz. Bu gate resource authorization kurallarının yerine geçmez; önceki zorunlu koşuldur.

    Browser cookie jar
    Response bekliyor
    Acceptance gate
    REJECT: user_logout
    Session store
    ledger-b: revoked
    Protected resource
    Body withheld
  6. Sonuç browser’a döndü

    Authn-required öğretim sonucu browser’a ulaştı. Cookie’nin görünmesi ile server’ın session’ı kabul etmesi artık ayrı kartlarda gösterilir; HTTP status burada yeni bir sayıyla uydurulmaz.

    Browser cookie jar
    sid-b var; kabul yok
    Acceptance gate
    REJECT: user_logout
    Session store
    ledger-b: revoked
    Protected resource
    Body withheld

VARSAYIM · SINIR · KONTROL

Authentication öncesi state neden ayrı tutulur?

Normal akışta anonymous session kişiselleştirme veya geçici UI state taşıyabilir; authenticated session ise Duru’nun identity’sini korumalı işlemlere bağlar. İkinci state’in authority’si, birinci identifier’ın kim tarafından seçildiği veya daha önce nerede kullanıldığına güvenilerek kurulmaz.

Bozulan varsayım şudur: “Login başarılıysa mevcut identifier artık güvenilir.” Authentication kontrolü credential doğrularken eski handle’ın geçmişini kendiliğinden değiştirmez. Login veya önemli privilege değişiminde yeni generation’a geçmek ve eski generation kabulünü kapatmak, bu iki güven düzeyinin birbirine karışmasını önler. Riskin kapsamı session’ın sağladığı identity ve izinlerle sınırlıdır; her session hatası bütün sistemi ele geçirme sonucu doğurmaz.

Cookie’yi korumak ile session’ı geçersizleştirmek ayrı kontrollerdir

Bir identifier authenticated state’e ulaşmak için yeterli bir bearer handle olarak kullanılıyorsa, gizliliği önemlidir. Uygun HTTPS taşıması ve dar cookie scope’u maruz kalma yüzeyini azaltır. HttpOnly bir script’in değeri okumasını sınırlar; Browser’ın o script kaynaklı uygun işlemlerde identity’yi taşımasını tek başına durdurmaz.

Bu nedenle “HttpOnly var” sonucundan işlem güvenliği, CSRF kontrolü veya resource authorization sonucu çıkarılmaz. Kontrol bozulan boundary’ye yerleştirilir: taşıma için kanal, script erişimi için cookie özelliği, state-changing action için request doğrulaması, object erişimi için server policy. Bu derste payload üretmek yerine hangi kontrolün hangi varsayımı karşıladığını ayırıyoruz.

Süresi bitmiş veya revoked handle neden kabul edilmemeli?

Modelde t=370’te cookie görünür olabilir ama session artık idle koşulunu sağlamaz. Kontrolün UI timer’a bırakılması server kararını client’ın görünümüne bağlar. Benzer biçimde logout yalnız jar’ı temizliyorsa server’daki authority devam edebilir. Kalıcı kontrol, protected işlemin kabul noktasında current generation ve server deadline değerlendirmesidir.

Self-contained bir tasarımda aynı sorunun cevabı revocation dağıtımına bağlıdır. Bir node signature ve exp dışında hiçbir güncel state okumuyorsa, başka node’da yapılan logout onun kararını hemen değiştirecek bilgi taşımamış olabilir. Engelleyici tasarımın hangi gecikme penceresini kabul ettiği ve bunu hangi observable kontrolle doğruladığı açık olmalıdır.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

Ledger tutarlı

  1. Ledger secret taşımaz

    Sunulan ledger-b generationRef’i audit correlation etiketidir. Cookie değeri veya kullanılabilir credential değildir; bu sahne KQL çalıştırmaz.

    Lifecycle ledger
    ledger-b / seq 5…7
    Correlation incelemesi
    Scope belirlenmedi
    Integrity sonucu
    Karar yok
  2. Generation kapsamı seçildi

    seq yalnız aynı idleBranch içindeki sıradır. logoutBranch alternatif bir timeline’dır; iki branch bir global dağıtık event sırası gibi birleştirilmez.

    Lifecycle ledger
    idleBranch
    Correlation incelemesi
    ledger-b / tek branch
    Integrity sonucu
    Karar yok
  3. Terminal kanıtı incelendi

    seq=6 session_expired / expired, t=370 sınırını kaydeder. session_check sonucu aynı field ailesinden ayrı bir karardır.

    Lifecycle ledger
    seq 6: session_expired
    Correlation incelemesi
    ledger-b / tek branch
    Integrity sonucu
    Karar yok
  4. Sonraki check ayrı okundu

    seq=7 session_check / rejected / idle_expired sunulan kayıttır. lastSeen_s=70 korunur; rejected sonuç activity yenilemesi olarak sayılmaz.

    Lifecycle ledger
    seq 7: rejected
    Correlation incelemesi
    lastSeen_s=70
    Integrity sonucu
    Karar yok
  5. Bütün eşleşen kayıtlar incelendi

    generationRef eşleşen bütün checks birlikte incelenir. Tek ilk row’a bakılmaz; duplicate veya sıra belirsizliği varsa kesin nedensellik iddiası durdurulur.

    Lifecycle ledger
    Sunulan checks seçildi
    Correlation incelemesi
    Accepted-after-terminal yok
    Integrity sonucu
    Karar yok
  6. Integrity sonucu sınırlandı

    Bu sınırlı ledger’da terminal sonrası accepted check yoktur. Bu fixture uyumudur; gerçek dağıtık store revocation testi veya tüm log coverage kanıtı değildir.

    Lifecycle ledger
    Evidence copy
    Correlation incelemesi
    Sıra tutarlı
    Integrity sonucu
    PASS: ledger integrity

Terminal kayıt yok

  1. Ledger secret taşımaz

    Sunulan ledger-b generationRef’i audit correlation etiketidir. Cookie değeri veya kullanılabilir credential değildir; bu sahne KQL çalıştırmaz.

    Lifecycle ledger
    ledger-b / seq 5…7
    Correlation incelemesi
    Scope belirlenmedi
    Integrity sonucu
    Karar yok
  2. Generation kapsamı seçildi

    seq yalnız aynı idleBranch içindeki sıradır. logoutBranch alternatif bir timeline’dır; iki branch bir global dağıtık event sırası gibi birleştirilmez.

    Lifecycle ledger
    idleBranch
    Correlation incelemesi
    ledger-b / tek branch
    Integrity sonucu
    Karar yok
  3. Terminal kanıtı incelendi

    Bu branch seq=6 session_expired kaydını inceleme kopyasından çıkarır. Collector kaybı ile event olmaması aynı sonuç değildir; store state’i buradan kesin çıkarılamaz.

    Lifecycle ledger
    Terminal kayıt eksik
    Correlation incelemesi
    ledger-b / tek branch
    Integrity sonucu
    Karar yok
  4. Sonraki check ayrı okundu

    seq=7 session_check / rejected / idle_expired sunulan kayıttır. lastSeen_s=70 korunur; rejected sonuç activity yenilemesi olarak sayılmaz.

    Lifecycle ledger
    seq 7: rejected
    Correlation incelemesi
    lastSeen_s=70
    Integrity sonucu
    Karar yok
  5. Bütün eşleşen kayıtlar incelendi

    generationRef eşleşen bütün checks birlikte incelenir. Tek ilk row’a bakılmaz; duplicate veya sıra belirsizliği varsa kesin nedensellik iddiası durdurulur.

    Lifecycle ledger
    Sunulan checks seçildi
    Correlation incelemesi
    Accepted-after-terminal bilinmiyor
    Integrity sonucu
    Karar yok
  6. Integrity sonucu sınırlandı

    Rejected check gözlemi bilinir; terminal state geçişinin kanıtı eksiktir. İnceleme UNKNOWN sonucunu ve istenecek lifecycle kaydını korur.

    Lifecycle ledger
    Evidence copy
    Correlation incelemesi
    Coverage eksik
    Integrity sonucu
    UNKNOWN: terminal

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Hangi gözlem hangi state’i kanıtlar?

DevTools Network’te Set-Cookie görmek application’ın bir header gönderdiğini gösterir; Browser’ın cookie’yi kabul ettiğini ayrıca cookie storage ve ilgili request inclusion üzerinden değerlendirirsin. Policy, scope veya Browser ayarları kabulü değiştirebilir. Cookie görünümü server store’un active olduğunu; UI kimlik etiketi de son protected kararın başarılı olduğunu tek başına kanıtlamaz.

Bu dersin ledger’ı application-owned sentetik JSON’dur. Standart bir web server’ın hazır event adı, SIEM tablosu veya gerçek packet capture diye sunulmaz. event, seq, clock_s, generationRef, requestId, result ve reason alanları bizim fixture şemamızdır. Gerçek uygulamada event’in üretildiği code path ve log delivery davranışı ayrıca belgelenir.

Credential içermeyen lifecycle correlation

Rotation, expiry ve logout’u ilişkilendirmek için audit correlation ref kullan; raw session value, Set-Cookie value veya credential loglama. Bu fixture’da generationRef=ledger-b bir audit referansıdır, Browser handle’ına dönüştürülemez. requestId=demo-session-3 yalnız aynı check’in application ve karar kaydını eşler.

Korelasyon sorusu nettir: Aynı generationRef için terminal transition’dan sonra session_check accepted var mı? Artifact’te KQL, embedded datatable üstünde seq alanını kullanır. Bu seq yalnız tek model senaryosundaki sıralamadır; dağıtık host’ların wall-clock timestamp’lerini evrensel sıraya çevirmez. Shared session bütünlüğü için gerçek event ordering ve node/store consistency ayrıca incelenir.

Idle branch’inde t=70 accepted check ve t=370 expired/rejected check normaldir; sorgu satır üretmez. Terminal transition’dan sonra accepted check eklenmiş pozitif bir fixture kontrol eksikliğini gösterebilir. Eksik terminal event ise kabul edildiğinin değil, kanıtın eksik olduğunun işaretidir. Log delivery kesintisi, duplicate event veya yanlış generationRef eşlemesi gerçek ortamda değerlendirilmeden bir satıra saldırı etiketi konmaz.

Doğrulama ve kalıcı kontrol

Manual labda sırayla login öncesi/sonrası jar state’ini, sanitized store görünümünü, explicit demo clock expiry’sini ve logout sonrası protected kararı gözle. Önce sonucu tahmin et, sonra hangi katmanda gözlemlediğini yaz. Store invalidation ile response arrival ayrıysa bu iki adımın arasındaki görünümü de açıklayabilmelisin.

Üretim hardening kararı verirken framework session lifecycle davranışını, HTTPS/proxy yapılandırmasını, cookie scope’unu ve uygulamaya uygun idle/absolute policy’yi birlikte ele al. Geçişi kontrollü kullanıcı grubunda doğrula; uzun form, background activity ve çok sekmeli kullanımın uyumluluk etkisini ölç. Değişen role veya account state’in mevcut session’lara nasıl yansıyacağını ayrıca belirle.

Bu dersin kabul ölçütü her göstergenin yeşil olması değil: Browser jar temiz, store revoked ve protected check rejected durumlarının hangi bağımsız kanıta dayandığını açıklayabilmek. KQL burada açıklamalı inceleme mantığıdır; gerçek ingest veya detection backend kurulumu, sırf sorgu metni bulunduğu için yapılmış sayılmaz.

Login veya privilege değişiminde session identifier’ını server’da yenile; eski generation’ın korumalı işlemlerde kabulünü kapat. Idle ve absolute deadline’ı her korumalı request’te trusted server state üzerinden uygula; Browser cookie expiry’sini bu kontrolün yerine koyma. Logout’ta önce ilgili server kaydını geçersizleştir, ardından cookie temizleme talimatını gönder. “Bu session” ile “bütün cihazlar” kapsamını açıkça ayır. Rotation sonrası eski generation, deadline eşitliği ve logout sonrası eski handle için ret bekle; terminal kayıt eksikse global revoke sonucu çıkarma.

ŞİMDİ VAKAYA UYGULA

Cookie varlığı ile server kabulü nasıl ayrılır?

Duru’nun browser’ında sid-b cookie etiketi dururken ledger-b generation’ı logout veya idle expiry nedeniyle sona erebilir. Cookie saklama süresi, server kabul kararı ve lifecycle kanıtı ayrı sahiplerdedir.

Vakadaki handle, server binding ve session lifetime için ayrı observation ara. Browser’da kalan değer server’ın güncel kabul kararını tek başına anlatır mı?

Bağlı vaka dosyasını aç ↗

ÖRNEĞİ BİRLİKTE OKUYALIM

Sentetik cookie ile session ledger’ını birlikte okumak

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "origin": "https://library.outreason.example",
  "classification": "inert educational fixture; no working credential",
  "setCookieIllustration": "__Host-hd_session=SYNTHETIC_AUTH_B; Path=/; Secure; HttpOnly; SameSite=Lax; Max-Age=1800",
  "logoutSetCookieIllustration": "__Host-hd_session=; Path=/; Secure; HttpOnly; SameSite=Lax; Max-Age=0",
  "modelAliases": {
    "sid-a": "anonymous browser handle label",
    "sid-b": "authenticated browser handle label",
    "ledger-a": "audit ref for previous generation",
    "ledger-b": "audit ref for current generation"
  },
  "policy": {
    "clockUnit": "seconds since scenario start",
    "idleTimeout_s": 300,
    "absoluteTimeout_s": 1800,
    "loginCreatedAt_s": 10,
    "absoluteDeadline_s": 1810,
    "activity": "accepted protected check",
    "boundary": "reject at now >= deadline"
  },
  "idleBranch": {
    "ledger": [
      {
        "seq": 1,
        "clock_s": 0,
        "event": "anonymous_created",
        "generationRef": "ledger-a",
        "subject": null,
        "result": "created",
        "reason": "anonymous_state",
        "requestId": "demo-session-1"
      },
      {
        "seq": 2,
        "clock_s": 10,
        "event": "session_rotated",
        "generationRef": "ledger-b",
        "previousGenerationRef": "ledger-a",
        "subject": "Duru",
        "tenant": "Atlas",
        "result": "active",
        "reason": "authenticated_transition",
        "requestId": "demo-session-2",
        "previousGenerationState": "invalidated"
      },
      {
        "seq": 3,
        "clock_s": 10,
        "event": "response_pending",
        "generationRef": "ledger-b",
        "result": "not_arrived",
        "reason": "cookie_jar_still_sid_a",
        "requestId": "demo-session-2"
      },
      {
        "seq": 4,
        "clock_s": 10,
        "event": "cookie_arrived",
        "generationRef": "ledger-b",
        "result": "stored",
        "reason": "jar_updated_to_sid_b",
        "requestId": "demo-session-2"
      },
      {
        "seq": 5,
        "clock_s": 70,
        "event": "session_check",
        "generationRef": "ledger-b",
        "result": "accepted",
        "reason": "active_within_deadlines",
        "requestId": "demo-session-3",
        "lastSeen_s": 70
      },
      {
        "seq": 6,
        "clock_s": 370,
        "event": "session_expired",
        "generationRef": "ledger-b",
        "result": "expired",
        "reason": "idle_deadline_reached",
        "requestId": "demo-session-4"
      },
      {
        "seq": 7,
        "clock_s": 370,
        "event": "session_check",
        "generationRef": "ledger-b",
        "result": "rejected",
        "reason": "idle_expired",
        "requestId": "demo-session-4",
        "lastSeen_s": 70
      }
    ],
    "expectedAt370": {
      "cookieJar": "sid-b may remain until browser lifetime ends",
      "serverGeneration": "expired",
      "sessionDecision": "rejected",
      "lastSeen_s": 70
    }
  },
  "logoutBranch": {
    "startsAfterSeq": 5,
    "ledger": [
      {
        "seq": 6,
        "clock_s": 90,
        "event": "session_revoked",
        "generationRef": "ledger-b",
        "result": "revoked",
        "reason": "user_logout",
        "requestId": "demo-session-5"
      },
      {
        "seq": 7,
        "clock_s": 90,
        "event": "response_pending",
        "generationRef": "ledger-b",
        "result": "not_arrived",
        "reason": "cookie_clear_not_yet_received",
        "requestId": "demo-session-5"
      },
      {
        "seq": 8,
        "clock_s": 90,
        "event": "cookie_cleared",
        "generationRef": "ledger-b",
        "result": "removed",
        "reason": "matching_scope_max_age_zero",
        "requestId": "demo-session-5"
      }
    ],
    "expectedProtectedDecision": "rejected even if clearing response is lost"
  },
  "correlationQuery": {
    "language": "KQL",
    "backend": "Azure Data Explorer or compatible Kusto engine; embedded datatable requires no ingest mapping",
    "schema": "seq:int, event:string, generationRef:string, result:string",
    "query": "// Synthetic fixture only. seq is local scenario order, not a distributed timestamp.\nlet Events = datatable(seq:int, event:string, generationRef:string, result:string)\n[\n  5, 'session_check', 'ledger-b', 'accepted',\n  6, 'session_expired', 'ledger-b', 'expired',\n  7, 'session_check', 'ledger-b', 'rejected'\n];\nlet Ended = Events\n| where event in ('session_expired', 'session_revoked')\n| summarize endSeq=min(seq) by generationRef;\nEvents\n| where event == 'session_check' and result == 'accepted'\n| join kind=inner Ended on generationRef\n| where seq > endSeq\n| project generationRef, seq, endSeq, result",
    "expectedIdleBranchRows": 0,
    "positiveFixtureChange": "Add seq=8, event=session_check, generationRef=ledger-b, result=accepted to the embedded datatable; expected one row. This is an integrity fixture, not an attack step.",
    "executed": false
  }
}
SYNTHETIC_AUTH_B / sid-b
Kullanılabilir secret değil; authenticated handle’ı görsel olarak izlemek için sabit fixture etiketi. Gerçek session generation yöntemi gösterilmez.
__Host-hd_session, Path=/, Domain yok
Destekleyen Browser’da host-only ve root-path prefix koşulları; başka bir resource için yetki kararı değil.
Secure / HttpOnly / SameSite=Lax
Sırasıyla taşıma, script erişimi ve site bağlamına göre inclusion; server validity’den bağımsız sınırlar.
Max-Age=1800 / Max-Age=0
Browser saklama/temizleme talimatı; store TTL veya server logout sonucu değil.
generationRef / previousGenerationRef
Audit correlation için bizim şemamızın referansları. Cookie değeri olarak kabul edilmez; her generation ayrıdır.
clock_s / seq
Explicit model clock ve tek branch içindeki event sırası. Gerçek saat, Windows Event ID veya dağıtık global ordering iddiası yok.
lastSeen_s / absoluteDeadline_s
Idle hesabının son accepted activity noktası ve activity’den bağımsız absolute deadline. t=370 rejected request lastSeen’i değiştirmez.
event / result / reason
Application-owned sentetik lifecycle kaydı ve karar gerekçesi; gateway access log’una otomatik eşlenmez.
requestId
Tek check/response işlemini ilişkilendirir; authenticated identity veya session secret değildir.
idleBranch / logoutBranch
Aynı accepted state’ten ayrılan alternatif senaryolar; tek timeline’da expiry’den sonra logout yapılmış gibi birleştirilmez.

HTTPS header örneği inert metindir. Ledger gerçek session capture veya framework log’u değildir. KQL çalıştırılmamış inceleme mantığıdır; identity doğrulaması, cryptographic token validation ve dağıtık cache davranışı bu fixture’da uygulanmaz. Loopback HTTP labı farklı cookie adını/flags’ini açıklamalı kullanabilir; bu HTTPS __Host- örneğini aynen çalıştırdığı varsayılmaz.

İki yanlış kanı

HttpOnly olan cookie, JavaScript kullanılan her güvenlik sorununu engeller.

HttpOnly cookie değerine script erişimini sınırlar; uygun script kaynaklı request’lere cookie yine eklenebilir. Action güvenliği ve resource policy ayrıca gerekir.

Browser’daki cookie silinince server session da otomatik iptal olur.

Cookie jar ve session store ayrı state’tir. Server invalidation ayrıca uygulanır; jar temizliği tek başına revoked state kanıtı değildir.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

Son kabul edilen kontrol 70 anında; idle timeout=300 ve now=370. Reddedilen kontrol lastSeen’i yeniler mi?

  1. Hayır. Idle expiry olur; lastSeen=70 kalır.
  2. Evet. Gelen her request expiry’yi süresiz uzatır.
Gerekçeli cevabı oku

Hayır. Idle expiry olur; lastSeen=70 kalır. — 70+300=370 ile deadline’a ulaşılmıştır. Reddedilen kontrol, kabul edilmiş activity değildir.

Logout sırasında cookie clear response’u kayboldu. Revoked session yeniden kabul edilir mi?

Dersten seçilen artifact alanları; öğretim örneği

logoutBranch.ledger[0]
{"seq":6,"clock_s":90,"event":"session_revoked","generationRef":"ledger-b","result":"revoked","reason":"user_logout","requestId":"demo-session-5"}
logoutBranch.ledger[1]
{"seq":7,"clock_s":90,"event":"response_pending","generationRef":"ledger-b","result":"not_arrived","reason":"cookie_clear_not_yet_received","requestId":"demo-session-5"}
logoutBranch.expectedProtectedDecision
rejected even if clearing response is lost
  1. Evet. Jar temizlenene kadar server session aktif sayılır.
  2. Hayır. Server revocation, protected erişimi kapatır.
Gerekçeli cevabı oku

Hayır. Server revocation, protected erişimi kapatır. — Jar eski handle’ı saklasa da güvenilen generation revoked durumundadır. Clear response’un delivery sonucu bu kararı yeniden açmaz.

Login rotation’da ledger-a geçersiz, ledger-b active. Neden Cookie arrival’dan önce browser’ın sid-a state’ini değiştiremeyiz?

Gerekçeli cevabı oku

Server rotation, güvenilen yerel generation’ı değiştirir; yeni Cookie response ile taşınır. Response beklenirken jar sid-a olarak kalır. cookie_arrived sonrasında sid-b kurulur. Audit generationRef correlation içindir; kullanılabilir credential değildir. KQL expected row’ları sentetik sıralamayı açıklar; gerçek detection veya distributed runtime çalışması değildir.

□ Store rotation ile jar arrival’ını ayırdım.

□ Audit alias ve beklenen detection sonucunu çalışan credential ya da runtime kanıtı saymadım.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

MANUAL LAB

Request, session ve resource policy

İki workbook ile gerçek loopback HTTP request, cookie/store ayrımı ve seeded permission kararlarını izle.

Tahmin → gözlem → açıklama workbook’unu aç ↗GitHub kaynakları ↗

Kaynaklar ve kapsam