Aller au contenu principal

HTTP

Progression

#HTTP

Verbes, statuts, en-têtes, cookies/sessions; HTTP/2 multiplexé et HTTP/3 QUIC (aperçu). Comprendre les sémantiques permet d’écrire des clients/serveurs robustes et performants.

Objectifs d’apprentissage

  • Choisir la bonne méthode (idempotence, sécurité sémantique) et codes de statut adaptés.
  • Configurer cache et validation (Cache-Control, ETag) et comprendre Vary.
  • Connaître les en-têtes de sécurité et la politique CORS côté navigateur.
  • Distinguer HTTP/1.1 vs HTTP/2 (multiplexage) vs HTTP/3 (QUIC).

#Méthodes et sémantiques

Les méthodes expriment l’intention. GET et HEAD sont sûres: elles ne modifient pas l’état et peuvent être mises en cache. PUT et DELETE sont idempotentes: les rejouer ne change pas l’état final; POST ne l’est pas par défaut et convient aux créations ou aux actions non idempotentes. PUT remplace une ressource entière, alors que PATCH applique des modifications partielles; il faut documenter le format et la sémantique pour éviter les ambiguïtés.

#Flow: sémantique des méthodes

1/6
Négociation de contenu

Accept exprime les formats souhaités (ex.: application/json). Accept-Language/Accept-Encoding gèrent langue/encodage. Le serveur répond via Content-Type et Content-Language.

#Exemple de requête (curl)

bashbash
1curl -i https://example.com/

#Statuts

Les familles de statuts structurent le dialogue: 2xx pour le succès, 3xx pour les redirections, 4xx pour les erreurs côté client et 5xx pour les erreurs côté serveur. Distinguer 401 Unauthorized (authentification requise) et 403 Forbidden (authentifié mais interdit) évite de brouiller les signaux côté client. Un 409 Conflict raconte un conflit métier explicite; 422 Unprocessable Entity décrit une demande bien formée mais invalide au regard du domaine.

Redirections

301/308 (permanentes) vs 302/303/307 (temporaires). 307/308 conservent la méthode; 303 bascule vers GET.

Idempotence

GET, PUT, DELETE sont idempotents; POST ne l’est pas.

Statuts fréquents

200 OK, 201 Created, 204 No Content; 301/302/307/308 redirections; 400 Bad Request, 401/403 auth; 404; 409 Conflit; 422 Unprocessable Entity; 500/502/503/504.

#Animation: cycle requête → réponse

1
Connexion
TLS/ALPN si HTTPS (HTTP/2/3)
2
Requête
Méthode, URL, en‑têtes, corps (CORS/credentials si permis)
3
Réponse
Statut, en‑têtes (Cache‑Control/ETag), corps
4
Client
Affichage, cache éventuel, suivi des redirections

#Quiz

Lequel est un header de sécurité côté navigateur ?
Lequel est un header de sécurité côté navigateur ?

#Caching web (pratique)

#CDN stepper (MISS/REVALIDATE/HIT)

Age=0s • État=MISS
MISS
200 + Cache-Control: max-age=60, ETag « v1 »
REVALIDATE
GET If-None-Match: « v1 » → 304 ou 200 nouvelle version
HIT
Servi depuis CDN (Age=0s)

Le cache économise de la bande passante et du temps, mais il doit être explicite. Cache-Control: max-age=3600, public autorise la réutilisation pendant une heure; no-store interdit tout stockage pour les données sensibles. La validation conditionnelle repose sur ETag/If-None-Match ou Last-Modified/If-Modified-Since et permet de répondre 304 Not Modified. Les variantes listées par Vary créent des clés de cache distinctes selon des en‑têtes (langue, encodage, autorisation).

Heuristique navigateur

Sans directives, les navigateurs peuvent appliquer des heuristiques (ex. revalidation). Soyez explicite pour les assets et l’API.

#Animation: décision de cache

Autorisé ?
`Cache-Control: no-store` → jamais
Fraîcheur
max-age non expiré → HIT direct
Validation
If-None-Match/If-Modified-Since → 304
Stockage
Mettre à jour métadonnées du cache
Vary
Clé dépend d’headers listés

#Cookies, CORS et sécurité

Les cookies de session portent des attributs de sécurité: Secure pour HTTPS, HttpOnly pour rester invisibles au JavaScript, SameSite pour réduire le CSRF. Le CORS autorise explicitement les origines à accéder aux réponses d’une API; il doit être restreint et cohérent avec l’usage des credentials. Les en‑têtes comme Content-Security-Policy, X-Content-Type-Options: nosniff, Referrer-Policy et Strict-Transport-Security améliorent la posture globale.

Le contrôle de concurrence côté HTTP se base sur les préconditions. If-Match avec un ETag empêche les mises à jour perdues: si l’étiquette ne correspond plus, la ressource a changé et le serveur renvoie 412 Precondition Failed.

