Gestion des sessions en PHP
La gestion des sessions en PHP permet de conserver des données persistantes entre différentes requêtes HTTP. Cela est essentiel pour suivre un utilisateur (authentification, panier, préférences, etc.). Voici un aperçu complet du fonctionnement interne de ce mécanisme.
1. Création et initialisation d’une session
Quand un utilisateur accède à un site utilisant PHP et que le script appelle : session_start();
.
PHP tente d’initialiser une session :
- Si l’utilisateur dispose déjà d’un identifiant de session valide (SID), PHP charge les données correspondantes depuis le stockage serveur.
- Sinon, une nouvelle session est créée : un identifiant de session unique est généré (ex : abc123) et un espace de stockage (fichier ou autre) est alloué côté serveur.
2. Transmission de l’identifiant de session
L’identifiant de session est généralement transmis au client via un cookie HTTP, par défaut nommé PHPSESSID.
Exemple d’en-tête HTTP : Set-Cookie: PHPSESSID=abc123; path=/
Lors des requêtes suivantes, le navigateur renvoie automatiquement ce cookie : Cookie: PHPSESSID=abc123
3. Liaison entre requêtes et session
- Lire l’identifiant envoyé par le client.
- Accéder aux données de session correspondantes côté serveur.
- Les exposer via la superglobale
$_SESSION
.
4. Cas des cookies désactivés
Exemple : http://example.com/page.php?PHPSESSID=abc123
Ce mécanisme est déconseillé pour des raisons de sécurité notamment un risque de fuite d’identifiant dans les logs ou referrers.
5. Stockage des sessions
Par défaut, PHP stocke les données de session sous forme de fichiers dans un répertoire défini par session.save_path
Exemple : /var/lib/php/sessions
Mais d’autres gestionnaires de session session.save_handler
peuvent être utilisés : files (par défaut), memcached, redis, ...
6. Expiration et nettoyage (Garbage Collection)
Les sessions inactives ne sont pas immédiatement supprimées. PHP s’appuie sur un système de garbage collection (GC), basé sur trois paramètres :
session.gc_maxlifetime = 1440
(24 minutes)session.gc_probability = 1
session.gc_divisor = 100
Interprétation :
- Une session est considérée expirée après 1440 secondes (24 minutes) d’inactivité.
- À chaque requête, PHP a 1 chance sur 100 de déclencher le GC.
- Lorsqu’il est déclenché, le GC :
-
- Parcourt les fichiers de session dans
session.save_path
. - Supprime ceux dont la dernière modification date de plus de
gc_maxlifetime
secondes.
- Parcourt les fichiers de session dans
Cela signifie que l’expiration n’est pas immédiate ni garantie : une session peut théoriquement survivre bien plus longtemps si le GC ne s’exécute pas.
7. Sécurité des sessions
Pour renforcer la sécurité, PHP peut (et doit) utiliser les options suivantes :