Esc
 Naviguer  Ouvrir Esc Fermer
Aller au contenu

2.2 — HTTP en détail

🎯 Objectif : être capable de lire et de construire à la main une requête HTTP, comprendre tous les codes de statut et les en-têtes courants, et savoir gérer cookies et CORS.

À l'issue de cet axe, tu sauras :

  • Décrire l'anatomie d'une requête et d'une réponse HTTP
  • Choisir la bonne méthode (GET, POST, PUT, PATCH, DELETE) selon l'action
  • Interpréter un code de statut (1xx → 5xx)
  • Configurer cookies, sessions et CORS correctement
  • Inspecter les requêtes dans les DevTools du navigateur

Débutant 10 min prérequis : axe 1 lu

Une requête HTTP est du texte en clair (avant chiffrement TLS), avec une structure stricte :

GET /api/users/42 HTTP/1.1
Host: api.example.com
Accept: application/json
User-Agent: Mozilla/5.0 ...
Authorization: Bearer eyJhbGciOiJIUzI1...
Cookie: session=abc123

3 parties :

  1. Ligne de requête : MÉTHODE chemin VERSION
  2. En-têtes : Nom: Valeur, un par ligne
  3. Corps (optionnel) : après une ligne vide ; pour POST/PUT/PATCH
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 87
Cache-Control: max-age=300
Set-Cookie: session=xyz789; HttpOnly; Secure; SameSite=Lax
{"id":42,"name":"Alice","email":"alice@example.com"}

3 parties :

  1. Ligne de statut : VERSION code message
  2. En-têtes
  3. Corps
MéthodeSémantiqueIdempotente ?Corps ?
GETLire une ressourceNon
POSTCréer ou action arbitraireOui
PUTRemplacer entièrementOui
PATCHModifier partiellement❌ usuellementOui
DELETESupprimerOptionnel
HEADComme GET, sans le corpsNon
OPTIONSCapacités du serveur (préflight CORS)Non

5 familles, mémorise-les visuellement :

FamilleSensExemples emblématiques
1xx InformationnelEncore en cours100 Continue, 101 Switching Protocols
2xx SuccèsTout va bien200 OK, 201 Created, 204 No Content
3xx RedirectionVa voir ailleurs301 Moved Permanently, 302 Found, 304 Not Modified
4xx Erreur clientTu as fait une bêtise400, 401, 403, 404, 409, 422, 429
5xx Erreur serveurC’est nous, désolé500, 502, 503, 504
CodeNomQuand l’utiliser
200OKRéussite générale
201CreatedCréation réussie (POST/PUT)
204No ContentSuccès sans corps de réponse (DELETE typique)
301Moved PermanentlyRedirection définitive (SEO friendly)
302FoundRedirection temporaire
304Not ModifiedCache valide, le client peut réutiliser
400Bad RequestRequête mal formée
401UnauthorizedNon authentifié (token absent ou invalide)
403ForbiddenAuthentifié mais pas autorisé
404Not FoundRessource inexistante
409ConflictConflit (ex. e-mail déjà utilisé)
422Unprocessable EntityValidation a échoué (corps mal formé sémantiquement)
429Too Many RequestsRate limit atteint
500Internal Server ErrorBug côté serveur
503Service UnavailableServeur indisponible (maintenance, surcharge)
En-têteRôle
HostLe domaine visé (obligatoire en HTTP/1.1)
User-AgentIdentification du client (navigateur, bot, lib)
AcceptFormats acceptés en réponse (application/json)
Accept-LanguageLangues préférées (fr-FR,fr;q=0.9,en;q=0.8)
Accept-EncodingCompressions supportées (gzip, br)
AuthorizationIdentification (Bearer <token>, Basic ...)
CookieCookies envoyés au serveur
Content-TypeType du corps envoyé (application/json)
Content-LengthTaille du corps en octets
If-None-MatchETag, pour conditional GET (cache)
En-têteRôle
Content-TypeType du corps (text/html; charset=utf-8)
Content-LengthTaille du corps
Cache-ControlDirectives de cache (max-age=3600, no-store)
ETagEmpreinte de la ressource (cache)
Set-CookiePose un cookie
LocationURL de redirection (avec un 3xx)
Strict-Transport-SecurityHSTS (axe 2.3)
Content-Security-PolicyCSP (axe 12)
Access-Control-Allow-OriginCORS (voir plus bas)
Set-Cookie: session=abc123; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=86400