Attributs de cookie
  • Secure: uniquement via HTTPS.
  • HttpOnly: caché au JS (mitige XSS).
  • SameSite: Strict/Lax réduit le CSRF; None seulement avec Secure.
  • Domain/Path: restreindre la portée au minimum.
HSTS

Strict-Transport-Security: max-age=31536000; includeSubDomains force HTTPS côté navigateur. À activer seulement quand tout le domaine est prêt.

CORS minimal

Pour une API publique: Access-Control-Allow-Origin: https://app.example (pas * avec credentials), Vary: Origin, et limiter méthodes/headers exposés.

Quel attribut réduit les risques CSRF pour un cookie de session ?
Quel attribut réduit les risques CSRF pour un cookie de session ?

#Lab: diagnostiquer le cache HTTP

Objectif: observer un hit, une revalidation 304, puis un miss contrôlé.

  1. Première requête (MISS, création ETag):
bashbash
1curl -i https://api.example.com/data.json
  1. Requête conditionnelle avec If-None-Match (304 attendu):
bashbash
1ETAG=$(curl -sI https://api.example.com/data.json | awk -F': ' '/^ETag/{print $2}')2curl -i -H "If-None-Match: $ETAG" https://api.example.com/data.json
  1. Simuler une nouvelle version (changer ressource côté serveur), puis constater 200 + nouvel ETag.

#Animation: cycle MISS → VALIDATE → HIT

MISS
200 + ETag/Cache-Control
VALIDATE
If-None-Match → 304 si inchangé
HIT
Rendu depuis cache (encore frais)

#Simulateur de cache (headers → résultat)

Simulateur de cache HTTP (navigateur/CDN simple)
Politique de réponse
ETag présent
État côté cache
0s
If-None-Match
HITfrais (< max-age=600s)
Règle: no-store → MISS ; frais → HIT ; sinon ETag+If-None-Match → 304 ; à défaut → MISS

#Diagramme: MISS → VALIDATE → HIT (client, CDN, origine)

Client
CDN
Origine
1. GET /app.css
2. MISS → GET /app.css
3. 200 + Cache-Control + ETag
4. 200 (HIT en cache ensuite)
5. GET If-None-Match: "etag"
6. Validation (si expiré ou pas autorisé en CDN)
7. 304 Not Modified
8. 304 (ou 200 depuis cache frais)

#Quiz éclair

Quelle combinaison permet une revalidation efficace ?
Quelle combinaison permet une revalidation efficace ?

#HTTP/2 et HTTP/3 (détails)

#Visualisation: priorités et multiplexage HTTP/2

Stream #1
prio: 12
plan: 11
Stream #3
prio: 4
plan: 4
Stream #5
prio: 1
plan: 1
Partage de bande passante proportionnel au poids (HTTP/2)

HTTP/2 multiplexe plusieurs requêtes sur une seule connexion, compresse les en‑têtes (HPACK) et propose des priorités; le « server push » a été déprécié côté navigateurs. HTTP/3 s’appuie sur QUIC (UDP), supprime le blocage de tête de ligne, prend en charge la migration de connexion lors d’un changement de réseau et permet un 0‑RTT qui doit être employé avec prudence pour éviter les replays.

Coalescence de connexion

Avec HTTP/2/3, des origines partageant un certificat compatible peuvent coalescer des requêtes sur une connexion, réduisant la latence (selon SNI/ALPN et politique du client).

#Diagramme: HTTP/2 multiplexage

Client
Serveur
appel async/retour activation fragments
PAR: Multiplexage sur 1 connexion
1 connexion TLS (ALPN h2), plusieurs streams

#Snippets : en‑têtes de sécurité (Express)

tsts
1// À placer tôt dans votre pipeline (ou utilisez helmet en production)2app.use((req, res, next) => {3  res.set({4    // Force HTTPS côté navigateur (activer une fois tout prêt)5    'Strict-Transport-Security': 'max-age=31536000; includeSubDomains',6    // Politique CSP minimale (adapter selon vos besoins; privilégier nonce/sha256)7    'Content-Security-Policy': [8      "default-src 'self'",9      "base-uri 'self'",10      "object-src 'none'",11      "frame-ancestors 'none'",12      // Exemple avec nonce pour scripts dynamiques: script-src 'self' 'nonce-<nonce>'13    ].join('; '),14    // Empêche l’inférence de type
CSP en pratique

Évitez 'unsafe-inline'. Utilisez des nonces ou des hashes pour les scripts/styles dynamiques, et préférez des ressources self ou des domaines strictement listés.

#HTTP/3 (QUIC) : handshake et migration de connexion

Client
Serveur
appel async/retour activation fragments
UDP + QUIC (TLS 1.3 intégré), pas de HoL blocking
0‑RTT et replays

Le 0‑RTT réduit la latence mais permet des replays. N’autorisez jamais des opérations non idempotentes en 0‑RTT sans garde‑fous (clés d’idempotence, rejets).