// PHP

Les sessions en PHP : gérer l'état utilisateur

La session en PHP répond à un problème fondamental du web : HTTP est un protocole sans mémoire. Chaque requête est indépendante, le serveur « oublie » l’utilisateur d’une page à l’autre. Comment, alors, garder un internaute connecté, mémoriser son panier ou sa langue ? La réponse s’appelle la session. Elle stocke des données côté serveur, associées à un identifiant unique déposé dans le navigateur. Ce guide couvre tout ce qu’il faut savoir pour l’utiliser correctement et en sécurité.

Démarrer une session avec session_start

Tout commence par session_start(). Cette fonction doit être appelée avant tout affichage (avant le moindre echo ou espace dans le HTML), sous peine d’erreur « headers already sent ».

<?php
session_start(); // Toujours en tout premier

// À partir d'ici, $_SESSION est disponible

Au premier appel, PHP génère un identifiant de session unique et l’envoie au navigateur sous forme de cookie (PHPSESSID par défaut). À chaque requête suivante, le navigateur renvoie ce cookie, et PHP retrouve automatiquement les données associées.

Stocker des données dans $_SESSION

La superglobale $_SESSION est un simple tableau associatif. Vous y écrivez ce que vous voulez.

<?php
session_start();

$_SESSION["utilisateur_id"] = 42;
$_SESSION["pseudo"]         = "Léa";
$_SESSION["role"]           = "admin";

// On peut y stocker un tableau entier
$_SESSION["panier"] = [
    ["produit" => "Clavier", "prix" => 49.90],
    ["produit" => "Souris",  "prix" => 24.90],
];

Ces données persistent tant que la session reste active, d’une page à l’autre, sans que vous ayez à les repasser en paramètre.

Lire les données de session

Sur n’importe quelle autre page, il suffit de rappeler session_start() pour retrouver le contenu.

<?php
session_start();

// Toujours vérifier l'existence avant de lire
if (isset($_SESSION["pseudo"])) {
    echo "Bonjour " . htmlspecialchars($_SESSION["pseudo"]);
} else {
    echo "Visiteur non connecté";
}

Le réflexe isset() évite les avertissements sur une clé absente. Et htmlspecialchars() est indispensable dès que vous affichez une donnée pour vous prémunir contre les failles XSS.

Vérifier si un utilisateur est connecté

Le cas d’usage le plus fréquent : protéger une page réservée aux membres.

<?php
session_start();

if (!isset($_SESSION["utilisateur_id"])) {
    header("Location: /connexion.php");
    exit; // Toujours exit après une redirection
}

// Le reste de la page ne s'exécute que pour un utilisateur connecté

Supprimer une donnée précise

Pour retirer une seule variable de session sans toucher au reste, utilisez unset().

<?php
session_start();

unset($_SESSION["panier"]); // Vide uniquement le panier

// Le pseudo et l'id de l'utilisateur restent intacts

Détruire la session : la déconnexion

Fermer une session (logout) demande plus qu’un simple unset. Il faut vider les données, invalider le cookie, puis détruire la session côté serveur. Voici la procédure complète et recommandée.

<?php
session_start();

// 1. Vider le tableau de session
$_SESSION = [];

// 2. Supprimer le cookie de session côté navigateur
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. Détruire la session côté serveur
session_destroy();

// 4. Rediriger
header("Location: /connexion.php");
exit;

Les trois étapes sont importantes : $_SESSION = [] vide la mémoire de la requête courante, le setcookie expiré nettoie le navigateur, et session_destroy() efface le fichier de session sur le serveur.

Sécuriser ses sessions

Une session mal protégée est une porte ouverte au détournement de compte. Quelques mesures simples renforcent nettement la sécurité.

Régénérer l’identifiant de session

Après une connexion réussie, changez l’identifiant de session avec session_regenerate_id(). Cela contre les attaques par fixation de session, où un attaquant impose un identifiant connu à la victime.

<?php
session_start();

// Après vérification réussie du mot de passe :
session_regenerate_id(true); // true = supprime l'ancien fichier de session
$_SESSION["utilisateur_id"] = $utilisateur["id"];

Configurer des cookies de session sûrs

Idéalement avant session_start(), imposez des cookies de session robustes.

<?php
session_set_cookie_params([
    "lifetime" => 0,          // expire à la fermeture du navigateur
    "path"     => "/",
    "secure"   => true,       // uniquement en HTTPS
    "httponly" => true,       // inaccessible au JavaScript (anti-XSS)
    "samesite" => "Strict",   // limite les requêtes cross-site (anti-CSRF)
]);
session_start();

L’option httponly empêche un script JavaScript malveillant de lire le cookie de session, et samesite réduit le risque d’attaque CSRF. Ces deux réglages devraient être systématiques.

Limiter la durée de vie

Pour une session sensible, vérifiez l’inactivité et forcez une reconnexion au bout d’un certain temps.

<?php
session_start();

$delaiMax = 1800; // 30 minutes

if (isset($_SESSION["derniere_activite"])
    && (time() - $_SESSION["derniere_activite"] > $delaiMax)) {
    session_unset();
    session_destroy();
    header("Location: /connexion.php?expiree=1");
    exit;
}
$_SESSION["derniere_activite"] = time();

Sessions vs cookies : quelle différence ?

On confond souvent les deux, alors qu’ils jouent des rôles complémentaires.

  • Le cookie stocke les données côté navigateur. Il est visible et modifiable par l’utilisateur, limité en taille (environ 4 Ko) et voyage à chaque requête. Idéal pour des préférences non sensibles ou un « se souvenir de moi ».
  • La session stocke les données côté serveur. Seul l’identifiant transite via un cookie. L’utilisateur ne voit jamais le contenu, ce qui la rend adaptée aux données sensibles : identité, droits, panier.

En clair : ne mettez jamais un role => admin dans un cookie brut, un utilisateur pourrait le modifier. Placez-le dans la session, dont seul le serveur détient le contenu. Pour aller plus loin sur la manipulation des données que vous stockerez en session, notre guide sur les tableaux en PHP est un bon complément.

En résumé

La session est le mécanisme standard pour garder un état d’un utilisateur en PHP. Retenez la mécanique : session_start() en tête de fichier, $_SESSION comme tableau de stockage, unset() pour retirer une donnée, et la procédure complète de destruction pour la déconnexion. Côté sécurité, trois réflexes suffisent à éviter l’essentiel des problèmes : session_regenerate_id() après connexion, cookies httponly + secure + samesite, et une expiration par inactivité. Avec ça, vous gérez l’authentification de vos applications sur des bases solides.

À lire ensuite