Multi-tenant sistemde session lifetime ve CSRF token uyumsuzluğu sorunu
Sorun Nedir?
Sitelerinizde (ixtif.com, muzibu.com) kullanıcılar sayfayı açtıktan 2 saat sonra işlem yapmak istediğinde
"419 Page Expired" hatası alıyorlar. Özellikle Livewire ile çalışan dinamik sayfalar etkileniyor.
Neden Oluyor?
Güvenlik için her kullanıcıya bir "oturum süresi" veriliyor. Şu anda bu süre sadece 2 saat.
Kullanıcı sayfayı açık bırakıp 2 saatten sonra bir butona tıkladığında, sistem "oturumun süresi doldu"
diyor ve işlemi reddediyor.
Neden Önemli?
• Kullanıcı deneyimi bozuluyor (sayfayı yenilemek zorunda kalıyor)
• Müzik platformunda (muzibu.com) şarkı dinlerken oturum kapanıyor
• E-ticaret sitelerinde (ixtif.com) sepet işlemleri yarıda kalabiliyor
• Profesyonel olmayan bir izlenim veriyor
🎯 Hedef:
Oturum süresini 2 saatten 7 güne çıkararak kullanıcıların haftalarca giriş yapmadan site kullanabilmesini sağlamak.
/livewire/update:1 Failed to load resource: the server responded with a status of 419 ()
Mevcut Durum:
auth_session_lifetime = 120 dakika (2 saat)auth_session_lifetime = 120 dakika (2 saat)SESSION_LIFETIME = 10080 dakika (7 gün) ✅Sorun: Tenant'lar 2 saat, central 7 gün kullanıyor. Tutarsızlık var!
Dosya: app/Providers/TenancyServiceProvider.php:117-119
// 🔐 Session lifetime: Tenant setting'den al
$sessionLifetime = (int) setting('auth_session_lifetime', 525600);
if ($sessionLifetime > 0) {
config(['session.lifetime' => $sessionLifetime]);
}
Sorun: Her tenant kendi setting'ini kullanıyor, .env SESSION_LIFETIME override ediliyor.
Default: 525600 dakika (1 yıl!) ama tenant'larda 120 set edilmiş.
Durum: ✅ Doğru çalışıyor
Durum: ✅ Güvenlik ayarları doğru
secure: true → HTTPS zorunlu ✅httponly: true → JS erişimi engelli ✅samesite: lax → CSRF koruması ✅domain: .domain.com → Subdomain desteği ✅/livewire/update request atılıyorTüm tenant'larda auth_session_lifetime değerini 10080 dakikaya (7 gün) çıkar.
Komut:
php artisan tinker
// Tenant 2 (ixtif.com)
tenant(2);
setting(['auth_session_lifetime' => 10080]);
echo "İxtif setting güncellendi: " . setting('auth_session_lifetime');
// Tenant 1001 (muzibu.com)
tenant(1001);
setting(['auth_session_lifetime' => 10080]);
echo "Muzibu setting güncellendi: " . setting('auth_session_lifetime');
exit;
Artıları:
Eksileri:
Tenant setting'ini kaldır, tüm tenant'lar .env SESSION_LIFETIME kullanır (10080 dakika).
Kod Değişikliği:
Dosya: app/Providers/TenancyServiceProvider.php:116-120
// ❌ KALDIR // 🔐 Session lifetime: Tenant setting'den al $sessionLifetime = (int) setting('auth_session_lifetime', 525600); if ($sessionLifetime > 0) { config(['session.lifetime' => $sessionLifetime]); } // ✅ EKLE (ya da sadece yukarıyı sil, .env default kullanılır) // Session lifetime .env'den alınır (SESSION_LIFETIME=10080)
Artıları:
Eksileri:
Tenant setting varsa kullan, yoksa .env SESSION_LIFETIME'a düş. Minimum değer kontrolü ekle.
Kod Değişikliği:
// 🔐 Session lifetime: Tenant setting'den al (fallback: .env)
$sessionLifetime = (int) setting('auth_session_lifetime', config('session.lifetime'));
// ⚠️ Minimum 7 gün kontrolü (güvenlik)
if ($sessionLifetime < 10080) {
\Log::warning("Tenant session lifetime çok kısa, 7 güne çekildi", [
'tenant_id' => tenant()->id,
'old_lifetime' => $sessionLifetime,
]);
$sessionLifetime = 10080;
}
config(['session.lifetime' => $sessionLifetime]);
Artıları:
Eksileri:
# Session lifetime kontrolü
php artisan tinker --execute="tenant(2); echo setting('auth_session_lifetime');"
php artisan tinker --execute="tenant(1001); echo setting('auth_session_lifetime');"
# Cookie test
curl -I -k https://ixtif.com/ | grep -i "set-cookie"
curl -I -k https://muzibu.com/ | grep -i "set-cookie"
# Cache temizle
php artisan config:clear
php artisan cache:clear
php artisan responsecache:clear
# Session lifetime kontrolü (10080 olmalı)
php artisan tinker --execute="tenant(2); echo setting('auth_session_lifetime');"
# Cookie Max-Age kontrolü (604800 saniye = 7 gün olmalı)
curl -I -k https://ixtif.com/ | grep -i "max-age"
7 günlük session süresi güvenli. Otomatik logout sistemi mevcut (kullanıcı logout yapınca session kapanır).
7 günlük session Redis'te daha fazla yer kaplayabilir ama Redis'in memory limiti yeterli (6GB). 317 aktif session → ~1MB kullanım.
Değişiklik sonrası MUTLAKA config:clear, cache:clear, responsecache:clear çalıştır!
Mevcut kullanıcılar logout olabilir (cookie yenilenecek). Kullanıcılara duyuru yapılabilir.
Performans Etkisi: Yok. Redis'te session sayısı değişmez, sadece TTL uzar. Memory kullanımı minimal artış (~%5-10).