Session Logout Problemi

Derin Analiz Raporu v2

Kritik 13 Şubat 2026

Basit Anlatım

(Herkes İçin)

Ne Oluyor?

Kullanıcılar siteye giriş yapıyor, bir süre geziniyor, sonra aniden "Oturum Süresi Doldu" hatası alıp çıkış yapılmış oluyor. Bu rastgele oluyor - bazen 2 dakikada, bazen 30 dakikada, bazen hiç olmuyor.

Neden Oluyor? (Otel Kartı Benzetmesi)

Düşün ki bir otele girdin ve resepsiyon sana 3 farklı oda kartı verdi:

Kart 1

"101 numaralı oda"

Kart 2

"102 numaralı oda"

Kart 3

"103 numaralı oda"

Asansöre bindiğinde hangi kartı okutacaksın? Bazen 101'i okutuyorsun açılıyor, bazen 102'yi okutuyorsun "yetkisiz giriş" diyor.

Sistemde Olan Tam Olarak Bu:

Kullanıcıların tarayıcısında 3 farklı "oturum kartı" (cookie) birikmiş:

YENİ tenant_1001_session - Yeni sistem veriyor
ESKİ laravel_session_1001 - Eski sistem veriyor
ÇOK ESKİ muzibu_session - Aylar öncesinden kalmış

Neden AI Browser Test'inde Çıkmadı?

AI Browser Agent temiz bir tarayıcı ile test etti - hiç eski cookie yoktu. Her şey sıfırdan başladı.

Ama gerçek kullanıcılar haftalardır/aylardır siteyi kullanıyor, eski cookie'ler tarayıcılarında birikmiş durumda.

Teknik Detaylar

(Geliştiriciler İçin)

Kanıt 1: Laravel Log'larından Cookie Listesi

storage/logs/laravel.log - SpeedTest endpoint'inden toplanan veriler

// 21:45:19 - Son log kaydı
"cookies": [
"muzibu_session", // ❌ Çok eski - hâlâ var!
"tenant_1001_session", // ✓ Yeni
"laravel_session_1001" // ❌ Eski - çakışıyor!
]

SONUÇ: Kullanıcının tarayıcısında 3 farklı session cookie var. Laravel hangisini okuyacağını karıştırıyor.

Kanıt 2: Cookie Domain Tutarsızlığı

curl -I https://www.muzibu.com/login çıktısı

set-cookie: laravel_session_1001=...; domain=www.muzibu.com; secure; httponly

Mevcut Durum

Cookie Domain:

www.muzibu.com

Sadece www.muzibu.com'da çalışır

Olması Gereken

Cookie Domain:

.muzibu.com

Tüm subdomain'lerde çalışır (leading dot)

Kanıt 3: Eksik Cookie Temizleme Listesi

app/Http/Middleware/SetTenantSessionConfig.php - Satır 129

Mevcut Kod

$possibleOldCookies = [
    'muzibu_session',
    'laravel_session'
];

⚠️ laravel_session_1001 LİSTEDE YOK!

Olması Gereken

$possibleOldCookies = [
    'muzibu_session',
    'laravel_session',
    'laravel_session_1001', // ← EKSİK!
    'laravel_session_1',
    'PHPSESSID'
];

Kanıt 4: Redis Session Prefix Çalışmıyor

redis-cli KEYS "*session*" çıktısı

Mevcut Format

session_32cJXToB...
session_zp25zPCO...
session_I9j0CohQ...

Olması Gereken Format

tenant_1001_session_32cJX...
tenant_1001_session_zp25z...
tenant_1001_session_I9j0C...

TenancyServiceProvider'daki session prefix ayarı (satır 133-136) çalışmıyor.

Sorunun Akış Diyagramı

1

Kullanıcı Giriş Yapıyor

Login Controller devreye giriyor

2

Login Controller Cookie Set Ediyor

Cookie: laravel_session_1001

Domain: www.muzibu.com

3

SetTenantSessionConfig Cookie Set Ediyor

Cookie: tenant_1001_session

Domain: .muzibu.com

!

ÇAKIŞMA!

Kullanıcı tarayıcısında 2 cookie var:

laravel_session_1001 + tenant_1001_session
5

Sonraki Request

Tarayıcı hangisini gönderecek? → RASTGELE!

laravel_session_1001 Gönderildi

Sunucu: "Bu session ID Redis'te yok veya farklı bir key'de"

→ 419 HATA / LOGOUT

tenant_1001_session Gönderildi

Sunucu: "Session bulundu, kullanıcı doğrulandı"

→ OK, DEVAM

Etkilenen Dosyalar

Dosya Sorun Satır Öncelik
app/Http/Middleware/SetTenantSessionConfig.php laravel_session_1001 expire listesinde yok 129 Kritik
bootstrap/app.php Middleware priority sıralaması 68-71 Yüksek
app/Providers/TenancyServiceProvider.php Redis session prefix çalışmıyor 133-136 Orta
config/session.php Cookie adı dinamik hesaplanıyor 128-131 Orta

Sistem Metrikleri

1,895
Aktif Session
Normal
2.75
Memory Fragmentation
İyi (önceden 16.18 idi)
20.6M
Expired Keys
Yüksek ama sorun değil
238MB
Redis Memory
Normal

Çözüm Planı

Gece Uygulanacak

Güvenli Çözüm Garantisi

Bu plan mevcut kullanıcıları ASLA çıkış yaptırmaz. Eski cookie'ler yavaşça temizlenecek, yeni cookie'ler düzgün çalışacak.

1

Eski Cookie Temizleme Listesini Güncelle

KRİTİK DÜŞÜK RİSK

Dosya: app/Http/Middleware/SetTenantSessionConfig.php - Satır 129

// DEĞİŞİKLİK:
$possibleOldCookies = ['muzibu_session', 'laravel_session'];
$possibleOldCookies = [ 'muzibu_session', 'laravel_session', 'laravel_session_1001', // ← YENİ 'laravel_session_1', // ← YENİ 'PHPSESSID', // ← YENİ ];

Ne yapacak: Her request'te eski cookie'leri expire edecek. Kullanıcılar birkaç gün içinde temizlenecek.

2

Middleware Priority Sıralamasını Düzelt

YÜKSEK ORTA RİSK

Dosya: bootstrap/app.php - Satır 68-71

// DEĞİŞİKLİK:
$middleware->priority([ SetTenantSessionConfig::class, // ← EN ÖNCE InitializeTenancy::class, StartSession::class, ]);

Ne yapacak: Cookie config'i session başlamadan ÖNCE ayarlanacak.

3

Cookie Domain'i www İçin de Expire Et

ORTA DÜŞÜK RİSK

Dosya: app/Http/Middleware/SetTenantSessionConfig.php - Satır 136-146

// Her eski cookie için 3 domain'de expire et:
cookie()->forget($oldCookie, '/', '.muzibu.com'); cookie()->forget($oldCookie, '/', 'www.muzibu.com'); cookie()->forget($oldCookie, '/', 'muzibu.com');

Ne yapacak: Tüm domain varyasyonlarındaki eski cookie'leri temizleyecek.

Uygulama Sonrası Test Planı

  1. 1. Tarayıcıda tüm cookie'leri sil, yeni login yap
  2. 2. Cookie'leri kontrol et: sadece tenant_1001_session olmalı
  3. 3. Cookie domain'i kontrol et: .muzibu.com olmalı
  4. 4. 5 dakika bekle, sayfa yenile - session korunmalı
  5. 5. Farklı sayfalara git - session korunmalı