Passer au contenu principal

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.

Sans ce cookie, le serveur ne peut pas associer la requête à une session existante. L’utilisateur apparaît donc comme “nouveau”.


4. Cas des cookies désactivés

Si les cookies sont désactivés, PHP peut (optionnellement) transmettre le SID dans l’URL, via le mécanisme session.use_trans_sid.

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 :

  1. Une session est considérée expirée après 1440 secondes (24 minutes) d’inactivité.
  2. À chaque requête, PHP a 1 chance sur 100 de déclencher le GC.
  3. 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.

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 :

  • session.cookie_httponly = 1 → Empêche JavaScript d’accéder au cookie.
  • session.cookie_secure = 1  → N’envoie le cookie que sur des connexions HTTPS.
  • session.cookie_samesite = Strict|Lax → Empêche les envois inter-domaines (protection CSRF).