OWASP & AppSec

Gestion de session sécurisée : guide 2026

Gestion de session sécurisée 2026 : génération d'ID, cookies hardened, JWT vs sessions server, expiration, invalidation et protection contre fixation et hijacking.

Naim Aouaichia
16 min de lecture
  • Session
  • Sécurité web
  • Cookies
  • JWT
  • OWASP
  • ASVS
  • Authentication
  • Secure coding
  • Session fixation
  • Session hijacking

La gestion de session sécurisée est la colonne vertébrale de toute application web moderne et concentre 5 des 20 contrôles les plus fréquemment défaillants en pentest France 2024-2026. Une session sécurisée repose sur 6 piliers indissociables : génération d'ID avec minimum 128 bits d'entropie via CSPRNG, transport via cookies durcis (Secure, HttpOnly, SameSite, préfixe __Host-), stockage côté serveur résistant à la corruption (Redis ou base ACID), durée de vie alignée sur la sensibilité (idle timeout 15-30 min standard, 5-15 min banque/santé), invalidation active côté serveur (logout, changement de mot de passe, token rotation), protection contre les attaques classiques (fixation via régénération post-auth, hijacking via TLS obligatoire, CSRF via SameSite). Pour les architectures stateless, les JWT restent valides à condition de respecter RFC 7519, RFC 8725 BCP et RFC 9700 OAuth 2.0 BCP publié décembre 2024, avec rotation refresh token obligatoire. Cet article détaille chaque pilier avec code d'implémentation Node.js, Python et Go conforme OWASP ASVS v4.0 Section V3, les pièges classiques identifiés en pentest, et une checklist de vérification. Sources : OWASP Session Management Cheat Sheet, OWASP ASVS v4.0, RFC 6265bis, RFC 9700, RFC 8725.

1. Stateful session vs stateless JWT : choisir le bon paradigme

Le premier choix architectural conditionne toutes les décisions de sécurité suivantes. Les deux paradigmes restent valides en 2026, mais pour des contextes distincts.

1.1 Session server-side (session ID opaque)

Le client stocke un identifiant opaque (cookie). Le serveur stocke toutes les données de session en backend (Redis, DB, in-memory). À chaque requête, le serveur lookup l'ID pour retrouver l'état.

