Muzibu Session & Multi-Device Yönetimi

📅 26 Kasım 2025 | 🎯 Tenant 1001 (muzibu.com) | 👤 Session + Login Stratejisi

🎯 Sorun Tanımı

Kullanıcı Soruları:
1. Sisteme giriş yapılanlar DB'ye mi kaydediliyor, Redis mi?
2. Multi-device kontrolü nasıl yapılmalı?
3. 1 sene boyunca çıkış yapmazsa ne olur?
4. Tenant bazlı farklı sistemler kullanılabilir mi? (Tenant 2 → DB, Tenant 1001 → Redis)

Neden Önemli?

Premium Limit Sistemi ile Doğrudan Bağlantılı:

  • Günlük 5 şarkı limiti: Her giriş ayrı bir oturum mu? Yoksa aynı user_id = tek limit mi?
  • 3 cihaz limiti: Kullanıcı telefon + tablet + bilgisayardan aynı anda dinlerse?
  • Session hijacking: Kullanıcı 1 yıl çıkış yapmazsa güvenlik riski
  • Performance: 10K+ aktif kullanıcı varsa DB mi Redis mi?

📦 Laravel Session Sistemleri

❌ File (Default)

Nasıl çalışır?

  • Session dosyası: storage/framework/sessions/
  • Her session = 1 dosya

Sorunlar:

  • Yavaş (disk I/O)
  • Load balancer'da çalışmaz
  • 10K+ session = 10K+ dosya!

⚠️ Database

Nasıl çalışır?

  • sessions tablosu
  • user_id + ip_address + user_agent
  • last_activity timestamp

Artılar:

  • Multi-server destekler
  • Query ile analiz yapılabilir
  • Tarihsel veri saklama

Eksiler:

  • Her istek = DB query (yavaş)
  • 10K+ concurrent user → DB yük

✅ Redis

Nasıl çalışır?

  • In-memory cache
  • Key: session_id
  • Value: Serialized session data
  • TTL: Otomatik expire

Artılar:

  • Çok hızlı (RAM)
  • Auto-expire (1 yıl sonra otomatik silinir)
  • Multi-server destekler
  • 100K+ session idare eder

Eksiler:

  • Redis kurulumu gerekli
  • RAM kullanımı (her session ~1-5KB)
  • Persistent değil (restart = kayıp)
✅ ÖNERİ: Redis kullan, ama session verilerini database'e de yedekle (hybrid yaklaşım).

📱 Multi-Device Senaryoları

Senaryo 1: Kullanıcı 3 cihazda aynı anda login

Durum: Ahmet premium üye. Telefon + Tablet + PC'den aynı anda dinliyor.

Soru: Bu 3 ayrı session mı? Günlük 5 şarkı limiti her cihaz için mi, yoksa toplam mı?

Login (Telefon)
+
Login (Tablet)
+
Login (PC)
3 Session

Çözüm A: Tek Limit (User Bazlı)

  • user_id bazlı limit kontrol
  • 3 cihazdan toplam 5 şarkı
  • DB: getTodayPlayedCount($userId)
  • Avantaj: Adil, kötüye kullanım engellenir
  • Dezavantaj: Kullanıcı "cihaz başına 5 şarkı" sanabilir

Çözüm B: Cihaz Bazlı Limit

  • device_id (fingerprint) bazlı limit
  • Her cihazda ayrı 5 şarkı
  • 3 cihaz = 15 şarkı/gün (kullanıcı için)
  • Avantaj: Esnek, premium hissi
  • Dezavantaj: Kötüye kullanılabilir (10 cihaz = 50 şarkı)
✅ ÖNERİLEN: Çözüm A (User Bazlı Limit)
Günlük limit user_id'ye bağlı. Premium kullanıcılar için cihaz limiti yok (sınırsız cihaz), ama günlük şarkı limiti tek.

Senaryo 2: Concurrent Playback (Aynı Anda 2 Cihazda Oynatma)

Durum: Ahmet telefonda şarkı dinlerken, PC'den de şarkı açtı.

Soru: Bu izin verilmeli mi?

Yaklaşım A: İzin Ver (Spotify Tarzı)

  • 2 cihazda aynı anda oynatabilir
  • Premium kullanıcılar için normal
  • Sorun: Hesap paylaşımı artabilir

