Aller au contenu
Sommaire

Cours HTTP et API REST — requêtes, codes d'état, en-têtes, cache, authentification, JSON, CORS et sécurité

Cours · environ 22 min de lecture

Validé

Validé. Ce site n’exécute aucune commande. 8 points non vérifiés · Sources

Objectifs d'apprentissage

À la fin de ce cours, l'apprenant peut :

  1. décrire le cycle requête/réponse HTTP et lire une requête et une réponse ;
  2. choisir une méthode HTTP et un code d'état adaptés, et dire ce que signifient sûr et idempotent ;
  3. lire les en-têtes courants (type de contenu, cache, cookies, autorisation) ;
  4. situer HTTP/1.1, HTTP/2 et HTTP/3 en principe, et dire où intervient TLS ;
  5. concevoir en principe une API REST : ressources, JSON, versionnement, pagination, erreurs normalisées ;
  6. comparer clé d'API, Basic, jeton Bearer, OAuth 2.0 et OpenID Connect ;
  7. expliquer CORS et la limitation de débit ;
  8. observer un échange avec curl -v et filtrer du JSON avec jq, en lecture, sur un service jetable ;
  9. citer les dix risques de l'OWASP API Security Top 10 (2023) et un réflexe de défense pour chacun.

Prérequis

  • Savoir ouvrir Terminal et lire une commande avant de la valider (cours « Terminal macOS »).
  • Notions de réseau : adresse, port, DNS, TCP (cours « Réseau », section Exploitation).
  • Notions de chiffrement et de certificat (cours « Chiffrement et cryptographie »), utiles pour TLS.
  • curl est livré avec macOS ; jq et python3 ne sont pas garantis : non vérifié (chapitre 11).

Parcours et chapitres

1. Le cycle requête/réponse

