# language: fr @api @authentication @sessions @mvp Fonctionnalité: Gestion des sessions multi-appareils En tant qu'utilisateur Je veux gérer mes sessions actives sur plusieurs appareils Afin de contrôler l'accès à mon compte et améliorer la sécurité Contexte: Étant donné que le système supporte les sessions suivantes: | Paramètre | Valeur | | Nombre max de sessions simultanées | 5 | | Durée de vie d'une session | 30 jours | | Durée d'inactivité avant expiration | 7 jours | | Durée du token de refresh | 90 jours | | Taille max du stockage de session | 10 KB | Scénario: Création d'une nouvelle session avec empreinte d'appareil Étant donné un utilisateur "alice@roadwave.fr" non connecté Quand l'utilisateur se connecte depuis un iPhone 14 Pro avec iOS 17.2 Alors une nouvelle session est créée avec les métadonnées: | Champ | Valeur | | Device Type | mobile | | OS | iOS 17.2 | | App Version | 1.2.3 | | Device Model | iPhone 14 Pro | | Browser | N/A | | IP Address | 1.2.3.4 | | Geolocation | Paris, France | | Created At | 2026-02-03T14:32:18Z | | Last Activity | 2026-02-03T14:32:18Z | Et un token JWT avec durée de vie de 30 jours est généré Et un refresh token avec durée de vie de 90 jours est généré Et un événement "SESSION_CREATED" est enregistré Et la métrique "sessions.created" est incrémentée Scénario: Connexion simultanée sur plusieurs appareils Étant donné un utilisateur "bob@roadwave.fr" connecté sur: | Appareil | OS | Dernière activité | | iPhone 13 | iOS 16.5 | Il y a 5 min | | iPad Pro | iPadOS 17.1 | Il y a 2 heures | | MacBook Pro | macOS 14.2 | Il y a 1 jour | Quand l'utilisateur se connecte depuis un Samsung Galaxy S23 Alors une nouvelle session est créée Et l'utilisateur a maintenant 4 sessions actives Et toutes les sessions précédentes restent valides Et un événement "NEW_DEVICE_LOGIN" est enregistré Et une notification push est envoyée sur tous les appareils: "Nouvelle connexion depuis Samsung Galaxy S23" Scénario: Limitation du nombre de sessions simultanées Étant donné un utilisateur "charlie@roadwave.fr" avec 5 sessions actives Quand l'utilisateur se connecte depuis un 6ème appareil Alors la session la plus ancienne est automatiquement révoquée Et une nouvelle session est créée pour le nouvel appareil Et l'utilisateur reçoit une notification: "Votre session sur [Ancien Appareil] a été fermée automatiquement" Et un événement "SESSION_EVICTED_MAX_LIMIT" est enregistré Et la métrique "sessions.evicted.max_limit" est incrémentée Scénario: Liste des sessions actives dans les paramètres du compte Étant donné un utilisateur "david@roadwave.fr" avec 3 sessions actives Quand l'utilisateur accède à "Mon compte > Sécurité > Appareils connectés" Alors l'utilisateur voit la liste suivante: | Appareil | Localisation | Dernière activité | IP | Actions | | iPhone 14 Pro | Paris, France | Actif maintenant | 1.2.3.4 | [Cet appareil]| | iPad Air | Lyon, France | Il y a 2 heures | 5.6.7.8 | [Déconnecter] | | MacBook Pro | Marseille, FR | Il y a 3 jours | 9.10.11.12| [Déconnecter] | Et la session actuelle est clairement identifiée Et un bouton "Déconnecter tous les autres appareils" est disponible Scénario: Révocation manuelle d'une session spécifique Étant donné un utilisateur "eve@roadwave.fr" avec 4 sessions actives Et il consulte la liste de ses appareils depuis son iPhone Quand l'utilisateur clique sur "Déconnecter" pour la session "MacBook Pro" Alors la session "MacBook Pro" est immédiatement révoquée Et le token JWT associé est invalidé dans Redis Et le refresh token est révoqué Et l'utilisateur sur le MacBook Pro est déconnecté lors de sa prochaine requête Et un événement "SESSION_REVOKED_MANUAL" est enregistré Et une notification est envoyée: "Vous avez été déconnecté de votre MacBook Pro" Scénario: Déconnexion de tous les autres appareils Étant donné un utilisateur "frank@roadwave.fr" avec 5 sessions actives Et il suspecte un accès non autorisé Quand l'utilisateur clique sur "Déconnecter tous les autres appareils" depuis son iPhone Alors toutes les sessions sauf la session actuelle (iPhone) sont révoquées Et 4 tokens JWT sont invalidés Et 4 refresh tokens sont révoqués Et un événement "SESSIONS_REVOKED_ALL_OTHER" est enregistré Et une notification est envoyée sur tous les appareils déconnectés Et un email de confirmation est envoyé: "Vous avez déconnecté tous vos autres appareils" Et la métrique "sessions.revoked.bulk" est incrémentée Scénario: Détection de connexion suspecte depuis un nouveau pays Étant donné un utilisateur "grace@roadwave.fr" avec sessions habituelles en France Quand l'utilisateur se connecte depuis une IP en Russie Alors une alerte de sécurité est déclenchée Et un email est envoyé: "Connexion détectée depuis Russie - Est-ce bien vous ?" Et une notification push est envoyée sur tous les appareils de confiance Et la session est créée mais marquée comme "suspecte" Et un événement "SUSPICIOUS_LOCATION_LOGIN" est enregistré avec niveau "HIGH" Et l'utilisateur doit confirmer son identité par code SMS avant d'accéder aux fonctionnalités sensibles Scénario: Expiration automatique d'une session inactive Étant donné un utilisateur "henry@roadwave.fr" avec une session sur iPad Et la session n'a pas été utilisée depuis 8 jours Quand le job de nettoyage des sessions s'exécute Alors la session iPad est automatiquement révoquée Et le token JWT est invalidé Et le refresh token est révoqué Et un événement "SESSION_EXPIRED_INACTIVITY" est enregistré Et un email est envoyé: "Votre session sur iPad a expiré suite à 8 jours d'inactivité" Et la métrique "sessions.expired.inactivity" est incrémentée Scénario: Rafraîchissement automatique du token avant expiration Étant donné un utilisateur "iris@roadwave.fr" avec une session active Et le token JWT expire dans 2 minutes Quand l'application mobile effectue une requête API Alors l'API détecte que le token expire bientôt Et un nouveau token JWT est généré automatiquement Et le nouveau token est retourné dans le header "X-Refreshed-Token" Et l'application mobile stocke le nouveau token Et un événement "TOKEN_REFRESHED" est enregistré Et la métrique "tokens.refreshed" est incrémentée Scénario: Révocation de toutes les sessions lors d'un changement de mot de passe Étant donné un utilisateur "jack@roadwave.fr" avec 4 sessions actives Quand l'utilisateur change son mot de passe depuis son iPhone Alors toutes les sessions sauf la session actuelle (iPhone) sont révoquées Et tous les tokens JWT sont invalidés Et tous les refresh tokens sont révoqués Et un événement "SESSIONS_REVOKED_PASSWORD_CHANGE" est enregistré Et un email est envoyé: "Votre mot de passe a été modifié. Toutes vos autres sessions ont été déconnectées." Et des notifications push sont envoyées sur tous les appareils déconnectés Scénario: Persistance de la session avec "Se souvenir de moi" Étant donné un utilisateur "kate@roadwave.fr" qui se connecte Quand l'utilisateur coche l'option "Se souvenir de moi" Alors la durée de vie du token JWT est étendue à 90 jours Et la durée de vie du refresh token est étendue à 180 jours Et la session persiste même après fermeture de l'application Et un cookie sécurisé "remember_token" est stocké (pour web) Et un événement "LONG_SESSION_CREATED" est enregistré Et la métrique "sessions.remember_me.enabled" est incrémentée Scénario: Détection de vol de token et révocation automatique Étant donné un utilisateur "luke@roadwave.fr" avec une session active Et le token JWT a été volé et utilisé depuis une IP différente Quand le système détecte une utilisation simultanée du même token depuis 2 IP différentes Alors toutes les sessions de l'utilisateur sont immédiatement révoquées Et tous les tokens sont invalidés Et un email d'alerte critique est envoyé: "Activité suspecte détectée - Toutes vos sessions ont été fermées" Et une notification push urgente est envoyée sur tous les appareils Et l'utilisateur doit réinitialiser son mot de passe avant de se reconnecter Et un événement "TOKEN_THEFT_DETECTED" est enregistré avec niveau "CRITICAL" Et l'équipe de sécurité est alertée via webhook Scénario: Synchronisation des informations de session en temps réel Étant donné un utilisateur "mary@roadwave.fr" connecté sur 3 appareils Quand l'utilisateur révoque une session depuis son iPhone Alors la liste des sessions est mise à jour en temps réel sur tous les appareils via WebSocket Et l'appareil déconnecté reçoit immédiatement une notification de déconnexion Et l'UI est rafraîchie automatiquement sur tous les appareils connectés Et la métrique "sessions.realtime_sync" est incrémentée Scénario: Métriques de performance de gestion des sessions Étant donné que le système gère 100 000 sessions actives Quand les métriques de performance sont collectées Alors les indicateurs suivants sont respectés: | Métrique | Valeur cible | | Temps de création de session | < 50ms | | Temps de validation de token | < 20ms | | Temps de révocation de session | < 100ms | | Latence de synchronisation temps réel | < 500ms | | Taux de succès du refresh automatique | > 99.9% | Et les métriques sont exportées vers le système de monitoring Et des alertes sont déclenchées si les seuils sont dépassés Scénario: Stockage sécurisé des sessions dans Redis Étant donné un utilisateur "nathan@roadwave.fr" avec une session active Quand la session est stockée dans Redis Alors les données suivantes sont chiffrées: | Champ | Chiffrement | | User ID | Hash | | Refresh Token | AES-256 | | Device Info | Non | | IP Address | Hash | Et la clé Redis a un TTL correspondant à la durée de vie de la session Et les données sensibles ne sont jamais loggées en clair Et les accès à Redis sont audités Et la métrique "sessions.storage.encrypted" est incrémentée