v3 - Final Documentation

Session 419 Fix

Cookie Cleanup Mekanizması - Tam Dokümantasyon

14 Şubat 2026 • Muzibu.com

Cookie Expire Mekanizması Aktif!

Legacy cookie'ler artık otomatik olarak expire ediliyor. curl testi başarılı.

Problem Özeti

Belirti

  • Rastgele "Oturum Süresi Doldu" (419) hatası
  • Sayfa yenilemede session kaybı
  • Login sonrası anında logout
  • 419 kısır döngüsü (escape edilemiyor)

Kök Neden

  • Çoklu session cookie çakışması
  • Eski format: laravel_session_1001
  • Yeni format: tenant_1001_session
  • CSRF token farklı session'dan okunuyor

Çözüm: Cookie Queue Yaklaşımı

Neden Önceki Yaklaşımlar Çalışmadı?

Response 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.

Çalışan Çözüm

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
}

Test Sonuçları

curl Test (BAŞARILI)

$ 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

Log Çıktısı

🧹 QUEUED expire for legacy cookie {
    "cookie": "laravel_session_1001",
    "domains": [".muzibu.com", "muzibu.com", "www.muzibu.com"]
}

Değiştirilen Dosyalar

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 Test Metodolojisi

ABA Nedir?

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.

Test Geçmişi

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ı

ABA Final Test Promptu

🎯 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

Teknik Mimari

Middleware Sırası

1 SetTenantSessionConfig Cookie config + legacy detect + request attribute
2 StartSession Session başlat (doğru cookie ile)
3 VerifyCsrfToken CSRF kontrol + 419 flush
4 CleanupLegacyCookies Cookie::queue() ile expire

Cookie Flow

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

Sonraki Adımlar

1

ABA Final Testi

Gerçek tarayıcıda tam senaryo testi (yukarıdaki prompt ile)

Bekliyor
2

Debug Loglarını Temizle

Test başarılı olursa gereksiz Log::info() satırlarını kaldır

Test sonrası
3

Monitoring

Laravel log veya Sentry'de 419 hata oranını izle

Sürekli

Basit Anlatım

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!