Yaklaşım B: Engelle (Netflix Tarzı)

  • 2. cihaz oynatınca 1. cihaz durur
  • Modal: "Başka cihazda oynatma başlatıldı"
  • Avantaj: Hesap paylaşımı zorlaşır

Yaklaşım C: Hibrit (Premium İçin İzin Ver)

  • Normal üye: Tek cihaz
  • Premium: 3 cihaz concurrent
  • Avantaj: Premium'a değer katar
✅ ÖNERİLEN: Yaklaşım C (Hibrit)
Premium kullanıcılar max 3 cihazda aynı anda dinleyebilir. Normal üye tek cihaz.

⏳ 1 Yıl Boyunca Çıkış Yapmazsa Ne Olur?

Sorun: Persistent Session (Kalıcı Oturum)

Kullanıcı "Beni Hatırla" seçerse Laravel remember_token oluşturur:

  • Cookie: remember_web_[hash]
  • Süre: 5 yıl (Laravel default)
  • Token: users.remember_token kolonunda saklanır
  • Her istek: Token validate edilir

Güvenlik Riskleri

  • Token theft: Cookie çalınırsa 5 yıl erişim
  • Forgotten device: Eski cihazlar hala login
  • Password change: Şifre değişse bile token geçerli

Çözüm: Token Rotation + Expire

  • Max TTL: Remember token 90 gün sonra expire olsun
  • Rotation: Her 30 günde bir token yenile
  • Device tracking: users_devices tablosu (last_seen)
  • Password change: Tüm remember_token'ları sıfırla
⚠️ UYARI: Laravel default 5 yıl çok uzun! Güvenlik için 90 gün yap.

Session TTL (Time To Live)

Kullanıcı Tipi Session TTL Remember Token TTL Neden?
Guest 2 saat - Kısa süre yeter
Normal Üye 7 gün 30 gün Rahat kullanım
Premium 30 gün 90 gün Convenience
Corporate 1 gün 7 gün Güvenlik (shared device)

🏢 Tenant-Aware Session Yönetimi

Soru: Tenant 2 (ixtif.com) DB kullanabilir, Tenant 1001 (muzibu.com) Redis kullanabilir mi?

Evet! Laravel Config ile Mümkün

Her tenant kendi session driver'ını seçebilir:

Yaklaşım 1: Config Override (Basit)

  • config/session.php → Tenant bazlı override
  • Tenant 2: SESSION_DRIVER=database
  • Tenant 1001: SESSION_DRIVER=redis
  • Sorun: .env dosyası tenant bazlı değil

Yaklaşım 2: Tenant Settings Tablosu (Önerilen)

  • tenant_settings tablosu
  • key: session_driver, value: redis|database
  • InitializeTenancy middleware'de config set
  • Avantaj: Admin panel'den değiştirilebilir

Mantık (Pseudo-code)

// InitializeTenancy middleware
$tenant = Tenant::current();
$sessionDriver = $tenant->getSetting('session_driver', 'redis');

config(['session.driver' => $sessionDriver]);

// Eğer Redis:
config(['session.connection' => 'tenant_' . $tenant->id]);

// Eğer Database:
config(['session.table' => 'tenant_' . $tenant->id . '_sessions']);
✅ ÖNERİ: Tenant settings ile yapılandırılabilir yap. Muzibu (1001) → Redis, diğerleri → Database.

Neden Muzibu Redis, Diğerleri Database?

Tenant Session Driver Neden?
Tenant 1001 (Muzibu) Redis 10K+ concurrent user, yüksek performans gerekli
Tenant 2 (ixtif) Database 100-500 user, Redis gereksiz
Diğer Tenant'lar Database Düşük trafik, basit yeter

🏗️ Önerilen Mimari (Hybrid Yaklaşım)

Redis (Fast Session)
+
Database (Session Backup)
+
Device Tracking
=
Perfect!

Sistem Bileşenleri

1. Redis (Primary Session Store)

  • Session ID → Redis key
  • TTL: 30 gün (Premium), 7 gün (Normal)
  • Auto-expire: 1 yıl sonra otomatik silinir
  • Speed: 0.1ms

