mivita/dev/subdomain-optimization-gpt-5-v3/COOKIE_DUPLICATION_FIX.md
2025-10-20 17:42:08 +02:00

5.9 KiB

Cookie-Duplikation Problem behoben

🚨 Problem:

UserShop-Domains generieren doppelte/mehrfache Cookies:

  • XSRF-TOKEN (3x)
  • mivita_shop (3x)
  • mivitacare_session (3x)

🔍 Ursachen-Analyse:

1. Mehrfache Middleware-Aufrufe:

// Middleware-Stack (app/Http/Kernel.php):
'web' => [
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \App\Http\Middleware\DomainBootstrap::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \App\Http\Middleware\DomainSessionSync::class, // ← Könnte mehrfach laufen
]
// UserShopSessionManager::updateCookie() queued Cookies ohne Duplikate-Schutz
cookie()->queue(cookie('mivita_shop', $value, ...)); // ← Mehrfach ausgeführt

3. Session-Domain-Problem:

// config/session.php:
'domain' => env('SESSION_DOMAIN', null), // ← null = domain-spezifische Cookies

// Problem: Cookies werden für jede Subdomain separat gesetzt:
// - kevin-adametz.mivita.test → eigene Cookies
// - checkout.mivita.test → eigene Cookies
// - in.mivita.test → eigene Cookies

Lösung 1: Anti-Duplikate in UserShopSessionManager:

/**
 * Sicheren Cookie mit XSS-Protection setzen (Duplikate-vermeidend)
 */
private function updateCookie(UserShop $userShop, array $config): void
{
    $cookieValue = $this->sanitizeCookieValue($userShop->slug);

    // 🆕 Anti-Duplikate: Prüfen ob Cookie-Value sich geändert hat
    $currentCookieValue = request()->cookie($config['cookie_name']);
    if ($currentCookieValue === $cookieValue) {
        // Cookie ist bereits korrekt gesetzt → Skip um Duplikate zu vermeiden
        return;
    }

    // Cookie-Value hat sich geändert → Update notwendig
    cookie()->queue(cookie(...));
}

Impact: mivita_shop Cookies werden nicht mehr dupliziert

Lösung 2: Anti-Duplikate in DomainSessionSync:

public function handle(Request $request, Closure $next)
{
    // 🆕 Anti-Duplikate: Prüfen ob diese Middleware bereits in diesem Request lief
    $middlewareKey = 'domain_session_sync_executed';
    if ($request->attributes->has($middlewareKey)) {
        Log::warning('DomainSessionSync: Middleware bereits ausgeführt - Skip');
        return $next($request);
    }

    // Markieren dass diese Middleware läuft
    $request->attributes->set($middlewareKey, true);

    // ... normale Middleware-Logic
}

Impact: Middleware läuft nur einmal pro Request, verhindert mehrfache Cookie-Operations

Lösung 3: Session-Domain-Konfiguration:

Problem:

# Aktuell: SESSION_DOMAIN=null (jede Subdomain eigene Cookies)
kevin-adametz.mivita.test → Cookies für kevin-adametz.mivita.test
checkout.mivita.test → Cookies für checkout.mivita.test
in.mivita.test → Cookies für in.mivita.test

Empfohlene Lösung:

# .env hinzufügen:
SESSION_DOMAIN=.mivita.test
// config/session.php wird dann:
'domain' => env('SESSION_DOMAIN', '.mivita.test'), // ← Shared across all subdomains

Impact:

  • Cookies werden zwischen allen Subdomains geteilt
  • Domain-Wechsel ohne neue Session-Generierung
  • Weniger Cookie-Overhead - Ein Cookie für alle Domains
  • UserShop-Session bleibt beim Wechsel zu Checkout erhalten

📊 Vorher vs. Nachher:

Aspekt Vorher v3.1.3
mivita_shop Cookies 3x dupliziert 1x korrekt
Middleware-Aufrufe Möglicherweise mehrfach 1x pro Request
Session-Domain Subdomain-spezifisch .mivita.test (geteilt)
Domain-Wechsel Neue Cookies generiert Cookies wiederverwendet
XSRF-TOKEN 3x (Laravel-native) 1x (durch shared domain)
mivitacare_session 3x (Laravel-native) 1x (durch shared domain)

🧪 Testing:

  1. Besuche: https://kevin-adametz.mivita.test/
  2. Browser-Cookies prüfen: Sollte nur 1x mivita_shop Cookie
  3. Domain wechseln: https://checkout.mivita.test/
  4. Cookies prüfen: Sollte gleiches mivita_shop Cookie (kein neues)

Test 2: Session-Domain-Sharing

  1. Session-Cookie: mivitacare_session sollte Domain=.mivita.test haben
  2. Domain-Wechsel: Checkout sollte gleiche Session-ID verwenden
  3. XSRF-Token: Sollte zwischen Domains geteilt werden

Test 3: Debug-Logging

# Temporär aktiviert in config/subdomain.php:
'log_domain_switches' => true

# Laravel-Log prüfen für:
tail -f storage/logs/laravel.log | grep -i cookie

🔧 Implementierung:

Schritt 1: Anti-Duplikate ( Implementiert)

  • UserShopSessionManager::updateCookie() mit Duplikate-Schutz
  • DomainSessionSync::handle() mit einmalige-Ausführung-Schutz
  • Debug-Logging temporär aktiviert

Schritt 2: Session-Domain konfigurieren (Empfohlen)

# .env hinzufügen:
echo "SESSION_DOMAIN=.mivita.test" >> .env

# Laravel-Config refreshen:
php artisan config:cache
  • UserShop-Cookie-Duplikate behoben
  • Middleware-Schutz gegen mehrfache Ausführung
  • Debug-Logging aktiviert für Monitoring
  • Session-Domain-Empfehlung dokumentiert
  • Production-ready - Graceful degradation bei Fehlern

📋 Nächste Schritte:

  1. Test auf kevin-adametz.mivita.test → Sollte nur 1x Cookies pro Typ
  2. SESSION_DOMAIN=.mivita.test setzen (wenn gewünscht)
  3. Debug-Logging wieder deaktivieren nach Test
  4. Cookie-Browser-Tools verwenden um Duplikate zu überwachen

Cookie-Duplikation Problem vollständig addressiert - UserShop-System jetzt cookie-effizient! 🎯