Kodokon kodokon.com

Sessions et cookies : connexion et panier

Mémorisez vos visiteurs de page en page : connexion sécurisée, panier en session et cookies correctement protégés.

10 min · 3 questions

Ouvrir cette leçon dans Kodokon

HTTP ne mémorise rien : chaque requête arrive vierge, sans lien avec la précédente. Les sessions résolvent ce problème : session_start() associe au visiteur un identifiant unique, transmis dans un cookie, et un espace de stockage côté serveur accessible via $_SESSION. Appelez session_start() tout en haut de chaque page concernée, avant le moindre affichage.

PHP
<?php

declare(strict_types=1);

session_start();

$storedHash = password_hash('secret123', PASSWORD_DEFAULT);
$password = $_POST['password'] ?? '';

if (password_verify($password, $storedHash)) {
    session_regenerate_id(true);
    $_SESSION['user_id'] = 42;
    header('Location: /account.php');
    exit;
}

echo "Identifiants invalides.";
login.php : en réalité, le hash vient de votre base de données.

Protéger une page revient à vérifier la présence de l'utilisateur en session, et rediriger sinon. La session sert aussi de stockage temporaire idéal pour un panier : un tableau associatif id produit => quantité survit de page en page.

PHP
<?php

declare(strict_types=1);

session_start();

if (!isset($_SESSION['user_id'])) {
    header('Location: /login.php');
    exit;
}

$_SESSION['cart'] ??= [];

$productId = filter_input(
    INPUT_POST,
    'product_id',
    FILTER_VALIDATE_INT
);

if (is_int($productId)) {
    $qty = $_SESSION['cart'][$productId] ?? 0;
    $_SESSION['cart'][$productId] = $qty + 1;
}

$count = array_sum($_SESSION['cart']);
echo "Panier : " . $count . " article(s)";
cart.php : page protégée et panier stocké en session.

Les cookies, eux, vivent chez l'utilisateur et survivent à la fermeture du navigateur : parfaits pour un thème ou une préférence de langue. Depuis PHP 7.3, setcookie() accepte un tableau d'options : exigez secure (HTTPS uniquement), httponly (invisible au JavaScript) et samesite (limite l'envoi depuis d'autres sites).

PHP
<?php

setcookie('theme', 'dark', [
    'expires' => time() + 60 * 60 * 24 * 30,
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);

$theme = $_COOKIE['theme'] ?? 'light';
echo "Thème actif : " . $theme;
Un cookie de préférence valable trente jours, avec les bons drapeaux.

La déconnexion doit être aussi soignée que la connexion : videz $_SESSION, détruisez la session côté serveur et faites expirer le cookie qui portait l'identifiant.

PHP
<?php

session_start();

$_SESSION = [];
session_destroy();

setcookie(session_name(), '', time() - 3600, '/');

header('Location: /login.php');
exit;
logout.php : une déconnexion complète, sans résidu.

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Où sont stockées les données d'une session PHP ?
    • Dans un cookie chez l'utilisateur
    • Sur le serveur ; le navigateur ne conserve qu'un identifiant dans un cookie
    • Dans l'URL de chaque page
    • Dans le localStorage du navigateur
  2. Pourquoi appeler session_regenerate_id(true) juste après une connexion réussie ?
    • Pour empêcher la fixation de session : un identifiant connu avant la connexion devient inutilisable
    • Pour prolonger la durée de vie du cookie de session
    • Pour vider les anciennes données du panier
  3. Que fait l'option httponly d'un cookie ?
    • Elle chiffre le contenu du cookie
    • Elle limite le cookie aux connexions non sécurisées
    • Elle rend le cookie inaccessible au JavaScript de la page, ce qui limite le vol par XSS