Authentification & sécurité Web
Progression
#Authentification Web: modèles, menaces, pratiques sûres
Cette page refonde entièrement le sujet « Auth Web » avec un fil conducteur clair: choisir le bon modèle d’auth, comprendre les menaces et appliquer des défenses concrètes, testables et reproductibles.
#Panorama rapide
- Modèles: sessions côté serveur (cookies) vs jetons porteurs (JWT/OAuth).
- Risques majeurs: XSS, CSRF, fixation/vol de session, fuites d’URL, CORS mal configuré.
- Défenses clés: cookies
HttpOnly+Secure+SameSite
, CSRF token, CSP stricte, PKCE, scopes minimaux, rotations et TTL courts.
#Sessions côté serveur (cookies)
Les sessions stockent l’état côté serveur (base/Redis). Le navigateur ne garde qu’un identifiant opaque. C’est le choix par défaut pour les apps web classiques (même site).
#Exemple minimal (Node/Express)
1import express from 'express'2import session from 'express-session'3import crypto from 'crypto'4 5const app = express()6app.use(express.json())7 8app.use(session({9 name: 'sid',10 secret: process.env.SESSION_SECRET!,11 resave: false,12 saveUninitialized: false,13 cookie: {14 httpOnly: true,
#Diagramme: login avec session
Ajoutez un jeton synchronisé (double‑submit ou session‑bound) pour chaque action d’état: incluez‑le en header personnalisé (ex: X-CSRF-Token
) et refusez les requêtes cross‑site sans ce jeton.
#Jetons porteurs (JWT) et APIs
Les JWT encapsulent des réclamations signées. À privilégier pour exposition API, micro‑services, et intégrations OAuth/OIDC. Sur un front web, évitez le stockage persistant accessible au JS (localStorage) — préférez un BFF (backend‑for‑frontend) avec cookies HttpOnly
ou des jetons gardés en mémoire et renouvelés souvent.
#Vérification d’un JWT (Python)
1import jwt, time2 3SECRET = 'change-me'4 5token = jwt.encode({6 'sub': '123',7 'iss': 'https://idp.example',8 'aud': 'api://my-service',9 'iat': int(time.time()),10 'exp': int(time.time()) + 90011}, SECRET, algorithm='HS256')12 13try:14 claims = jwt.decode(
Access tokens courts (5–15 min). Rafraîchissez avec rotation des refresh tokens (une seule utilisation), détection d’anomalies et liste de révocation.
#Démo interactive
- Cookies: HttpOnly, Secure, SameSite=Lax
- Jeton CSRF synchronisé
- Régénération d’ID au login
- TTL court, invalidation au logout
#Menaces et contre‑mesures
- XSS: la compromission JS permet l’exfiltration de jetons/cookies. Défenses: éviter les sinks (
innerHTML
), échapper systématiquement, CSP stricte, Trusted Types, audits. - CSRF: pour cookies non SameSite=None ou flux cross‑site, exigez jeton CSRF et vérifiez
Origin/Referer
pour mutations. - Fixation/vol de session: régénérez l’ID au login, TTL court, Secure+HttpOnly, surveillance d’IP/UA optionnelle.
- Fuites d’URL: ne mettez jamais de secrets dans la query; si OAuth, utilisez code+PKCE plutôt que
implicit
.
#OAuth 2.1 / OpenID Connect (PKCE)
#Diagramme: Authorization Code + PKCE
Le flux Authorization Code avec PKCE est la base moderne pour apps SPA/mobile et serveurs web. Il évite l’exposition directe d’un token dans l’URL.
- Validez
state
(anti‑CSRF) etnonce
(anti‑replay ID token). - Vérifiez
iss
,aud
,exp
,nbf
et la signature (JWKSkid
). - Bloquez les redirections hors allowlist stricte; refuser les wildcards.
#CORS, pré‑vol et cookies
Comprendre la pré‑vérification évite des ouvertures inutiles.
Exemple côté serveur (Express) avec cookies cross‑site contrôlés:
1import cors from 'cors'2 3app.use(cors({4 origin: (origin, cb) => {5 const allowed = ['https://app.example']6 cb(null, allowed.includes(origin ?? ''))7 },8 credentials: true,9 methods: ['GET','POST','DELETE'],10 allowedHeaders: ['Content-Type','X-CSRF-Token']11}))
credentials:true
interdit Access-Control-Allow-Origin: *
. Répondez avec l’origine exacte et ajoutez Vary: Origin
.
#CSP pour pages d’auth
Visez l’absence d’inline et des nonces/hashes. Exemple d’en‑tête compact:
1Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-__NONCE__' 'strict-dynamic'; style-src 'self'; img-src 'self' data:; frame-ancestors 'none'; base-uri 'self'
Astuce: générez un nonce par requête et appliquez‑le aux scripts nécessaires; empêchez l’embed avec frame-ancestors
.
#Checklist de déploiement
- Cookies:
HttpOnly
,Secure
,SameSite=Lax
(ouNone
+ HTTPS pour cross‑site). - Sessions: régénération post‑login, TTL court, invalidation complète au logout.
- Jetons: durées courtes, rotation des refresh, audience/issuer stricts, scopes minimaux.
- CSRF: jetons obligatoires pour mutations, vérification
Origin/Referer
. - Sécurité front: CSP stricte, Trusted Types, aucun secret dans l’URL, pas de stockage persistant des tokens.
- Observabilité: journaux d’auth, détection d’échecs répétés, alertes et revocations.
- Stocker des tokens persistants dans
localStorage
sans BFF → sensibles au XSS. - Oublier
SameSite
sur les cookies → surface CSRF inutile. - Accepter tous les
Origin
en CORS aveccredentials:true
→ fuite de données. - Négliger la rotation/TTL des tokens → fenêtre d’attaque élargie.