Attributs cruciaux :

AttributEffetQuand l’activer
HttpOnlyInaccessible en JS (document.cookie)Toujours pour les cookies de session
SecureEnvoyé uniquement en HTTPSToujours en production
SameSite=StrictPas envoyé en cross-siteCookies très sensibles
SameSite=LaxEnvoyé sur navigation top-level uniquementDéfaut moderne
SameSite=None; SecureEnvoyé en cross-siteIframes tierces, SSO
Path=/adminLimite l’envoi à un sous-cheminCompartimentage
Domain=.example.comCookie partagé entre sous-domainesSSO sur sous-domaines
Max-Age=3600Durée de vie en secondesToujours préciser
MécanismeCapacitéAccessible en JSEnvoyé au serveurCas d’usage
Cookie HttpOnly~4 Ko✅ à chaque requêteSession, JWT côté serveur
localStorage~5 MoPréférences UI, cache
sessionStorage~5 MoÉtat éphémère d’un onglet
IndexedDB50–80 % du disqueDonnées structurées offline

Par défaut, le navigateur bloque les requêtes JS vers une autre origine. Une origine = (protocole, domaine, port).

https://app.example.com → https://api.example.com ← cross-origin (sous-domaine différent)
http://app.example.com → https://app.example.com ← cross-origin (protocole différent)
http://app.example.com:3000 → http://app.example.com:8000 ← cross-origin (port différent)

Pour une requête « non simple » (méthode autre que GET/POST/HEAD, ou en-tête custom, ou Content-Type autre que text/plain / application/x-www-form-urlencoded / multipart/form-data), le navigateur envoie d’abord un OPTIONS :

sequenceDiagram
    participant N as Navigateur
    participant S as Serveur api.example.com

    N->>S: OPTIONS /users/42<br/>Origin: https://app.example.com<br/>Access-Control-Request-Method: PUT
    S-->>N: 204<br/>Access-Control-Allow-Origin: https://app.example.com<br/>Access-Control-Allow-Methods: PUT<br/>Access-Control-Allow-Headers: Content-Type
    N->>S: PUT /users/42<br/>(la vraie requête)
    S-->>N: 200 OK
Préflight CORS pour une requête PUT
// Express
import cors from 'cors';
app.use(cors({
origin: ['https://app.example.com'], // pas '*' avec credentials
credentials: true, // pour cookies
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
}));

Dans Chrome/Firefox, F12 → Network.

Tu y vois :

  • URL, méthode, statut, taille, durée de chaque requête
  • Onglet Headers : tous les en-têtes envoyés/reçus
  • Onglet Payload : le corps envoyé
  • Onglet Response : le corps reçu
  • Onglet Timing : DNS, connect, TLS, TTFB, download

C’est l’outil le plus important pour debug les problèmes web.

Fenêtre de terminal
# GET simple
curl https://api.example.com/users/42
# Voir les en-têtes
curl -i https://api.example.com/users/42
# Tout le détail (verbose)
curl -v https://api.example.com/users/42
# POST avec JSON
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name":"Alice"}'
# Avec authentification
curl -H "Authorization: Bearer $TOKEN" https://api.example.com/me
# Sauvegarder la réponse
curl -o output.json https://api.example.com/data
Tu fais POST /api/orders et le serveur renvoie 201. Que signifie ce code ?
Quelle méthode HTTP n'est PAS idempotente ?
Pour stocker un JWT côté navigateur de façon sécurisée, tu choisis...
  • MDN — HTTP : developer.mozilla.org/fr/docs/Web/HTTP — référence
  • HTTP Status Codes — httpstatuses.com : codes avec exemples
  • RFC 9110 — la spec HTTP semantics moderne
  • Inspecting HTTP traffic with Wireshark (pour aller voir les paquets bruts)

Suite : 2.3 — Sécurité du transport (TLS) pour comprendre comment HTTPS chiffre tout ça.