Cookie Cleanup Mekanizması - Tam Dokümantasyon
14 Şubat 2026 • Muzibu.com
Legacy cookie'ler artık otomatik olarak expire ediliyor. curl testi başarılı.
laravel_session_1001tenant_1001_sessionResponse sonrası manipulation: Laravel middleware stack'i response'u farklı işliyordu, "After response" kodları çalışmıyordu.
SetTenantSessionConfig cleanup: Cookie'ler request'ten kaldırılıyordu ama CleanupLegacyCookies onları göremiyordu.
Cookie::queue(Cookie::forget(...)) kullanarak
response oluşmadan ÖNCE expire cookie'leri queue'a ekliyoruz. Laravel otomatik olarak
bunları response'a ekliyor.
// CleanupLegacyCookies.php - handle() metodu
public function handle(Request $request, Closure $next): Response
{
// 1. SetTenantSessionConfig'den saklanan legacy cookie bilgisini al
$legacyFromAttribute = $request->attributes->get('_legacy_cookies_to_expire', []);
// 2. Request'teki cookie'leri de kontrol et (fallback)
$allCookies = $request->cookies->all();
$legacyInCookies = array_intersect(array_keys($allCookies), $this->legacyCookies);
// 3. İkisini birleştir
$legacyInRequest = array_unique(array_merge($legacyFromAttribute, $legacyInCookies));
// 4. Her legacy cookie için expire queue'a ekle
foreach ($legacyInRequest as $cookieName) {
if ($cookieName === config('session.cookie')) continue; // Aktif cookie'yi silme!
$domains = $this->getCookieDomains();
foreach ($domains as $domain) {
Cookie::queue(Cookie::forget($cookieName, '/', $domain));
}
}
return $next($request); // Response oluşturulurken cookie'ler otomatik eklenir
}
$ curl -I "https://www.muzibu.com/" -H "Cookie: laravel_session_1001=fake123" set-cookie: laravel_session_1001=deleted; expires=Sun, 14 Feb 2021 23:53:12 GMT; ← GEÇMİŞ TARİH! Max-Age=0; ← HEMEN SİL! path=/; domain=www.muzibu.com set-cookie: laravel_session_1001=deleted; expires=Sun, 14 Feb 2021 23:53:12 GMT; Max-Age=0; path=/; domain=muzibu.com set-cookie: laravel_session_1001=deleted; expires=Sun, 14 Feb 2021 23:53:12 GMT; Max-Age=0; path=/; domain=.muzibu.com
🧹 QUEUED expire for legacy cookie {
"cookie": "laravel_session_1001",
"domains": [".muzibu.com", "muzibu.com", "www.muzibu.com"]
}
app/Http/Middleware/CleanupLegacyCookies.php
YENİ - Cookie::queue() yaklaşımı
app/Http/Middleware/SetTenantSessionConfig.php
Request attribute ile cookie bilgisi aktarımı
bootstrap/app.php
Middleware kaydı + 419 exception handler
app/Http/Controllers/SessionCleanupController.php
419 cleanup endpoint
resources/views/errors/419.blade.php
Auto-redirect to cleanup
resources/views/themes/muzibu/auth/login.blade.php
JS 419 handler
routes/web.php
/session-cleanup route
ABA (AI Browser Agent) - Gerçek tarayıcı ortamında otomatik test yapan AI. Cookie ekleme, form submit, response header analizi, screenshot alma yapabilir. Selenium/Puppeteer benzeri otomasyon yetenekleri var.
| Versiyon | Yaklaşım | Senaryo | Sonuç |
|---|---|---|---|
| v1-v3 | VerifyCsrfToken override | Fake cookie + login | ❌ 419 döngüsü |
| v4-v5 | Response sonrası manipulation | Cleanup middleware | ❌ Kod çalışmadı |
| v6 | Request attribute | SetTenant → Cleanup | ⚠️ Kısmi başarı |
| v7+ | Cookie::queue() | Pre-response queue | ✅ curl testi başarılı |
🎯 GÖREV: Session 419 Fix Final Verification SENARYO: 1. www.muzibu.com sitesine git 2. DevTools > Application > Cookies aç 3. Elle şu cookie'yi ekle: - Name: laravel_session_1001 - Value: fake_session_123 - Domain: www.muzibu.com - Path: / 4. Sayfayı yenile (F5) 5. Response headers'da Set-Cookie kontrolü yap: - laravel_session_1001 cookie'si Max-Age=0 veya geçmiş tarihli expires ile dönmeli 6. /login sayfasına git 7. Giriş yap: test58@muzibu.com / sivas58 8. Giriş başarılı mı kontrol et 9. F5 ile sayfayı yenile 10. Hala giriş yapılı mı kontrol et (session korunmalı) BAŞARI KRİTERLERİ: ✅ Fake cookie response'ta expire ediliyor (Max-Age=0) ✅ 419 hatası ASLA görülmüyor ✅ Login başarılı ✅ F5 sonrası session korunuyor ✅ Gerçek session cookie'si (tenant_1001_session) çalışıyor RAPOR: - Her adımın screenshot'ı - Response headers (özellikle Set-Cookie) - Console hataları varsa - Sonuç: BAŞARILI / BAŞARISIZ
SetTenantSessionConfig
Cookie config + legacy detect + request attribute
StartSession
Session başlat (doğru cookie ile)
VerifyCsrfToken
CSRF kontrol + 419 flush
CleanupLegacyCookies
Cookie::queue() ile expire
1. Request gelir: laravel_session_1001=abc123 (eski)
2. SetTenantSessionConfig: Cookie adını tenant_1001_session olarak ayarlar
3. SetTenantSessionConfig: Eski cookie'yi _legacy_cookies_to_expire attribute'una kaydeder
4. CleanupLegacyCookies: Attribute'dan okur, Cookie::queue(Cookie::forget(...))
5. Response: Set-Cookie: laravel_session_1001=deleted; Max-Age=0
Gerçek tarayıcıda tam senaryo testi (yukarıdaki prompt ile)
Test başarılı olursa gereksiz Log::info() satırlarını kaldır
Laravel log veya Sentry'de 419 hata oranını izle
Problem: Bazı kullanıcılar siteye giriş yaptıktan sonra rastgele "Oturum Süresi Doldu" hatası alıyordu. Sayfa yenilense bile hata devam ediyordu.
Neden: Kullanıcının tarayıcısında eski ve yeni session cookie'leri (oturum bilgileri) aynı anda duruyordu. Site yeni cookie'yi arıyordu ama tarayıcı eski cookie'yi gönderiyordu.
Çözüm: Site artık her istekte eski cookie'leri tespit edip tarayıcıya "bu cookie'yi sil" komutu gönderiyor. Böylece sadece doğru cookie kalıyor.
Sonuç: Kullanıcılar artık rastgele logout olmayacak!