PHP Sessions : Guide Complet
Apprenez comment fonctionnent les sessions PHP, comment stocker et récupérer des données, et comment sécuriser les sessions contre les attaques.
HTTP est sans état — chaque requête qu'un navigateur effectue est indépendante, et le serveur oublie tout une fois qu'il envoie une réponse. Les sessions sont la façon dont PHP se souvient d'un visiteur entre les requêtes : elles permettent de maintenir un utilisateur connecté, de construire un panier d'achat, ou de mémoriser des préférences au fur et à mesure que l'utilisateur navigue de page en page. Ce guide explique ce que sont les sessions, comment elles fonctionnent en coulisses, comment lire et écrire des données de session, et comment les sécuriser.
Qu'est-ce qu'une session PHP ?
Une session PHP est un mécanisme permettant de stocker des données par utilisateur côté serveur pendant la durée de la visite d'un utilisateur. Contrairement aux cookies, qui stockent les données dans le navigateur, une session conserve les données réelles sur le serveur et n'envoie au navigateur qu'un petit identifiant de session pour identifier à qui appartiennent les données.
Cela est important pour deux raisons :
- Capacité — les cookies sont limités à environ 4 Ko et résident dans le navigateur ; les données de session résident dans le stockage du serveur (fichiers, base de données ou mémoire) et peuvent être beaucoup plus volumineuses.
- Sécurité — les valeurs sensibles (l'identifiant d'un utilisateur, son rôle ou le contenu de son panier) ne quittent jamais le serveur, de sorte que le navigateur ne peut pas les lire ni les altérer. Seul l'identifiant de session opaque est exposé.
Comment fonctionnent les sessions PHP ?
Lorsqu'une session démarre, PHP génère un identifiant de session unique pour le visiteur et l'envoie au navigateur dans un cookie nommé PHPSESSID. À chaque requête ultérieure, le navigateur retourne ce cookie, et PHP utilise l'identifiant pour retrouver les données correspondantes stockées sur le serveur. Les données elles-mêmes sont exposées à votre code via le tableau $_SESSION.
Flux de travail d'une session
graph LR
A[Browser] -- 1. Request + Session Cookie --> B[Server]
B -- 2. Validate Cookie & Fetch Data --> A
A -- 3. Receive Response --> BEn résumé : le cookie transporte l'identifiant ; le serveur détient les données.
Démarrer une session
Chaque page qui lit ou écrit des données de session doit appeler session_start() avant tout envoi de contenu au navigateur. Comme session_start() envoie le cookie PHPSESSID via un en-tête HTTP, même un simple espace ou une ligne vide avant la balise d'ouverture <?php déclenchera un avertissement « headers already sent » et cassera la session.
L'appel à session_start() reprend soit la session existante du visiteur (si son navigateur a envoyé un identifiant valide), soit en démarre une nouvelle. Protéger l'appel avec session_status() évite un avertissement si la session a déjà été démarrée plus tôt dans la requête :
Comment démarrer une session PHP
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}Lire et écrire des données de session
Une fois la session démarrée, la superglobale $_SESSION se comporte comme n'importe quel autre tableau associatif. Assignez une valeur à une clé pour la stocker :
Stocker des données dans une session PHP
<?php
$_SESSION['username'] = 'John Doe';
$_SESSION['cart'] = ['book', 'pen'];Récupérez-les sur la même page ou lors de toute requête ultérieure dans la même session :
Récupérer des données d'une session PHP
<?php
// Always check the key exists to avoid a warning
$username = $_SESSION['username'] ?? 'Guest';
echo "Welcome, {$username}";Comme les données persistent entre les requêtes, un pattern courant est un compteur de vues de page qui survit aux rechargements :
Compter les vues de page dans la session courante
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
$_SESSION['views'] = ($_SESSION['views'] ?? 0) + 1;
echo "You have viewed this page {$_SESSION['views']} time(s).";Pour supprimer une seule valeur, utilisez unset() sur sa clé — ne l'assignez pas à null, ce qui laisse la clé en place :
<?php
unset($_SESSION['cart']);Sessions et cookies
Les sessions et les cookies fonctionnent souvent ensemble, mais ils stockent les données à des endroits différents. Utilisez une session lorsque les données sont sensibles ou volumineuses ; utilisez un cookie lorsque le navigateur lui-même a besoin de se souvenir de quelque chose (comme un jeton « se souvenir de moi ») entre les visites.
| Session | Cookie | |
|---|---|---|
| Stocké sur | Le serveur | Le navigateur |
| Visible par l'utilisateur | Non (uniquement l'identifiant) | Oui |
| Limite de taille | Grande (stockage serveur) | ~4 Ko |
| Durée de vie | Jusqu'à la fermeture du navigateur ou expiration | Expiration configurable |
Sécuriser les sessions PHP
Il est important de sécuriser les sessions PHP pour empêcher tout accès non autorisé aux données sensibles des utilisateurs. Vous pouvez sécuriser vos sessions PHP de plusieurs façons :
- Régénérer l'identifiant de session périodiquement.
- Stocker les données de session côté serveur dans un répertoire sécurisé.
- Utiliser HTTPS pour protéger la transmission des données de session.
Régénérer l'identifiant de session et renforcer le cookie
Les options de renforcement doivent être définies avant session_start(), sinon le cookie a déjà été envoyé avec les anciens paramètres. Régénérer l'identifiant juste après un changement de privilèges (comme une connexion) contrecarre les attaques de fixation de session, où un attaquant incite une victime à utiliser un identifiant de session qu'il connaît déjà :
<?php
// Configure before the session starts
ini_set('session.cookie_secure', '1'); // send cookie over HTTPS only
ini_set('session.use_only_cookies', '1'); // never accept the ID from the URL
ini_set('session.cookie_httponly', '1'); // hide the cookie from JavaScript
session_start();
// After a successful login, swap the ID and discard the old one
session_regenerate_id(true);| Paramètre | Ce qu'il prévient |
|---|---|
cookie_secure | La fuite de l'identifiant de session via HTTP non sécurisé |
cookie_httponly | Le vol du cookie par JavaScript (XSS) |
use_only_cookies | La transmission des identifiants de session dans les URLs |
session_regenerate_id | La fixation de session après une connexion |
Terminer une session PHP
Pour déconnecter un utilisateur, effacez les données et détruisez la session. Vider $_SESSION supprime les variables ; session_destroy() supprime les données sur le serveur ; et supprimer le cookie empêche le navigateur d'envoyer l'identifiant obsolète :
<?php
session_start();
// 1. Clear all session variables
$_SESSION = [];
// 2. Delete the session cookie in the browser
if (ini_get('session.use_cookies')) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
}
// 3. Destroy the data stored on the server
session_destroy();Conclusion
En conclusion, les sessions PHP sont un outil essentiel pour stocker les données utilisateur côté serveur et améliorer l'expérience utilisateur sur votre site web. En comprenant leur fonctionnement et comment les utiliser, vous pouvez tirer pleinement parti des avantages qu'elles offrent. Avec des mesures de sécurité appropriées en place, vous pouvez également garantir que les données sensibles des utilisateurs sont protégées.