Authentification : Sessions
Les sessions constituent un mécanisme d'authentification fiable permettant de mémoriser le statut connecté d'un utilisateur lors de sa navigation.
Qu’est-ce qu’une session ?
Définition
Les sessions sont des mécanismes qui permettent de stocker temporairement sur le serveur, des données relatives à un utilisateur.
Identifiée par un ID, une session peut stocker tout type d’informations, telles que :
- Des préférences utilisateur
- Un panier d’achat
- La langue courante du site
- Un pseudo utilisateur
- Etc.
Ces informations permettent de personnaliser l’expérience utilisateur tout au long de sa visite sur le site.
En conservant les données sur l’état actuel de la communication entre l’utilisateur (client) et le système (serveur), les sessions permettent de maintenir une continuité dans l’interaction.
On qualifie en ce sens les sessions de « stateful ».
Structure
Les informations de session sont généralement stockées :
- Sous forme de fichiers (texte, binaire…)
- Dans une base de données
- Dans la mémoire vive du serveur
Fonctionnement des sessions
L’authentification par session fonctionne en 2 temps :
- La création de la session par le serveur
- Son exploitation par le client
Les schémas suivants détaillent chacune des ces étapes.
Création de la session
1. Génération d’une session unique
Le serveur crée une session pour cet utilisateur. Cette session est définie par un identifiant unique appelé « ID de session ».
2. Transmission de l’ID de session au client
L’ID de la session est renvoyé au navigateur via l’en-tête Set-Cookie
de la réponse HTTP.
Ce dernier le stocke dans un cookie.
Exploitation de la session
3. Inclusion de l’ID de session dans les requêtes
Les cookies étant conçus pour être automatiquement renvoyés dans chaque requête du navigateur vers le serveur avec l’en-tête Cookie
, l’identifiant de session sera systématiquement transmis.
4. Vérification de l’ID de session
Lorsque l’utilisateur accède à des pages restreintes ou effectue des actions qui nécessitent une authentification, le serveur vérifie simplement si l’ID de session correspond à une session active dans sa mémoire.
Une fois que l’utilisateur se déconnecte ou que sa session expire (généralement après une période d’inactivité prédéfinie ou lorsqu’il ferme son navigateur), l’ID de session devient invalide et l’utilisateur doit se reconnecter pour obtenir une nouvelle session.
Cela garantit la sécurité en limitant le temps d’accès aux ressources protégées par l’authentification.
Vulnérabilité à l’attaque CSRF
Le danger du CSRF lors de l’utilisation de l’authentification via session réside dans le fait qu’un attaquant peut exploiter une session authentifiée pour effectuer des actions non autorisées au nom de l’utilisateur sans que ce dernier ne le sache.
Lorsqu’un utilisateur est authentifié via une session sur le site https://exemple.com
, son navigateur envoie automatiquement les cookies de session à chaque requête vers le serveur. Si une page web malveillante est conçue pour déclencher des actions sur le site auquel l’utilisateur est authentifié, alors ces actions pourraient être effectuées sans le consentement explicite de l’utilisateur.
Par exemple, un attaquant pourrait concevoir une page web https://evil.com
qui, lorsqu’elle est visitée par un utilisateur authentifié sur un site, envoie des requêtes vers le site https://exemple.com
pour effectuer des actions telles que changer le mot de passe, supprimer des données sensibles, ou effectuer des transactions financières.
Pour contrer ce risque, il est recommandé d’utiliser des jetons CSRF (CSRF tokens).
Vulnérabilité à la faille XSS
Outre le risque de CSRF, l’authentification par session est également sujette aux attaques par Cross-Site Scripting (XSS).
Un attaquant peut injecter du code JavaScript malveillant dans une page web https://exemple.com
, consultée par un utilisateur authentifié.
Ce code peut ensuite dérober le cookie de session (avec document.cookies
en JS) et l’envoyer sur le domaine du hacker https://evil.com
, lui permettant d’exécuter des actions non autorisées au nom de l’utilisateur.
Pour contrer ce risque, il est recommandé de :
- Valider rigoureusement les saisies des utilisateurs
- Encoder les caractères spéciaux dans les sorties HTML pour empêcher l’exécution de code JavaScript.
- Utilisant des cookies
HttpOnly
(inaccessibles côté client par JS) - Utiliser le protocole HTTPS pour crypter les communications et empêcher l’interception du cookie. L’attribut
secure
permet d’empêcher qu’un cookie ne soit communiqué en HTTP simple.