veza/apps/web/RESUME_MIGRATION_HTTPONLY.md

3.9 KiB

Résumé Final - Migration httpOnly Cookies

Implémentation Complétée

Frontend (Phase 1)

  • withCredentials: true activé dans apiClient et refreshClient
  • tokenStorage.ts adapté (mémoire + fallback localStorage)
  • tokenRefresh.ts détecte automatiquement les cookies httpOnly
  • Mode hybride fonctionnel (localStorage ET cookies httpOnly)
  • Tests mis à jour et passants

Backend (Phase 2)

  • Handler Login: Set cookie httpOnly, retire RefreshToken du body
  • Handler Refresh: Lit cookie httpOnly (fallback body JSON), set nouveau cookie
  • Handler Register: Set cookie httpOnly, retire RefreshToken du body
  • Handler Logout: Supprime cookie refresh_token
  • SameSite=Strict configuré pour protection CSRF
  • Secure=true (HTTPS only en production)

🔄 Mode Hybride

Le système fonctionne en mode hybride pour assurer la compatibilité :

  • Refresh Token: Peut venir du cookie httpOnly (nouveau) ou du body JSON (legacy)
  • Frontend: Détecte automatiquement les cookies httpOnly
  • Backend: Accepte les deux formats pendant la transition

📋 Fichiers Modifiés

Frontend

  • apps/web/src/services/api/client.ts - withCredentials activé
  • apps/web/src/services/tokenRefresh.ts - Détection cookies httpOnly
  • apps/web/src/services/tokenStorage.ts - Stockage mémoire + fallback
  • apps/web/src/services/cookieService.ts - Service cookies créé

Backend

  • veza-backend-api/internal/handlers/auth.go - Handlers Login/Refresh/Register/Logout modifiés

🧪 Tests à Créer

Tests Unitaires Backend

  • Test Login avec cookie httpOnly
  • Test Refresh avec cookie httpOnly
  • Test Register avec cookie httpOnly
  • Test Logout supprime cookie
  • Test Refresh avec fallback body JSON (legacy)

Tests d'Intégration

  • Test persistance de session avec cookies
  • Test refresh automatique avec cookies
  • Test logout supprime cookie
  • Test compatibilité avec frontend

Tests E2E

  • Test login → refresh → logout flow complet
  • Test persistance de session après refresh navigateur
  • Test logout supprime cookie et invalide session

🔧 Configuration

Cookies Configurés

  • Name: refresh_token
  • Path: /
  • HttpOnly: true (pas accessible via JavaScript)
  • Secure: true (HTTPS only en production)
  • SameSite: Strict (protection CSRF maximale)
  • MaxAge: 30 jours (90 jours si remember_me)

Variables d'Environnement (Optionnel)

Pour permettre la configuration via variables d'environnement en développement :

COOKIE_SECURE=false        # false en dev local (HTTP)
COOKIE_SAME_SITE=lax       # lax si cross-domain nécessaire
COOKIE_DOMAIN=             # vide pour domaine actuel

📊 Sécurité Améliorée

Avant (localStorage)

  • Accessible via JavaScript (vulnérable XSS)
  • Stocké dans localStorage (accessible par scripts malveillants)
  • Pas de protection CSRF intégrée

Après (httpOnly Cookies)

  • Non accessible via JavaScript (protection XSS)
  • Stocké dans cookie httpOnly (géré par navigateur)
  • SameSite=Strict (protection CSRF)
  • Secure flag (HTTPS only en production)

🎯 Prochaines Étapes

  1. Tests: Créer les tests unitaires et d'intégration
  2. Configuration: Ajouter variables d'environnement si nécessaire
  3. Documentation: Mettre à jour la documentation API
  4. Déploiement: Tester en staging avant production
  5. Monitoring: Surveiller les performances et erreurs après déploiement

📝 Notes Importantes

  1. Secure Flag: Actuellement true (HTTPS only). En développement local avec HTTP, peut nécessiter false.
  2. SameSite: Configuré à Strict pour sécurité maximale. Peut nécessiter Lax si cross-domain nécessaire.
  3. Compatibilité: Le système fonctionne en mode hybride pour assurer la transition en douceur.