Comprenrde la notion de session
Dans le développement web, une session représente une suite d'interactions entre un utilisateur (via son navigateur) et un serveur, commençant par l'ouverture de l'application et se terminant généralement par la fermeture du navigateur ou une déconnexion explicite.
Le protocole HTTP étant par nature sans état (stateless), le serveur ne se souvient pas des requêtes précédentes d'un même client. Pour maintenir un contexte (comme un panier d'achat ou une session utilisateur), des mécanismes de gestion d'état sont nécessaires.
Limites des objets de portée standard
Avant d'aborder les cookies, il est important de comprendre pourquoi les autres objets de portée ne suffisent pas toujours :
- ServletContext : Partagé par tous les utilisateurs de l'application. Stocker des données spécifiques à un utilisateur ici entraînerait des conflits de données (écrasement mutuel).
- HttpServletRequest : Les données ne survivent que le temps d'une seule requête (ou via un transfert de type forward). Pour une navigation fluide sur plusieurs pages, cela nécessiterait une gestion complexe de chaque lien et formulaire.
Le rôle des Cookies
Un cookie est une petite unité de données stockée sur le terminal de l'utilisateur (côté client). Il permet de pallier l'absence d'état du protocole HTTP en servant de "mémoire" locale. Lorsqu'un serveur envoie une réponse, il peut inclure un en-tête demandant au navigateur d'enregistrer ces informations. Lors des requêtes suivantes, le navigateur renvoie automatiquement ces données au serveur.
L'API Cookie en Java (javax.servlet.http.Cookie)
Voici les méthodes essentielles de la classe Cookie :
| Méthode | Description |
|---|---|
Cookie(String name, String value) |
Constructeur pour initialiser un cookie avec une clé et une valeur. |
getName() / getValue() |
Récupère le nom ou la valeur du cookie. |
setMaxAge(int seconds) |
Définit la durée de vie. Une valeur positive stocke le cookie sur le disque. Une valeur négative le garde uniquement en mémoire vive (disparaît à la fermeture du navigateur). Une valeur de zéro supprime le cookie. |
setPath(String uri) |
Définit le chemin d'accès pour lequel le cookie est valide. Le navigateur n'enverra le cookie que si l'URL correspond à ce préfixe. |
setHttpOnly(boolean) |
Protège le cookie contre les accès via JavaScript (sécurité contre XSS). |
Implémentation technique
1. Création et envoi d'un cookie au client
Le serveur instancie le cookie et l'ajoute à la réponse HTTP via l'en-tête Set-Cookie.
// Initialisation du cookie
Cookie userToken = new Cookie("auth_id", "token_val_99");
// Configuration : durée de vie de 24 heures
userToken.setMaxAge(24 * 60 * 60);
// Expédition vers le navigateur
response.addCookie(userToken);
2. Lecture des cookies envoyés par le client
À chaque requête, le serveur peut extraire l'ensemble des cookies fournis par le navigateur.
// Récupération du tableau de cookies
Cookie[] browserCookies = request.getCookies();
if (browserCookies != null) {
for (Cookie current : browserCookies) {
String key = current.getName();
String val = current.getValue();
System.out.println("Clé : " + key + " | Valeur : " + val);
}
} else {
System.out.println("Aucun cookie détecté.");
}
3. Gestion de la portée (Path)
Vous pouvez restreindre l'envoi d'un cookie à une partie spécifique de votre application.
Cookie preferenceCookie = new Cookie("theme", "dark");
// Ce cookie ne sera envoyé que pour les URLs commençant par /admin
preferenceCookie.setPath("/admin");
response.addCookie(preferenceCookie);
4. Suppression d'un cookie
Pour supprimer un cookie, il faut envoyer un cookie portant le même nom et le même chemin, mais avec une durée de vie (MaxAge) fixée à zéro.
Cookie cookieToDelete = new Cookie("auth_id", "");
// Suppression immédiate
cookieToDelete.setMaxAge(0);
cookieToDelete.setPath("/"); // Assurez-vous que le path correspond
response.addCookie(cookieToDelete);
Considérations importantes
Il est fortement déconseillé de stocker des données sensibles (mots de passe en clair, informations bancaires) directement dans les cookies, car ils sont stockés côté client et peuvent être interceptés ou modifiés. De plus, évitez l'utilisation de caractères spéciaux ou de caractères non-ASCII (comme les accents) dans les valeurs des cookies sans encodage préalable pour éviter les erreurs de parsing.