HTTP est un protocole sans état de type client/serveur : le client envoie une requête, le serveur renvoie une réponse. La RFC 9110 (« HTTP Semantics », STD 97, juin 2022) définit la sémantique commune à toutes les versions de HTTP (méthodes, codes d'état, en-têtes) ; chaque version a sa propre RFC pour la syntaxe sur le réseau (chapitre 5). Entre le client et le serveur peuvent se trouver des intermédiaires : proxy, proxy inverse, CDN, passerelle d'API.

Schéma : un client envoie une requête vers un proxy inverse ou CDN, qui la transmet au serveur d'API ; la réponse suit le chemin inverse. La requête contient méthode, chemin, en-têtes et corps ; la réponse contient code d'état, en-têtes et corps.Clientnavigateur, curl, applicationrequêteréponseProxy inverse ou CDNcache, TLS, limite de débitServeur d'APIapi.example.test : ressources, JSONRequête : méthode, chemin, en-têtes, corpsRéponse : code d'état, en-têtes, corps
Cycle requête/réponse HTTP avec un intermédiaire (schéma pédagogique simplifié, noms synthétiques).

Une requête comporte une ligne de requête (méthode, cible, version), des en-têtes et éventuellement un corps. Une réponse comporte un code d'état, des en-têtes et éventuellement un corps. Exemple de la forme générale (syntaxe HTTP/1.1, valeurs synthétiques) :

GET /v1/utilisateurs/42 HTTP/1.1
Host: api.example.test
Accept: application/json

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store

{"id": 42, "nom": "demo"}

À retenir : « sans état » signifie que chaque requête doit porter tout ce qu'il faut pour être comprise (identité, contexte) ; le serveur n'a pas à se souvenir de la précédente. Les cookies et jetons (chapitres 6 et 9) servent justement à transporter cet état.

Vérification : décomposer la requête ci-dessus en méthode, cible, version, en-têtes et corps.

2. Méthodes HTTP, sûr et idempotent

La RFC 9110 définit les méthodes. Deux notions à retenir :

  • sûre : la méthode ne sert qu'à lire, sans effet voulu sur le serveur ;
  • idempotente : répéter la même requête plusieurs fois a le même effet qu'une seule.
MéthodeUsage habituelSûreIdempotente
GETlire une ressourceouioui
HEADlire les seuls en-têtesouioui
OPTIONSdemander les capacités (utilisée par CORS)ouioui
PUTremplacer une ressourcenonoui
DELETEsupprimer une ressourcenonoui
POSTcréer ou déclencher un traitementnonnon
PATCHmodifier en partie (RFC 5789)nonnon (dépend de l'usage)

PATCH est défini dans une RFC distincte (RFC 5789) qui n'a pas été relue pour ce cours : son caractère non idempotent par défaut est non vérifié ici. L'idempotence permet de rejouer sans risque une requête dont la réponse s'est perdue ; pour un POST, certaines API acceptent une clé d'idempotence envoyée en en-tête (convention d'API, pas une règle de la RFC 9110 : non vérifié).

Attention : « sûr » est une promesse du serveur, pas une garantie. Un GET qui supprime ou modifie quelque chose est une erreur de conception : des intermédiaires et des robots rejouent les GET.

Exercice : classer GET, PUT, DELETE, POST selon sûr/idempotent sans regarder le tableau.

3. Codes d'état

Le code d'état est un nombre à trois chiffres ; le premier donne la classe.

ClasseSensExemples
1xxinformation101 Switching Protocols
2xxsuccès200 OK, 201 Created, 204 No Content
3xxredirection301, 302, 304 Not Modified
4xxerreur du client400, 401, 403, 404, 409, 415, 422, 429
5xxerreur du serveur500, 502, 503, 504

Points de vocabulaire utiles aux API :

  • 401 Unauthorized : l'identification est absente ou invalide (malgré son nom, c'est un problème d'authentification) ; 403 Forbidden : le serveur sait qui vous êtes mais refuse (autorisation).
  • 201 Created accompagne en général un en-tête Location désignant la nouvelle ressource ; 204 : succès sans corps.
  • 409 Conflict : conflit avec l'état actuel de la ressource.
  • 429 Too Many Requests : limitation de débit, définie par la RFC 6585 (avril 2012, avec 428, 431 et 511) ; sa réponse ne doit pas être mise en cache.
  • 502, 503, 504 : le plus souvent un problème d'intermédiaire ou de disponibilité, pas du client.

Le statut exact de 422 (non défini par la RFC 9110 dans ses grandes lignes lues ici) et l'emploi précis de 418 sont non vérifiés ; en pratique les API utilisent 400 ou 422 pour une validation échouée : choix de conception, à fixer par équipe.

À retenir : le code d'état est la première information à lire dans une réponse, avant le corps.

4. En-têtes courants et négociation de contenu

Les en-têtes sont des paires Nom: valeur, insensibles à la casse pour le nom. Ceux qu'il faut connaître :

En-têteSens
Hostnom du serveur visé (plusieurs sites sur une adresse)
Acceptformats que le client sait lire (application/json)
Content-Typeformat du corps envoyé
Content-Lengthtaille du corps
Authorizationjustificatifs d'identité (chapitre 9)
User-Agentlogiciel client
Locationadresse d'une ressource créée ou d'une redirection
Retry-Afterdélai avant de réessayer (429, 503)
Cache-Control, ETag, Last-Modifiedcache (chapitre 7)
Set-Cookie, Cookiecookies (chapitre 6)
Origin, Access-Control-*CORS (chapitre 12)

La négociation de contenu permet au client d'annoncer ses préférences (Accept) et au serveur de répondre dans un format avec Content-Type. Un serveur qui reçoit un corps dans un format qu'il ne gère pas répond en général 415 ; un format de réponse non disponible, 406.

Attention : ne jamais placer un secret dans un en-tête que l'on journalise (par exemple Authorization, Cookie) : voir l'encadré du chapitre 9.

5. Versions du protocole : HTTP/1.1, HTTP/2 et HTTP/3

Les trois versions transportent la même sémantique (RFC 9110) mais pas de la même façon :

VersionRFCIdée principaleTransport
HTTP/1.1RFC 9112 (syntaxe textuelle)messages en texte lisible, une requête à la fois par connexionTCP
HTTP/2RFC 9113 (Proposed Standard, 2022)trames binaires, plusieurs échanges multiplexés sur une connexion, compression des en-têtesTCP
HTTP/3RFC 9114 (Proposed Standard, 2022)HTTP sur QUIC, multiplexage par flux, compression QPACKQUIC (UDP)

Pour le développeur d'API, la version est en général transparente : la même requête logique (méthode, chemin, en-têtes) s'écrit différemment sur le fil, mais le client et le serveur négocient la version. La RFC 9112 n'a pas été relue en détail ici (seule sa référence l'a été) : le détail de la syntaxe HTTP/1.1 est non vérifié.

TLS en renvoi. HTTPS est HTTP au-dessus de TLS : le chiffrement, le certificat du serveur et la vérification du nom sont traités dans le cours « Chiffrement et cryptographie ». Retenir seulement ici : toute API qui transporte un jeton ou des données personnelles doit être servie en HTTPS ; sur la boucle locale d'un exercice jetable, HTTP en clair est toléré parce que rien ne sort de la machine.

6. Cookies et sessions

Un cookie est un petit état que le serveur demande au client de conserver (Set-Cookie) et de renvoyer (Cookie). Il est défini par la RFC 6265 (avril 2011, Proposed Standard). Cette RFC a pu être mise à jour ou remplacée depuis : non vérifié. Attributs à connaître (décrits aussi sur MDN) :

  • Secure : cookie envoyé seulement en HTTPS ;
  • HttpOnly : inaccessible au JavaScript de la page ;
  • SameSite : limite l'envoi dans les requêtes entre sites (réduit le CSRF) ;
  • Max-Age / Expires : durée de vie ; Domain / Path : portée.

Les API appelées par des applications ou des scripts utilisent plutôt des jetons dans l'en-tête Authorization ; les cookies de session sont plutôt l'affaire des navigateurs. Un cookie de session est un secret au même titre qu'un mot de passe.

7. Cache

La RFC 9111 (« HTTP Caching », STD 98, juin 2022) décrit les caches privés (un seul utilisateur, le navigateur) et partagés (proxy, CDN). Notions clés :

  • Cache-Control : max-age=N (durée de fraîcheur), no-store (ne rien stocker), no-cache (valider avant réutilisation), private / public ;
  • validation : ETag (empreinte de version) ou Last-Modified ; le client renvoie If-None-Match / If-Modified-Since et le serveur répond 304 Not Modified sans corps si rien n'a changé ;
  • Vary : liste les en-têtes de requête qui changent la réponse (par exemple Accept), pour ne pas servir la mauvaise variante.

Attention : une réponse contenant des données propres à un utilisateur doit porter Cache-Control: private ou no-store, sinon un cache partagé peut la resservir à quelqu'un d'autre.

8. REST : ressources, JSON et conventions

REST est un style d'architecture, pas un protocole : on expose des ressources identifiées par des URL (noms au pluriel : /v1/utilisateurs, /v1/utilisateurs/42) et on agit dessus avec les méthodes HTTP. La définition d'origine de REST (thèse de R. Fielding) n'a pas été consultée ici : ce cours présente les conventions courantes, qui varient d'une équipe à l'autre.

Conventions fréquentes :

BesoinConvention
ListerGET /v1/utilisateurs
LireGET /v1/utilisateurs/42
CréerPOST /v1/utilisateurs → 201 + Location
RemplacerPUT /v1/utilisateurs/42
Modifier en partiePATCH /v1/utilisateurs/42
SupprimerDELETE /v1/utilisateurs/42 → 204

JSON (RFC 8259, STD 90, décembre 2017) est le format d'échange courant : objets, tableaux, chaînes, nombres, booléens et null ; les textes échangés entre systèmes doivent être encodés en UTF-8. Exemple de ressource :

JSON
{
  "id": 42,
  "nom": "demo",
  "groupes": ["lecture", "support"],
  "actif": true
}

Versionnement. Une API évolue ; casser les clients existants est coûteux. Choix courants : version dans le chemin (/v1/…), dans un en-tête, ou dans le type de contenu. Aucun n'est imposé par une RFC lue ici (non vérifié) ; l'important est de ne pas changer le sens d'une version publiée, d'ajouter plutôt que retirer des champs, et d'annoncer la fin de vie d'une version.

Pagination. Une liste ne se renvoie pas en entier. Deux approches :

  • par décalage : ?limite=50&decalage=100 (simple, mais lent et instable si les données changent) ;
  • par curseur : ?apres=<CURSEUR> (stable et plus efficace sur de gros volumes).

La réponse indique la page suivante dans le corps ou dans l'en-tête Link (RFC 8288, non relue : non vérifié).

Erreurs normalisées. La RFC 9457 (« Problem Details for HTTP APIs », 2023, remplace la RFC 7807) définit un format JSON de description d'erreur, type de média application/problem+json, avec les champs type, title, status, detail et instance :

JSON
{
  "type": "https://api.example.test/erreurs/quota-depasse",
  "title": "Quota dépassé",
  "status": 429,
  "detail": "Trop de requêtes, réessayer plus tard."
}

À retenir : le code d'état dit la catégorie, le corps d'erreur dit le détail lisible par une machine ; ne jamais y mettre de trace de pile ni de secret.

Description d'API : OpenAPI. La spécification OpenAPI décrit une API HTTP dans un fichier (YAML ou JSON) : chemins, méthodes, paramètres, schémas, sécurité. La page spec.openapis.org/oas/latest.html indiquait, le 18 octobre 2026, la version 3.2.1 publiée le 10 septembre 2026 (lue par résumé : non vérifié pour le détail). Le fichier sert de contrat, de documentation et de base à des tests ou à la génération de clients.

9. Authentification des appels d'API

Distinguer deux notions : l'authentification (qui es-tu ?) et l'autorisation (qu'as-tu le droit de faire ?).

MécanismePrincipePoints d'attention
Clé d'APIchaîne secrète longue envoyée en en-têteidentifie une application, pas un humain ; rotation ; portée réduite
Basic (RFC 7617)Authorization: Basic + utilisateur:mot de passe encodé en Base64Base64 n'est pas du chiffrement ; acceptable seulement sous TLS
Jeton Bearer (RFC 6750)Authorization: Bearer <JETON>quiconque détient le jeton s'en sert ; durée courte
OAuth 2.0 (RFC 6749)délégation d'accès par jeton émis par un serveur d'autorisationchoisir le bon flux (voir ci-dessous)
OpenID Connectcouche d'identité au-dessus d'OAuth 2.0jeton d'identité (ID Token) vérifié par l'application

Encadré secrets.

Attention : une clé d'API, un mot de passe ou un jeton ne doivent jamais apparaître dans une URL (elle est journalisée par les serveurs, proxys et navigateurs), dans un journal, dans un message d'erreur, dans une capture d'écran ni dans un dépôt Git. Les passer par l'en-tête Authorization, les stocker dans le Trousseau ou un coffre, les faire tourner et les révoquer en cas de doute. La RFC 6750 admet les paramètres de requête pour un jeton mais les déconseille pour cette raison : ne pas s'en servir.

OAuth 2.0 en principe. OAuth 2.0 est un cadre de délégation d'autorisation : une application (client) obtient d'un serveur d'autorisation un jeton d'accès, de portée (scope) et de durée limitées, qu'elle présente à l'API (serveur de ressources). La RFC 6749 (octobre 2012) définit quatre types d'octroi (code d'autorisation, implicite, mot de passe du propriétaire de la ressource, identifiants du client). La RFC 9700 (BCP 240, « Best Current Practice for OAuth 2.0 Security », 2025) met à jour ces recommandations : PKCE pour les clients publics, abandon de l'octroi implicite, interdiction de l'octroi par mot de passe, comparaison exacte des URI de redirection, jetons restreints à une audience. En pratique : privilégier le code d'autorisation avec PKCE pour une application avec utilisateur, et l'octroi identifiants du client pour un service qui agit en son nom propre.

OpenID Connect en principe. OpenID Connect Core 1.0 (avec l'erratum n° 2, 15 décembre 2023) ajoute à OAuth 2.0 la notion d'identité : le client reçoit un ID Token (un JWT) dont les champs obligatoires incluent iss (émetteur), sub (identifiant de l'utilisateur), aud (destinataire), exp (expiration) et iat (émission), plus nonce quand il a été demandé. Le client doit vérifier ces champs (et la signature). Ne pas confondre jeton d'identité (pour le client) et jeton d'accès (pour l'API).

Les JWT, leur validation précise et les mécanismes avancés (DPoP, mTLS, introspection) sont hors périmètre et non vérifiés ici ; voir aussi le cours « Annuaires et identités » pour SSO et SAML.

10. Limitation de débit

La limitation de débit (rate limiting) borne le nombre de requêtes qu'un client peut faire par période. Elle protège la disponibilité et limite les abus (essais de mots de passe, énumération, coût). Quand la limite est atteinte, le serveur répond 429 (RFC 6585), souvent avec Retry-After. Les en-têtes d'information du genre X-RateLimit-… sont des conventions de fournisseurs, non normalisées dans les sources lues : non vérifié.

Côté client, une bonne pratique est de réessayer avec un délai croissant (retrait exponentiel avec un peu d'aléa) et de ne jamais rejouer en boucle serrée. Côté serveur, appliquer la limite par clé, par adresse et par route sensible, au niveau du proxy ou de la passerelle d'API.

11. Observer un échange : curl et jq en lecture

curl envoie des requêtes ; -v montre la négociation, les en-têtes envoyés (>) et reçus (<). jq filtre du JSON. Options confirmées sur le manuel de curl 8.23.0 : -v, -i, -I, -s, -S, -H, -X, --json, -w, -o, --max-time, --fail-with-body, --resolve. Pour jq 1.8 : ., .cle, .[], select(…), et les options -r, -c, -e.

Préparation d'un service local jetable (dossier temporaire, boucle locale uniquement, 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.

Terminal
DEMO="$(mktemp -d)"cd "$DEMO"printf '{"id": 42, "nom": "demo", "groupes": ["lecture", "support"]}\n' > utilisateur.jsonpython3 -m http.server 8080 --bind 127.0.0.1
  • Contexte : Terminal macOS ; version de python3 inconnue (non vérifié : l'option --bind du module http.server n'a pas été relue sur la documentation de Python). Le service ne sert que des fichiers statiques : il imite GET et HEAD mais pas une vraie API (les autres méthodes reçoivent en général une erreur).
  • Droits : utilisateur normal ; aucun sudo.
  • Effet : crée un dossier temporaire et un fichier JSON, puis démarre un serveur sur 127.0.0.1:8080, tant que la commande tourne. Il écoute uniquement la boucle locale. Un autre terminal est nécessaire pour la suite.
  • Vérification : dans un second terminal, curl -s http://127.0.0.1:8080/utilisateur.json renvoie le JSON.
  • Retour arrière : arrêter le serveur avec Control-C, puis supprimer le dossier temporaire (cd ~ && rm -r "$DEMO" dans le terminal où DEMO est défini ; relire le chemin avant de valider).

Lectures, dans le second terminal :

Terminal
curl -v http://127.0.0.1:8080/utilisateur.jsoncurl -sI http://127.0.0.1:8080/utilisateur.jsoncurl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/absent.jsoncurl -s http://127.0.0.1:8080/utilisateur.json | jq '.groupes[]'curl -s http://127.0.0.1:8080/utilisateur.json | jq -r '.nom'
  • Contexte : Terminal ; curl 8.23.0 documenté, version installée non vérifiée ; jq à installer séparément si absent (installation non traitée ici).
  • Droits : utilisateur normal.
  • Effet : lecture seule, quelques requêtes vers la boucle locale. La première montre la connexion, les en-têtes envoyés et reçus ; la deuxième, seulement les en-têtes de réponse ; la troisième, le code d'état d'une ressource absente (404 attendu) ; les deux dernières extraient des champs JSON.
  • Vérification : repérer GET, Host, Accept, 200 OK, Content-Type, Content-Length ; obtenir 404 pour la ressource absente ; lire "lecture" et "support", puis demo.
  • Retour arrière : sans objet.

Pour viser le nom réservé example.test sans le résoudre (RFC 6761 réserve .test, non relue ici : non vérifié), --resolve force l'adresse :

Terminal
curl -v --resolve api.example.test:8080:127.0.0.1 http://api.example.test:8080/utilisateur.json
  • Contexte : Terminal ; le service jetable est démarré.
  • Droits : utilisateur normal.
  • Effet : lecture seule, une requête vers la boucle locale avec l'en-tête Host: api.example.test:8080 ; aucune résolution DNS réelle.
  • Vérification : la ligne > Host: api.example.test:8080 apparaît.
  • Retour arrière : sans objet.

Astuce : curl -w avec %{http_code} donne le code d'état seul, pratique dans un script ; --fail-with-body fait échouer curl sur 4xx/5xx tout en gardant le corps d'erreur.

Attention : ne jamais lancer ces commandes contre une API réelle avec un vrai jeton. Si un exercice demandait un en-tête d'autorisation, utiliser un jeton factice <JETON> contre le service jetable, sans le laisser dans l'historique du shell ni dans un fichier.

12. CORS

Le navigateur applique la politique de même origine : un script chargé depuis une origine (schéma, domaine, port) ne peut pas lire librement les réponses d'une autre origine. CORS (Cross-Origin Resource Sharing) est le mécanisme, fondé sur des en-têtes HTTP, par lequel un serveur autorise des origines à le faire (MDN, page modifiée le 4 septembre 2026).

  • Requête simple : GET, HEAD ou POST avec en-têtes et types de contenu « sûrs » : pas de contrôle préalable.
  • Requête avec contrôle préalable (preflight) : le navigateur envoie d'abord OPTIONS avec Origin, Access-Control-Request-Method et Access-Control-Request-Headers ; le serveur répond avec Access-Control-Allow-Origin, -Methods, -Headers et éventuellement -Max-Age.
  • Avec identifiants (cookies, autorisation), Access-Control-Allow-Origin ne peut pas valoir * : il faut nommer l'origine, et Access-Control-Allow-Credentials: true.

À retenir : CORS est appliqué par le navigateur pour protéger l'utilisateur ; ce n'est pas un contrôle d'accès de l'API. Un curl ignore CORS, donc l'API doit toujours authentifier et autoriser côté serveur. Une règle Access-Control-Allow-Origin: * sur une API avec données privées est une erreur de configuration.

13. Sécurité des API : l'OWASP API Security Top 10 (2023)

L'OWASP API Security Top 10 — 2023 (api-security.owasp.org, ancienne adresse owasp.org/API-Security redirigée) liste dix risques. Vue d'ensemble, avec un réflexe de défense chacun :

RisqueDéfense en une phrase
API1 Broken Object Level Authorizationvérifier, à chaque accès à un objet, que l'appelant y a droit (et pas seulement qu'il est connecté)
API2 Broken Authenticationjetons à durée courte, limitation d'essais, MFA, pas de secret en URL
API3 Broken Object Property Level Authorizationn'exposer et n'accepter que les champs autorisés (pas d'affectation de masse)
API4 Unrestricted Resource Consumptionlimite de débit, taille de corps, pagination bornée, délais
API5 Broken Function Level Authorizationséparer et contrôler les routes d'administration
API6 Unrestricted Access to Sensitive Business Flowslimiter l'automatisation des flux sensibles (achat, inscription)
API7 Server Side Request Forgeryvalider les URL que le serveur va appeler, liste d'autorisation
API8 Security Misconfigurationdurcissement, CORS strict, pas d'erreurs détaillées, en-têtes de sécurité
API9 Improper Inventory Managementinventaire des API, versions et environnements ; retirer l'ancien
API10 Unsafe Consumption of APIstraiter les réponses d'API tierces comme non fiables (validation)

Le détail de chaque risque, les exemples d'attaque et les mesures complètes sont sur le site de l'OWASP : seule la liste des intitulés a été lue pour ce cours ; les « défenses » ci-dessus sont des résumés de principe, à relire sur les pages de chaque risque avant validation.

Précaution : ce cours reste défensif. Les tests de sécurité ne se font que sur ses propres services et avec autorisation.

Exercices et vérifications de fin de cours

Tous se font sur papier ou contre le service jetable du chapitre 11 (127.0.0.1), jamais contre une API réelle.

  1. Lecture. Démarrer le service jetable, lancer curl -v sur utilisateur.json, entourer la ligne de requête, deux en-têtes envoyés, le code d'état et deux en-têtes reçus.
  2. Méthodes. Pour chaque opération (lister, créer, remplacer, supprimer), donner méthode, chemin REST, code de succès attendu, et dire si on peut la rejouer sans risque.
  3. Codes. Associer un code d'état à ces cas : ressource absente, jeton expiré, droits insuffisants, trop de requêtes, serveur en panne.
  4. Cache. Pour une liste personnelle d'utilisateur, écrire l'en-tête Cache-Control adapté et expliquer pourquoi.
  5. JSON. Avec jq, extraire le premier groupe, puis tous les groupes sous forme de lignes de texte (-r).
  6. Erreur. Écrire une réponse application/problem+json pour un 404.
  7. Authentification. Dire pourquoi un jeton ne doit pas être placé dans l'URL, et citer deux autres endroits où il ne doit pas apparaître.
  8. CORS. Expliquer pourquoi curl n'est pas bloqué par CORS alors qu'un navigateur l'est.
  9. OWASP. Pour GET /v1/factures/123, décrire un scénario API1 et la vérification qui l'empêche.
  10. Limitation. Décrire la réponse d'un serveur à un client trop rapide et la stratégie de reprise du client.

Critères de réussite

  • Lire une requête et une réponse et dire ce qui s'est passé.
  • Choisir méthode, code d'état et corps d'erreur cohérents.
  • Ne jamais exposer un secret (URL, journal, capture, dépôt).
  • Ne tester que sur un service local jetable ou example.test.
  • Dire ce qui n'est pas vérifié (voir plus bas).

Sources officielles

Toutes consultées le 18 octobre 2026.

SourceVersion / étatUsage
RFC 9110 (s’ouvre dans un nouvel onglet)STD 97, 2022 (juin 2022 d'après le sommaire d'ensemble)sémantique HTTP
RFC 9111 (s’ouvre dans un nouvel onglet)STD 98, juin 2022cache
RFC 9112 (s’ouvre dans un nouvel onglet)référence seule (non relue)HTTP/1.1
RFC 9113 (s’ouvre dans un nouvel onglet)Proposed Standard, 2022HTTP/2
RFC 9114 (s’ouvre dans un nouvel onglet)Proposed Standard, 2022HTTP/3, QUIC
RFC 6265 (s’ouvre dans un nouvel onglet)Proposed Standard, avril 2011cookies
RFC 6585 (s’ouvre dans un nouvel onglet)avril 2012429 et autres codes
RFC 8259 (s’ouvre dans un nouvel onglet)STD 90, décembre 2017JSON
RFC 9457 (s’ouvre dans un nouvel onglet)Proposed Standard, 2023erreurs d'API
RFC 7617 (s’ouvre dans un nouvel onglet)Proposed Standard, septembre 2015authentification Basic
RFC 6749 (s’ouvre dans un nouvel onglet)octobre 2012 ; mise à jour par RFC 8252, 8996, 9700OAuth 2.0
RFC 6750 (s’ouvre dans un nouvel onglet)octobre 2012 ; mise à jour par RFC 8996, 9700jetons Bearer
RFC 9700 (s’ouvre dans un nouvel onglet)BCP 240, 2025sécurité d'OAuth 2.0
OAuth 2.0 (oauth.net) (s’ouvre dans un nouvel onglet)page lue le 18 octobre 2026 ; OAuth 2.1 en coursvue d'ensemble
OpenID Connect Core 1.0 (s’ouvre dans un nouvel onglet)1.0 avec erratum n° 2, 15 décembre 2023identité, ID Token
OpenAPI Specification (s’ouvre dans un nouvel onglet)3.2.1, 10 septembre 2026 (d'après la page)description d'API
MDN : CORS (s’ouvre dans un nouvel onglet)page modifiée le 4 septembre 2026CORS
OWASP API Security Top 10 (s’ouvre dans un nouvel onglet)édition 2023risques d'API
curl (s’ouvre dans un nouvel onglet)curl 8.23.0curl
jq (s’ouvre dans un nouvel onglet)jq 1.8jq

Points non vérifiés

  • Versions de curl, jq, python3 et macOS de Stéphane ; options de python3 -m http.server (non relues sur la documentation de Python).
  • Le contenu détaillé des RFC 9110 à 9114 : seuls titres, états et résumés ont été lus ; tableau « sûr/idempotent », classes et usages des codes (dont 422) donnés d'après les connaissances générales, à relire dans la RFC 9110.
  • PATCH (RFC 5789), Link (RFC 8288), .test réservé (RFC 6761) : non lus.
  • La RFC 6265 peut avoir été mise à jour ou remplacée depuis 2011.
  • REST (thèse d'origine), conventions de versionnement, pagination, clés d'idempotence, en-têtes X-RateLimit-… : conventions courantes, pas de source normative lue.
  • OpenAPI 3.2.1 et tous les résumés de pages web : lus par un outil de résumé, à reconfronter à la page officielle.
  • JWT (RFC 7519), PKCE (RFC 7636), DPoP, mTLS, introspection : non lus ; OAuth 2.1 : brouillon en cours d'après oauth.net.
  • Détail de chaque risque de l'OWASP API Top 10 : seuls les intitulés ont été lus ; les défenses citées sont des résumés de principe.