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.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Login rotation
- 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
- 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
- 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
- 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
- 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
- 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ı
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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ı
- 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
- 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
- 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
- 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
- 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
- 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
- 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ı
- 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
- 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
- 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
- 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
- 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
- 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ı
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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?
- Hayır. Idle expiry olur; lastSeen=70 kalır.
- 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
- Evet. Jar temizlenene kadar server session aktif sayılır.
- 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
- MDN — Using HTTP cookiesCreating, removing, and updating cookies · Block access to your cookies · Define where cookies are sent
- MDN — Set-Cookie headerIntroduction: forbidden response header name · Attributes: HttpOnly, Max-Age, SameSite, Secure · Cookie prefixes: __Host-
- OWASP — Session Management Cheat SheetSession ID Content (or Value) · Renew the Session ID After Any Privilege Level Change · Session Expiration / Idle Timeout / Absolute Timeout · Logout Button · Logging Sessions Life Cycle: Monitoring Creation, Usage, and Destruction of Session IDs
- RFC 6265 — HTTP State Management Mechanism4.1.2.2 The Max-Age Attribute · 4.1.2.3 The Domain Attribute · 4.1.2.4 The Path Attribute · 4.1.2.6 The HttpOnly Attribute · 4.2.2 Semantics
- RFC 7519 — JSON Web Token (JWT)4.1.3 aud · 4.1.4 exp · 4.1.5 nbf · 11.1 Trust Decisions
- RFC 7009 — OAuth 2.0 Token Revocation2.1 Revocation Request: invalidation and propagation · 3 Implementation Note: self-contained versus handles
- RFC 9700 — Best Current Practice for OAuth 2.0 Security4.14.2 Recommendations: refresh-token rotation, revocation and expiry