Aller au contenu principal

Réseaux & Web · L2 · Section 4/7

HTTP

Progression

Points d’expérience : XPSérie de jours consécutifs : · —Progression du module : — / —compris

#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.

1
GET
Lecture; sûr; cachable
2
HEAD
Métadonnées (sans corps)
3
POST
Non idempotent; création/action
4
PUT
Idempotent; remplace entièrement
5
PATCH
Modification partielle
6
DELETE
Idempotent; suppression

#Trace de référence: une requête et sa réponse

texttext

1$ curl -i https://api.example.com/data.json2GET /data.json HTTP/1.13Host: api.example.com4User-Agent: curl/8.5.05Accept: */*6 7HTTP/1.1 200 OK8Content-Type: application/json9Content-Length: 12810Cache-Control: public, max-age=6011ETag: "v1"12Vary: Accept-Encoding13 14{"items":[...]}

Tout le reste de cette page se lit sur cette trace: le statut (200), les en-têtes de cache (Cache-Control, ETag), la négociation (Accept/Content-Type). La version négociée apparaît dans la ligne de statut (HTTP/1.1) ou via ALPN pour HTTP/2/3.

#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.

#Animation: cycle requête puis 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
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).

#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 vers 304
Stockage
Mettre à jour métadonnées du cache
Vary
Clé dépend des en-têtes 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.

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

Réponse attendue: 200 OK avec ETag: "v1" et Cache-Control: public, max-age=60.

  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

Réponse attendue:

texttext

1HTTP/1.1 304 Not Modified2ETag: "v1"

Pas de corps: le client réutilise celui qu'il a en cache. C'est la signature exacte d'une revalidation réussie.

  1. Simuler une nouvelle version (changer la ressource côté serveur), puis constater 200 avec un nouvel ETag.

#Simulateur de cache (en-têtes, 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: "v1"
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.

#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

#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

#Diagnostic: quatre échecs HTTP typiques et leur signature

  • 502 Bad Gateway derrière un proxy (nginx, CDN): le proxy a joint l'amont mais la réponse est invalide ou la connexion a échoué. Le problème est derrière le proxy: santé du backend, timeout, protocole. curl -I direct sur le backend isole la cause.
  • 504 Gateway Timeout: le proxy a bien transmis mais l'amont n'a pas répondu dans le délai. À distinguer de 502 (réponse cassée) et de 503 (surcharge déclarée, souvent avec Retry-After).
  • 431/413 (en-têtes ou corps trop grands): la requête part complète mais un maillon (proxy, serveur) la rejette avant l'application; vérifiez la taille des cookies et les limites du serveur.
  • Requête qui « refait » un POST après un timeout: un client HTTP qui rejoue sur timeout peut dupliquer une opération non idempotente; la parade est une clé d'idempotence applicative, pas un réglage HTTP.

Exercice écrit (corrigé): un appel GET /api/records renvoie 200 avec Cache-Control: no-store mais l'onglet Réseau montre « (from disk cache) ». Expliquez. Correction: no-store interdit le stockage; si le navigateur sert malgré tout du disque, c'est qu'une réponse antérieure sans no-store (ou une redirection intermédiaire mise en cache) a été réutilisée. Videz le cache, rejouez, et vérifiez avec curl -I que la réponse vue par le client porte bien no-store (un CDN peut l'avoir retirée).