2. Database (Session Backup + Analytics)

  • users_sessions tablosu
  • Kolonlar: user_id, session_id, ip_address, user_agent, device_type, last_activity, expires_at
  • Her session Redis'e yazılınca DB'ye de yazılır
  • Amaç: Historical data, analytics, audit

3. Device Tracking

⚠️ TENANT-AWARE: Device tracking SADECE Tenant 1001 (Muzibu) için aktif olacak!
Diğer tenantlar için geçerli değil.
  • users_devices tablosu
  • Kolonlar: user_id, device_id (fingerprint), device_name, device_type, last_ip, last_seen_at
  • Max 10 cihaz (fazlası eski tarih sil)
  • Kullanıcı: Cihazlarımı görüntüle → Çıkış yap
  • Tenant kontrolü: if (tenancy()->tenant()->id === 1001)

Workflow (Session Oluşturma)

1. Kullanıcı login → Laravel session başlatır
2. Redis'e session yaz (session_id → data)
3. Database'e session yaz (users_sessions tablosu)
4. Device fingerprint al (FingerprintJS)
5. Device tracking güncelle (users_devices tablosu)
6. Remember token varsa 90 gün TTL set et
7. Cookie set et (remember_web_[hash])

Workflow (Session Kontrol)

1. Her istek → Session ID cookie'den al
2. Redis'te var mı kontrol et
3. Varsa → Session data döndür (0.1ms)
4. Yoksa → Database'den bak (fallback)
5. Database'de varsa → Redis'e yeniden yükle
6. Hiç yoksa → Session expired, yeniden login

🚀 İmplementasyon Planı

Faz 1: Session Sistemi (Hemen)

İşlem Dosya Öncelik
SESSION_DRIVER=redis ayarla config/session.php 🔴 Kritik
Redis connection test Terminal: redis-cli ping 🔴 Kritik
users_sessions tablosu migration database/migrations/ 🟡 Yüksek
Session middleware (DB backup) app/Http/Middleware/SessionBackup.php 🟡 Yüksek

Faz 2: Device Tracking (1 Hafta)

⚠️ TENANT-AWARE: Bu faz SADECE Tenant 1001 (Muzibu) için uygulanacak!
İşlem Dosya Öncelik
FingerprintJS kurulum package.json + app.blade.php 🟡 Yüksek
users_devices tablosu migration database/migrations/ 🟡 Yüksek
Device tracking service app/Services/DeviceTracker.php 🟢 Orta
Kullanıcı cihazlarım sayfası Frontend UI 🟢 Orta

Faz 3: Tenant-Aware Config (İleride)

İşlem Dosya Öncelik
tenant_settings tablosu migration database/migrations/ 🟢 Orta
Tenant::getSetting() helper app/Models/Tenant.php 🟢 Orta
InitializeTenancy config override app/Http/Middleware/InitializeTenancy.php 🟢 Orta
Admin panel: Session driver seçimi Admin UI ⚪ Düşük

🎯 Sonuç & Öneriler

✅ ÖNERİLEN SİSTEM:

1. Session Store: Redis (primary) + Database (backup)
2. Multi-Device: User bazlı limit (günlük 5 şarkı toplam)
3. Concurrent: Premium 3 cihaz, Normal 1 cihaz
4. Session TTL: Premium 30 gün, Normal 7 gün
5. Remember Token: 90 gün (5 yıl çok uzun!)
6. Tenant-Aware: Muzibu Redis, diğerleri Database
7. Device Tracking: FingerprintJS + users_devices tablosu

Kritik Noktalar

  • Güvenlik: Remember token rotation + expire (90 gün)
  • Performance: Redis (0.1ms) + Database fallback
  • Analytics: users_sessions tablosu (historical data)
  • User Experience: "Beni Hatırla" çalışır, ama güvenli
  • Tenant Flexibility: Her tenant kendi driver'ını seçebilir
⚠️ MİGRATION GEREKTİRMEYEN ÇÖZÜM:
Mevcut sistem Laravel'in session tablosunu zaten kullanıyorsa:
  • Sadece SESSION_DRIVER=redis değiştir
  • users_sessions tablosu opsiyonel (analytics için)
  • users_devices tablosu opsiyonel (device tracking için)
Yani hiç migration olmadan da Redis'e geçebiliriz!