Cycle et vocabulaire
Une requête HTTP : méthode (GET, POST, PUT, DELETE), cible (chemin, requête), en-têtes, corps. Une réponse : code d'état (2xx, 3xx, 4xx, 5xx), en-têtes, corps.
HTTP est sans état : chaque requête porte ses justificatifs (jeton, clé).
Notions clés : sûr (lecture seule), idempotent (plusieurs appels = un seul effet).
Méthodes et idempotence
| Méthode | Usage | Sûr | Idempotent |
|---|---|---|---|
| GET | lire | oui | oui |
| HEAD | en-têtes seuls | oui | oui |
| POST | créer, déclencher | non | non |
| PUT | remplacer | non | oui |
| DELETE | supprimer | non | oui |
| PATCH | modifier en partie | non | dépend |
Codes d'état principaux
| Code | Sens |
|---|---|
| 200 | OK |
| 201 | Created (+ Location) |
| 204 | No Content (succès sans corps) |
| 301, 302 | redirection permanent/temporaire |
| 304 | Not Modified (cache valide) |
| 400 | Bad Request (client) |
| 401 | Unauthorized (identité manquante) |
| 403 | Forbidden (droits insuffisants) |
| 404 | Not Found |
| 409 | Conflict |
| 415 | Unsupported Media Type |
| 422 | Unprocessable Content (validation) |
| 429 | Too Many Requests |
| 500, 502, 503 | erreur serveur / intermédiaire |
En-têtes courants
| En-tête | Direction | Rôle |
|---|---|---|
Host | → | nom du serveur |
Accept | → | formats acceptés (application/json) |
Content-Type | ↔ | format du corps |
Authorization | → | justificatif (Bearer <JETON>, Basic …) |
Cache-Control | ← | max-age=N, no-store, private |
ETag, Last-Modified | ← | version pour validation cache |
Location | ← | adresse d'une ressource créée |
Retry-After | ← | délai avant réessai |
Set-Cookie, Cookie | ↔ | état persistant |
Origin, Access-Control-* | ↔ | CORS |
→ = requête, ← = réponse, ↔ = les deux.
Versions HTTP
| Version | RFC | Transport | Idée |
|---|---|---|---|
| HTTP/1.1 | 9112 | TCP, texte | Un message à la fois |
| HTTP/2 | 9113 | TCP, binaire | Multiplexage, compression en-têtes |
| HTTP/3 | 9114 | QUIC (UDP) | Multiplexage par flux |
HTTPS : HTTP + TLS (voir cours « Chiffrement »).
REST : ressources et conventions
| Opération | Méthode | Chemin | Succès |
|---|---|---|---|
| Lister | GET | /v1/ressources | 200 |
| Lire | GET | /v1/ressources/42 | 200 |
| Créer | POST | /v1/ressources | 201 + Location |
| Remplacer | PUT | /v1/ressources/42 | 200 ou 204 |
| Modifier | PATCH | /v1/ressources/42 | 200 ou 204 |
| Supprimer | DELETE | /v1/ressources/42 | 204 |
Erreur normalisée (RFC 9457, application/problem+json) :
{"type": "…", "title": "…", "status": 429, "detail": "…"}JSON et pagination
JSON (RFC 8259) : objets, tableaux, chaînes, nombres, booléens, null. UTF-8 obligatoire.
Pagination : par décalage (?limite=50&decalage=100) ou par curseur (?apres=<curseur>).
Cache
Cache-Control: max-age=N: fraîcheur en secondesno-store: ne pas stockerprivate: cache local seul (données personnelles)ETag/Last-Modified: validation ; client renvoieIf-None-Match/If-Modified-Since; serveur répond304
Données personnelles : toujours private ou no-store.
Authentification des appels
| Mécanisme | Format | Points clés |
|---|---|---|
| Clé d'API | Authorization: <CLE> (en-tête) | scope réduit, rotation |
| Basic | Authorization: Basic <base64(user:pwd)> | seulement en TLS |
| Jeton Bearer | Authorization: Bearer <JETON> | durée courte, révocation |
| OAuth 2.0 | jeton émis par serveur d'autorisation | délégation, scope |
| OpenID Connect | ID Token JWT au-dessus d'OAuth 2.0 | authentification, vérifier la signature |
Encadré secrets.
Attention : secret ne va jamais dans une URL, un journal, une capture ou Git. Passer par l'en-tête Authorization, stocker en Trousseau, faire tourner, révoquer en cas de doute.
CORS
- Requête simple (GET, HEAD, POST) : pas de contrôle préalable
- Preflight (OPTIONS) : pour méthodes/en-têtes personnalisés
- Réponse :
Access-Control-Allow-Origin,-Methods,-Headers,-Credentials - Avec identifiants :
Originnommée, pas*, +-Credentials: true
CORS appliqué par le navigateur ; curl ignore. L'API doit toujours authentifier côté serveur.
Limitation de débit
Réponse 429 quand limite atteinte. Reessai avec délai croissant (exponentiel + aléa), jamais en boucle serrée.
Limiter par clé, adresse, route sensible, au niveau proxy.
curl (lecture seule)
Service jetable (boucle locale, 127.0.0.1, quelques secondes) :
Attention, effet notable. Cette commande peut écrire ou écraser un fichier. Lire le contexte, les droits et l’effet attendu indiqués après le bloc ; ne jamais l’exécuter sur un système réel sans validation, d’abord dans un environnement de test.
DEMO="$(mktemp -d)" && cd "$DEMO"echo '{"id": 42}' > test.jsonpython3 -m http.server 8080 --bind 127.0.0.1Bloc actif : la touche C copie la commande seule, sans invite ni sortie.
- Contexte : Terminal sur une machine de démonstration.
- Droits : utilisateur.
- Effet : crée un dossier temporaire, y ajoute un fichier JSON, lance un serveur HTTP jetable.
- Vérification :
curl -s http://127.0.0.1:8080/test.json | jqretourne{"id": 42}. - Retour arrière :
Control-Carrête le serveur ;rm -r "$DEMO"efface le dossier.
Lecture :
curl -v http://127.0.0.1:8080/test.jsoncurl -sI http://127.0.0.1:8080/test.jsoncurl -s http://127.0.0.1:8080/test.json | jq '.id'curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/absent.jsoncurl -v --resolve api.example.test:8080:127.0.0.1 http://api.example.test:8080/test.jsonBloc actif : la touche C copie la commande seule, sans invite ni sortie.
- Contexte : Terminal ; curl 8.23.0, jq 1.8, python3 non vérifiés.
- Droits : utilisateur.
- Effet : quelques requêtes vers la boucle locale, lecture seule.
- Vérification : voir les en-têtes, codes, réponses JSON.
- Retour arrière :
Control-C, puisrm -r "$DEMO".
Options curl : -v (détail), -i (en-têtes + corps), -I (en-têtes seuls), -s (silencieux), -H (en-tête custom), -X (méthode), --json (type JSON), -w (format sortie), -o (fichier).
jq : ., .clé, .[], select(…) ; options -r (texte brut), -c (compact), -e (code sortie).
OWASP API Security Top 10 (2023)
| Risque | Défense en une phrase |
|---|---|
| API1 Broken Object Level Authorization | vérifier l'accès à chaque objet |
| API2 Broken Authentication | jetons courts, MFA, limite d'essais |
| API3 Broken Object Property Level Authorization | n'exposer que les champs autorisés |
| API4 Unrestricted Resource Consumption | limiter débit, taille, pagination, délais |
| API5 Broken Function Level Authorization | séparer et contrôler les routes d'admin |
| API6 Unrestricted Access to Sensitive Flows | limiter l'automatisation (achat, inscription) |
| API7 Server Side Request Forgery | valider les URL à appeler |
| API8 Security Misconfiguration | durcissement, CORS strict, en-têtes de sécurité |
| API9 Improper Inventory Management | inventaire des API et versions |
| API10 Unsafe Consumption of APIs | traiter les réponses tierces comme non fiables |
Renvois
Chiffrement et TLS : cours « Chiffrement et cryptographie ». Authentification centralisée (OAuth, SAML, OIDC) : cours « Annuaires et identités ».
Points non vérifiés
Versions curl, jq, python3, macOS. Options de python3 -m http.server. RFC 9110 (tableau sûr/idempotent, codes 422, etc.) : titres et résumés seuls. PATCH (RFC 5789), .test (RFC 6761), RFC 6265 (cookies, peut être obsolète). Conventions REST (versionnement, pagination, clés d'idempotence) : non normalisées. OpenAPI 3.2.1, résumés de pages web : lus par outil. JWT, PKCE, DPoP, mTLS : non lus. Détails des dix risques OWASP : seuls intitulés lus.
Sources
Consultées le 18 octobre 2026.
- RFC : 9110 (s’ouvre dans un nouvel onglet) (2022) · 9111 (s’ouvre dans un nouvel onglet) · 9112 (s’ouvre dans un nouvel onglet) · 9113 (s’ouvre dans un nouvel onglet) (2022) · 9114 (s’ouvre dans un nouvel onglet) (2022) · 6265 (s’ouvre dans un nouvel onglet) (2011) · 6585 (s’ouvre dans un nouvel onglet) · 8259 (s’ouvre dans un nouvel onglet) (2017) · 9457 (s’ouvre dans un nouvel onglet) (2023) · 7617 (s’ouvre dans un nouvel onglet) (2015) · 6749 (s’ouvre dans un nouvel onglet) (2012) · 6750 (s’ouvre dans un nouvel onglet) · 9700 (s’ouvre dans un nouvel onglet) (2025)
- OAuth 2.0 (s’ouvre dans un nouvel onglet) · OpenID Connect Core 1.0 (s’ouvre dans un nouvel onglet) (15 décembre 2023) · OpenAPI 3.2.1 (s’ouvre dans un nouvel onglet) (10 septembre 2026)
- MDN CORS (s’ouvre dans un nouvel onglet) (4 septembre 2026) · OWASP API Security Top 10 2023 (s’ouvre dans un nouvel onglet)
- curl 8.23.0 (s’ouvre dans un nouvel onglet) · jq 1.8 (s’ouvre dans un nouvel onglet)