Avantages

  • Révocation instantanée : suppression de l'entrée serveur = session morte immédiatement.
  • Données session modifiables à tout moment (refresh d'autorisation, update profil).
  • Aucune donnée sensible côté client (tout est opaque).
  • Modèle mental simple, audit facilité.

Inconvénients

  • Nécessite un stockage session partagé (Redis) pour un cluster multi-instance.
  • Lookup à chaque requête (latence négligeable si Redis).
  • Couplage domaine unique (sessions difficiles à fédérer cross-domaines).

1.2 JWT stateless (JSON Web Token, RFC 7519)

Le client stocke un token signé contenant les claims (user ID, expiration, scopes). Le serveur valide la signature à chaque requête, aucun lookup sur l'état.

Avantages

  • Scalabilité horizontale native, aucun stockage session nécessaire.
  • Fédération naturelle entre services (SSO, API cross-domaine).
  • Portabilité : un même JWT consommable par plusieurs services backend.

Inconvénients

  • Révocation problématique : un JWT signé reste valide jusqu'à son exp sauf mise en place d'une blacklist (qui annule l'avantage stateless).
  • Claims lues côté client sans chiffrement par défaut (utiliser JWE si sensibles).
  • Rotation d'autorisation nécessite new token.
  • Risque élevé de mauvaise implémentation (algorithm confusion, none algorithm, signature non vérifiée).

1.3 Règle pragmatique 2026

ContexteParadigme recommandé
Application web mono-domaine classiqueSession server-side (opaque ID)
API REST mono-consumer backend uniqueSession server-side
Architecture micro-services, API gatewayJWT validé au gateway
Mobile app consommant API backendJWT avec refresh token rotatif
SSO multi-applications (OIDC)JWT (id_token OIDC) + session par app
Application sensible (banque, santé)Session server-side (révocation)

2. Génération sécurisée du session ID

Quel que soit le paradigme, l'identifiant doit être imprédictible, unique et de longueur suffisante.

2.1 Exigences OWASP ASVS v4.0 V3.2.2

  • Entropie minimum : 64 bits, recommandé 128 bits.
  • Source : CSPRNG (Cryptographically Secure Pseudo-Random Number Generator), jamais Math.random ou équivalent.
  • Unicité : collision probability négligeable sur la durée de vie du système.
  • Opacité : aucune information dérivable (user ID, timestamp, hash prédictible).

2.2 Implémentation par langage

Node.js

import crypto from "node:crypto";
 
function generateSessionId() {
  // 32 bytes = 256 bits d'entropie, encodage hex = 64 caractères
  return crypto.randomBytes(32).toString("hex");
}
 
// Alternative base64url plus courte visuellement
function generateSessionIdShort() {
  return crypto.randomBytes(32).toString("base64url"); // 43 caractères
}

Python

import secrets
 
def generate_session_id() -> str:
    # 32 bytes = 256 bits d'entropie
    return secrets.token_urlsafe(32)  # ~43 caractères base64url sans padding
 
# NE JAMAIS utiliser random, random.randint, uuid1 pour un session ID
# uuid4 (basé sur getrandbits 128) est acceptable mais token_urlsafe est préférable

Go

package session
 
import (
    "crypto/rand"
    "encoding/hex"
)
 
func GenerateSessionID() (string, error) {
    b := make([]byte, 32) // 256 bits
    if _, err := rand.Read(b); err != nil {
        return "", err
    }
    return hex.EncodeToString(b), nil
}

2.3 Anti-patterns à bannir

  • uuid.uuid1() : basé sur timestamp + MAC address, partiellement prédictible.
  • Math.random() en JavaScript : non cryptographique, seed prédictible.
  • md5(timestamp + user_id) : prédictible, entropie insuffisante.
  • Base64 d'un hash non salé : vulnérable à rainbow tables en cas de compromission.
  • Dérivation du session ID depuis des données user : fixation trivialisée.

3. Transport sécurisé : cookies durcis

Le cookie de session est la cible numéro un de l'attaquant. Les 5 attributs à systématiser en 2026.

3.1 Les 5 attributs obligatoires

AttributRôleValeur recommandée
SecureCookie envoyé uniquement sur HTTPSToujours présent
HttpOnlyCookie inaccessible via JavaScriptToujours présent
SameSiteProtection CSRFStrict par défaut, Lax si besoin
PathRestriction au chemin pertinent/ en général, subpath si microapp
Max-Age ou ExpiresDurée de vie expliciteAligné sur timeout session

Deux préfixes normalisés forcent certains attributs côté navigateur et bloquent toute tentative de cookie mal configuré.

  • __Secure-<nom> : le navigateur rejette le cookie si Secure est absent ou si la connexion n'est pas HTTPS.
  • __Host-<nom> : le navigateur rejette le cookie si Secure absent, Domain présent, ou Path différent de /. Le plus restrictif.

Recommandation 2026 : utiliser __Host-session pour une session mono-domaine. Le navigateur garantit alors que tout cookie avec ce nom respecte les critères de sécurité minimaux.

3.3 Implémentation Express.js (Node.js)

import express from "express";
import session from "express-session";
import RedisStore from "connect-redis";
import { createClient } from "redis";
 
const redisClient = createClient({ url: process.env.REDIS_URL });
await redisClient.connect();
 
const app = express();
 
app.use(
  session({
    store: new RedisStore({ client: redisClient, prefix: "sess:" }),
    name: "__Host-session",
    secret: process.env.SESSION_SECRET, // 32+ bytes CSPRNG
    resave: false,
    saveUninitialized: false,
    cookie: {
      httpOnly: true,
      secure: true, // HTTPS obligatoire, y compris dev via certificats locaux
      sameSite: "strict",
      path: "/",
      maxAge: 30 * 60 * 1000, // 30 minutes idle timeout
    },
    rolling: true, // Réarme maxAge à chaque requête
  })
);

3.4 Attribut Partitioned (CHIPS)

Draft Chrome 2024, en cours de standardisation. Permet de cloisonner un cookie tiers par top-level site, utile pour les widgets embarqués (paiement, chat, maps) sans affaiblir la session principale. À ajouter quand l'architecture inclut des iframes cross-site authentifiés.

4. Stockage côté serveur

Trois options principales, avec trade-offs distincts.

StockageLatenceRésilienceScalabilitéUsage typique
In-memory process~0,01 msPerte au restartLimité à 1 instanceDev uniquement
Redis (standalone)0,5-2 msPersistence AOFHorizontal scaling clusterStandard prod
Redis Cluster ou Sentinel1-3 msHA avec failoverTrès scalableProduction grande échelle
Base relationnelle2-10 msTrès robusteDépend du scaling DBCas legacy ou simple
Memcached0,5-2 msPerte au restartHorizontalDéprécié en 2026 pour sessions

Recommandation 2026 par défaut : Redis 7+ avec persistence AOF (Append-Only File), cluster ou Sentinel en production, TTL natif sur les keys pour nettoyage automatique.

// Structure typique session en Redis
// Key: sess:<session_id>
// Value: JSON serialized { userId, createdAt, lastActivity, csrfToken, ... }
// TTL: aligné sur timeout absolu (ex: 8h)
 
await redisClient.setEx(
  `sess:${sessionId}`,
  8 * 3600, // TTL 8h
  JSON.stringify({
    userId: user.id,
    createdAt: Date.now(),
    lastActivity: Date.now(),
    csrfToken: crypto.randomBytes(16).toString("hex"),
    userAgent: req.headers["user-agent"],
    ip: req.ip,
  })
);

Bonnes pratiques de stockage

  • Jamais stocker le mot de passe ou le hash dans la session.
  • Minimiser les données sensibles : préférer stocker un user_id et re-lookup depuis la DB si nécessaire.
  • Binder au user-agent et IP : permet de détecter les hijacks (mais attention faux positifs sur mobile 4G qui change d'IP).
  • Chiffrer le contenu si données PII y sont stockées (via librairie type iron-session ou équivalent).

5. Durée de vie : idle timeout vs absolute timeout

Deux timeouts complémentaires, à configurer simultanément.

5.1 Idle timeout (timeout d'inactivité)

Temps écoulé depuis la dernière activité de l'utilisateur. Réarmé à chaque requête. Protège contre une session volée restant valide indéfiniment sans activité légitime.

5.2 Absolute timeout (timeout absolu)

Temps écoulé depuis la création initiale de la session. Non réarmable. Force une ré-authentification périodique, limitant l'exposition d'une session compromise.

5.3 Grille OWASP ASVS v4.0 V3.3

Niveau de sensibilitéIdle timeoutAbsolute timeout
Basse (dashboard consultation)2-8 heures24-72 heures
Standard (SaaS BtoB, ecommerce)15-30 minutes8-24 heures
Élevée (RH, données médicales)10-15 minutes4-8 heures
Critique (banque, paiement)5-10 minutes2-4 heures

Cas particulier : re-authentication pour actions sensibles

Les actions critiques (changement de mot de passe, transfert bancaire, modification de l'email de récupération) doivent forcer une ré-authentification récente même si la session est active. Pattern : vérifier que lastAuthAt > now - 5 minutes, sinon rediriger vers écran de confirmation password.

5.4 Implémentation

from datetime import datetime, timedelta
from typing import Optional
 
SESSION_IDLE_TIMEOUT = timedelta(minutes=30)
SESSION_ABSOLUTE_TIMEOUT = timedelta(hours=8)
REAUTH_REQUIRED_FOR_SENSITIVE = timedelta(minutes=5)
 
def validate_session(session: dict) -> tuple[bool, Optional[str]]:
    now = datetime.utcnow()
    created_at = datetime.fromisoformat(session["created_at"])
    last_activity = datetime.fromisoformat(session["last_activity"])
 
    if now - last_activity > SESSION_IDLE_TIMEOUT:
        return False, "idle_timeout"
    if now - created_at > SESSION_ABSOLUTE_TIMEOUT:
        return False, "absolute_timeout"
    return True, None
 
def require_recent_auth(session: dict) -> bool:
    last_auth = datetime.fromisoformat(session["last_auth_at"])
    return datetime.utcnow() - last_auth <= REAUTH_REQUIRED_FOR_SENSITIVE

6. Invalidation et logout sécurisé

Le logout incorrect est une vulnérabilité classique détectée en pentest junior. Trois actions obligatoires.

6.1 Au logout user-initiated

  1. Invalider côté serveur : supprimer l'entrée Redis ou la marquer revoked: true.
  2. Émettre Set-Cookie supprimant le cookie : Set-Cookie: __Host-session=; Max-Age=0; Path=/; Secure; HttpOnly; SameSite=Strict.
  3. Logger l'événement pour audit et détection anomalies.
app.post("/logout", async (req, res) => {
  const sessionId = req.sessionID;
 
  await req.session.destroy((err) => {
    if (err) {
      auditLog.error({ event: "logout_failed", sessionId, err: err.message });
      return res.status(500).json({ error: "Logout failed" });
    }
    auditLog.info({
      event: "logout_success",
      userId: req.session?.userId,
      sessionId,
      ip: req.ip,
    });
    res.clearCookie("__Host-session", {
      httpOnly: true,
      secure: true,
      sameSite: "strict",
      path: "/",
    });
    res.status(200).json({ ok: true });
  });
});

6.2 Au changement de mot de passe

Doit invalider toutes les sessions actives de l'utilisateur, pas seulement la courante. Pattern : stocker un passwordChangedAt en DB user, invalider toute session créée avant ce timestamp.

6.3 Au reset de mot de passe forcé (compromission suspectée)

Identique au changement volontaire, avec en plus : notification email à l'utilisateur, audit log avec reason: suspected_compromise.

6.4 Session régénération post-authentification (anti-fixation)

Vulnérabilité classique : si le serveur accepte un session ID pré-positionné (cookie existant) et l'associe à un utilisateur connecté sans régénérer, un attaquant peut forcer une victime à utiliser un ID qu'il contrôle.

Contre-mesure obligatoire : régénération du session ID à chaque changement de niveau de privilège (login, élévation).

app.post("/login", async (req, res) => {
  const user = await authenticate(req.body);
  if (!user) return res.status(401).json({ error: "auth_failed" });
 
  // CRITIQUE : régénération du session ID post-auth
  req.session.regenerate((err) => {
    if (err) return res.status(500).json({ error: "session_error" });
    req.session.userId = user.id;
    req.session.lastAuthAt = new Date().toISOString();
    res.json({ ok: true });
  });
});

7. JWT : implémentation sécurisée (stateless sessions)

Si l'architecture justifie JWT, 6 règles non-négociables pour respecter RFC 7519, RFC 8725 BCP et RFC 9700 BCP.

7.1 Règles fondamentales

  1. Algorithm whitelisting : forcer l'algorithme attendu côté serveur, ne jamais lire l'algorithme depuis le header. Bannir none.
  2. Signature obligatoire : HS256 (HMAC-SHA256) avec secret 32+ bytes, ou RS256/ES256/EdDSA pour asymétrique.
  3. Validation exhaustive : exp, nbf, iat, iss, aud, jti (pour anti-replay).
  4. Short-lived access token : 5-15 minutes maximum, jamais au-delà d'1 heure.
  5. Refresh token rotatif : RFC 9700 BCP décembre 2024 exige rotation à chaque usage, révocation en base, détection de réutilisation.
  6. Claims sensibles chiffrées : JWE (JSON Web Encryption) si le payload contient des PII, ou simplement ne pas les inclure.

7.2 Implémentation Node.js (jose library)

import { SignJWT, jwtVerify } from "jose";
 
const secret = new TextEncoder().encode(process.env.JWT_SECRET); // 32+ bytes
const ISSUER = "https://api.example.com";
const AUDIENCE = "https://app.example.com";
 
async function issueAccessToken(userId, scopes) {
  return await new SignJWT({ sub: userId, scope: scopes.join(" ") })
    .setProtectedHeader({ alg: "HS256", typ: "JWT" })
    .setIssuer(ISSUER)
    .setAudience(AUDIENCE)
    .setIssuedAt()
    .setJti(crypto.randomUUID())
    .setExpirationTime("15m")
    .sign(secret);
}
 
async function verifyAccessToken(token) {
  const { payload } = await jwtVerify(token, secret, {
    issuer: ISSUER,
    audience: AUDIENCE,
    algorithms: ["HS256"], // whitelist explicite
    clockTolerance: 5,
  });
  return payload;
}

7.3 Attack surface JWT à connaître

  • Algorithm confusion (CVE type) : forcer HS256 sur une clé publique RS256 pour signer en tant qu'émetteur légitime.
  • kid injection : manipuler le header kid pour charger une clé malveillante.
  • JWT in URL : fuite via logs, Referer. Toujours dans Authorization: Bearer header.
  • Absence de jti : rejeu d'anciens tokens non détecté.
  • Long-lived access token : fenêtre d'exposition étendue en cas de vol.
  • Refresh token non rotatif : compromission durable.

Voir Roadmap API security section 3 pour l'implémentation complète OAuth 2.0 + PKCE + refresh rotation.

8. Attaques classiques et contre-mesures

Les 6 attaques les plus fréquentes en pentest 2024-2026 et leurs contre-mesures.

AttaqueDescriptionContre-mesure principale
Session hijackingVol du session ID (XSS, MITM, log leak)HTTPS obligatoire, HttpOnly cookies, pas de logs tokens
Session fixationAttaquant fixe un ID avant login victimeRégénération ID post-authentification
CSRFRequête cross-site authentifiéeSameSite=Strict ou Lax + CSRF token
XSS exfil tokenJavaScript vole le cookieHttpOnly + CSP strict
Brute force session IDDevinette de l'IDEntropie ≥ 128 bits, rate limiting
JWT algorithm confusionForcer none ou HS vs RSWhitelist d'algorithme obligatoire

9. SSO et OAuth 2.0 : gestion session fédérée

Les architectures SSO (OIDC) multiplient les sessions à gérer.

Architecture type OIDC

  • Authorization Server (Keycloak, Auth0, Okta, Microsoft Entra ID) : maintient sa propre session SSO.
  • Relying Party (l'application consumer) : maintient sa session locale liée au user OIDC.
  • ID Token (JWT) : signé par AS, consommé par RP pour identifier le user.
  • Access Token : pour appeler des API protégées.
  • Refresh Token : pour renouveler access sans nouveau login.

Règles de gestion multi-session

  • Logout OIDC end-session : déclencher /oidc/logout pour invalider la session AS, pas seulement la session locale.
  • Single Logout (SLO) : si supporté, propage la déconnexion à toutes les applications fédérées.
  • Front-channel vs back-channel logout : back-channel plus fiable car ne dépend pas du navigateur user.
  • Session binding : chaque application RP maintient sa propre session locale avec son propre timeout, réglable selon sensibilité propre.

10. Checklist OWASP ASVS V3 Session Management (résumé actionnable)

Checklist exécutive basée sur l'OWASP ASVS v4.0 Section V3.

checklist_session_security = {
    "V3.1.1": "Aucun ID de session transmis dans l'URL (toujours cookie)",
    "V3.2.1": "Session ID régénéré à chaque changement de privilège (login, élévation)",
    "V3.2.2": "Session ID ≥ 64 bits entropie CSPRNG (128+ recommandé)",
    "V3.2.3": "Session ID jamais loggé en clair en prod",
    "V3.2.4": "Session ID généré côté serveur uniquement",
    "V3.3.1": "Logout invalide la session côté serveur",
    "V3.3.2": "Changement de mot de passe invalide toutes les sessions actives",
    "V3.3.3": "Idle timeout configuré (15-30 min standard)",
    "V3.3.4": "Absolute timeout configuré (8-24 h standard)",
    "V3.4.1": "Cookie session avec Secure (HTTPS uniquement)",
    "V3.4.2": "Cookie session avec HttpOnly",
    "V3.4.3": "Cookie session avec SameSite=Strict ou Lax",
    "V3.4.4": "Cookie session avec préfixe __Host- ou __Secure-",
    "V3.4.5": "Cookie session avec Path restrictif",
    "V3.5.1": "Si JWT : whitelist d'algorithmes stricte",
    "V3.5.2": "Si JWT : validation exp, iss, aud, jti obligatoire",
    "V3.5.3": "Si JWT : refresh token rotatif RFC 9700",
    "V3.6.1": "Rate limiting sur endpoints d'authentification",
    "V3.6.2": "Audit log de tous les événements session (login, logout, timeout, revoke)",
    "V3.6.3": "Détection anomalies (IP/UA change abrupte, volumes inhabituels)",
}
 
# Viser 100 % des checks pour un audit ASVS L2+

Points clés à retenir

  • 2 paradigmes valides : session server-side (opaque ID + Redis/DB) pour simplicité et révocation, JWT stateless uniquement si besoin architectural avéré.
  • Génération d'ID : CSPRNG minimum 128 bits d'entropie, jamais de valeurs dérivées ou prédictibles.
  • 5 attributs cookies obligatoires 2026 : Secure, HttpOnly, SameSite=Strict/Lax, Path, préfixe __Host-.
  • 2 timeouts combinés : idle (15-30 min standard, 5-15 min critique) + absolute (8-24 h standard, 2-4 h critique).
  • Invalidation active : logout serveur-side, changement de mot de passe → toutes sessions revoke, régénération ID post-authentification (anti-fixation).
  • JWT 2026 : whitelist algorithmes, validation exhaustive (exp, iss, aud, jti), short-lived access token + refresh rotatif RFC 9700 décembre 2024.
  • Top 5 vulnérabilités pentest 2026 : session fixation, logout sans invalidation, cookies sans SameSite, JWT sans validation complète, timeouts absents.
  • Référence : OWASP Session Management Cheat Sheet + OWASP ASVS v4.0 V3 + RFC 6265bis + RFC 9700 BCP.

Pour aller plus loin

Questions fréquentes

  • Faut-il utiliser des sessions server-side ou des JWT stateless en 2026 ?
    Dépend du contexte, les deux modèles restent valides. Sessions server-side (session ID opaque côté client, état stocké en Redis ou base) : recommandé pour les applications web traditionnelles avec un domaine unique, authentification révocable instantanément, simple à auditer. JWT stateless : pertinent pour les architectures micro-services avec de multiples consommateurs, API mobiles, federation cross-domaine. Le piège JWT 2026 : beaucoup d'équipes implémentent mal la révocation (blacklist en base alors que c'est censé être stateless, annulant l'avantage principal). Règle pragmatique : sessions opaques server-side par défaut, JWT uniquement si besoin architectural avéré et avec mécanisme de révocation rotatif refresh token BCP RFC 9700 décembre 2024.
  • Quelle longueur et quelle entropie pour un session ID ?
    OWASP ASVS v4.0 V3.2.2 exige au minimum 64 bits d'entropie (128 bits recommandé). Concrètement : 16 bytes aléatoires générés par un CSPRNG (Cryptographically Secure Pseudo-Random Number Generator) sont suffisants. En Python `secrets.token_urlsafe(32)` produit 32 bytes (256 bits d'entropie) encodé en base64url (43 caractères). En Node.js `crypto.randomBytes(32).toString('hex')` produit un ID 64 caractères hex. Jamais utiliser Math.random ou équivalent non-crypto. Jamais utiliser une valeur prédictible ou dérivable (user ID, timestamp, hash simple). La longueur en sortie est secondaire, c'est l'entropie de la source qui compte.
  • Quels attributs cookies sont obligatoires pour une session en 2026 ?
    Cinq attributs à systématiser. 1) Secure : cookie uniquement envoyé sur HTTPS (obligatoire en production, même en dev via localhost HTTPS). 2) HttpOnly : inaccessible via JavaScript, prévention d'exfiltration par XSS. 3) SameSite=Strict ou Lax : prévention CSRF, Strict recommandé sauf besoin explicite de requêtes cross-site authentifiées. 4) Path : restriction au chemin pertinent, évite la fuite vers subpaths non sécurisés. 5) Préfixes Host-cookie ou Secure-cookie : __Host-session et __Secure-session forcent respectivement Secure plus pas de Domain plus Path équivalent à slash et Secure plus domaine exact. Modèle complet recommandé : cookie nommé __Host-session avec Secure, HttpOnly, SameSite=Strict, Path=/, Max-Age défini. Ajouter Partitioned (draft CHIPS Chrome 2024) si embedding cross-site.
  • Combien de temps faut-il laisser une session active ?
    Dépend du niveau de sensibilité de l'application. OWASP ASVS v4.0 V3.3 distingue : applications de confiance basse (timeout d'inactivité 2-8 heures acceptable), applications standard (timeout d'inactivité 15-30 minutes, timeout absolu 8-24 heures), applications très sensibles type banque ou santé (timeout d'inactivité 5-15 minutes, timeout absolu 2-4 heures). Règle souvent oubliée : distinguer timeout d'inactivité (idle timeout, réarmé à chaque requête) et timeout absolu (absolute timeout, non réarmable, force re-authentification). Les applications SaaS grand public (Slack, Notion, Gmail) utilisent typiquement un idle timeout 2-4 semaines plus absolute timeout 90 jours avec re-authentification forcée aux actions sensibles, compromis ergonomie ou sécurité assumé.
  • Comment gérer la révocation de session en cas de logout ou changement de mot de passe ?
    Trois actions obligatoires au minimum. 1) Invalider le session ID côté serveur : suppression de l'entrée en Redis ou base, pas juste suppression du cookie côté client. 2) Émettre Set-Cookie avec Max-Age=0 ou Expires passé pour forcer le navigateur à supprimer localement. 3) En cas de changement de mot de passe, invalider toutes les sessions actives de l'utilisateur, pas seulement la courante. Pour les JWT, plusieurs patterns : blacklist Redis avec TTL égal à la durée du token restante, rotation forcée via token version incrémenté dans la DB user, short-lived access token plus refresh token révocable en base. Le logout qui ne fait que supprimer le cookie côté client sans invalidation server-side est une vulnérabilité classique détectée en pentest.
  • Quelles sont les 5 vulnérabilités de session les plus fréquentes en pentest 2026 ?
    Observations cumulées pentest France 2024-2026. 1) Session fixation : application qui ne régénère pas le session ID après login, permettant à un attaquant de pré-positionner l'ID. Contre-mesure : régénération systématique post-authentification. 2) Logout sans invalidation server-side : le cookie supprimé côté client mais session toujours valide si interceptée. 3) Cookies sans SameSite : CSRF facilité, obligatoire depuis Chrome 80 en février 2020 pour les requêtes cross-site. 4) JWT sans validation aud/iss/exp : accès cross-application possible. 5) Session timeout trop long ou absent : sessions valides des mois après dernière utilisation. Toutes ces vulnérabilités sont exploitables en Burp Suite en moins de 30 minutes par un pentester junior OSCP.

Écrit par

Naim Aouaichia

Expert cybersécurité et fondateur de Zeroday Cyber Academy

Expert cybersécurité avec un master spécialisé et un parcours hybride : développement, DevOps, DevSecOps, SOC, GRC. Fondateur de Hash24Security et Zeroday Cyber Academy. Formateur et créateur de contenu technique sur la cybersécurité appliquée, la sécurité des LLM et le DevSecOps.