# Guide de Sécurité de l'Authentification

## 1. Objectif
Ce document synthétise les principes et les mesures de sécurité mis en œuvre dans le module d'authentification pour protéger les comptes utilisateurs et les données du système contre les menaces courantes.

## 2. Sécurité des Données au Repos
*   **Stockage des Mots de Passe :** Les mots de passe sont hachés avec l'algorithme **Argon2id** via la fonction `password_hash()` de PHP. Cet algorithme est l'état de l'art, car il est résistant aux attaques par GPU et inclut un salage automatique pour empêcher les attaques par tables arc-en-ciel. **Aucun mot de passe n'est jamais stocké en clair.**
*   **Stockage des Secrets 2FA :** Le secret partagé pour le 2FA est **chiffré** (et non haché) dans la base de données. Il est chiffré car le serveur a besoin de le déchiffrer pour valider les codes de l'utilisateur. La clé de chiffrement est stockée en dehors de la base de données (dans un fichier de configuration serveur) pour séparer les données de la clé.
*   **Stockage des Codes de Secours 2FA :** Les codes de secours sont **hachés** (avec le même algorithme que les mots de passe), car le serveur n'a besoin que de les comparer, pas de les lire.

## 3. Sécurité des Données en Transit
*   **HTTPS obligatoire :** L'ensemble du site, et particulièrement les communications avec l'API, doit être servi exclusivement via **HTTPS (TLS)**. Cela empêche les attaques de type "Man-in-the-Middle" d'intercepter les identifiants ou les cookies de session.

## 4. Gestion des Sessions
*   **Cookies Sécurisés :** Les cookies de session sont configurés avec les attributs suivants :
    *   `HttpOnly` : Protège contre le vol de cookie via des attaques XSS.
    *   `Secure` : Garantit que le cookie n'est transmis que sur une connexion HTTPS.
    *   `SameSite=Strict` : Offre une protection robuste contre les attaques de type Cross-Site Request Forgery (CSRF).
*   **Régénération d'ID de Session :** L'identifiant de session est systématiquement régénéré après chaque connexion réussie pour prévenir les attaques par fixation de session.
*   **Expiration de Session :** Les sessions expirent automatiquement après une période d'inactivité (ex: 30 minutes) pour limiter les risques en cas de poste laissé sans surveillance.

## 5. Protection contre les Attaques
*   **Injection SQL :** L'utilisation systématique de **requêtes préparées (Prepared Statements)** via PDO ou MySQLi élimine le risque d'attaques par injection SQL.
*   **Cross-Site Scripting (XSS) :** Toutes les données fournies par l'utilisateur et affichées sur une page sont échappées avec `htmlspecialchars()` pour neutraliser l'exécution de scripts malveillants.
*   **Attaques par Force Brute :** Un mécanisme de **limitation des tentatives (rate limiting)** est mis en place sur les endpoints de connexion et de réinitialisation de mot de passe pour bloquer les adresses IP après un certain nombre d'échecs consécutifs.
