OPTIONS
Utilisation
Une requête OPTIONS récupère les méthodes autorisées et les capacités d’une ressource cible sans effectuer d’action sur cette ressource. Le serveur répond par un en-tête Allow énumérant les méthodes prises en charge.
Lorsqu’un astérisque (*) sert de cible à la requête, celle-ci s’applique au serveur dans son ensemble plutôt qu’à une ressource particulière.
OPTIONS * HTTP/1.1
Host: api.example.re
Contrôle préalable CORS
L’usage le plus répandu d’OPTIONS en pratique est la requête de contrôle préalable CORS. Avant d’émettre une requête multi-origine employant une méthode hors de l’ensemble autorisé par CORS, des en-têtes personnalisés ou un Content-Type hors de l’ensemble autorisé (application/x-www-form-urlencoded, multipart/form-data, text/plain), le navigateur envoie automatiquement une requête OPTIONS au serveur cible. Le contrôle préalable vérifie si le serveur autorise la requête réelle.
La requête de contrôle préalable inclut Origin, Access-Control-Request-Method et, le cas échéant, Access-Control-Request-Headers. Le serveur répond par Access-Control-Allow-Origin, Access-Control-Allow-Methods et Access-Control-Allow-Headers pour signifier son approbation.
Capacités d’une ressource
Un client interroge les méthodes autorisées pour une ressource précise. Le serveur répond par 204 No Content assorti d’un en-tête Allow.
Requête
OPTIONS /articles HTTP/1.1
Host: api.example.re
Réponse
HTTP/1.1 204 No Content
Allow: OPTIONS, GET, HEAD, POST, DELETE
Interrogation à l’échelle du serveur
Utiliser * comme cible révèle les méthodes que le serveur prend en charge de manière générale, indépendamment de toute ressource particulière.
Requête
OPTIONS * HTTP/1.1
Host: api.example.re
Réponse
HTTP/1.1 204 No Content
Allow: OPTIONS, GET, HEAD
Contrôle préalable CORS
Un navigateur prépare une requête PUT multi-origine comportant un en-tête personnalisé X-Request-ID. Avant d’envoyer la requête réelle, le navigateur émet une requête OPTIONS de contrôle préalable afin de confirmer que le serveur autorise cette méthode et cet en-tête depuis l’origine demandeuse.
Requête de contrôle préalable
OPTIONS /api/data HTTP/1.1
Host: api.example.re
Origin: https://example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Request-ID
Réponse de contrôle préalable
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, PUT, DELETE
Access-Control-Allow-Headers: X-Request-ID
Access-Control-Max-Age: 86400
La valeur d’Access-Control-Max-Age indique au navigateur de mettre en cache le résultat du contrôle préalable pendant 86 400 secondes (une journée), ce qui évite de répéter les contrôles préalables pour le même point de terminaison.
Sécurité
Les réponses OPTIONS comportent un en-tête Allow qui énumère chaque méthode prise en charge par la ressource. Il s’agit d’une divulgation d’information mineure, et les scanners de sécurité signalent souvent un point de terminaison OPTIONS actif comme une constatation. Désactiver complètement OPTIONS n’est pas une solution viable, car les requêtes de contrôle préalable CORS ont besoin d’OPTIONS pour fonctionner.
L’approche recommandée consiste à restreindre l’en-tête Allow aux seules méthodes dont chaque point de terminaison a besoin. Une ressource qui accepte GET et POST ne doit pas annoncer DELETE ou PUT dans sa liste Allow.
Certains frameworks prennent en charge un en-tête X-HTTP-Method-Override permettant de faire transiter PUT, PATCH ou DELETE à travers une requête POST. Ce mécanisme contourne les contrôles d’accès fondés sur la méthode et constitue un risque de sécurité si la fonctionnalité n’est pas explicitement activée et auditée.
Pour éviter les contrôles préalables superflus, maintenez les requêtes multi-origines dans les critères des requêtes « simples » : GET, HEAD, ou POST avec uniquement des en-têtes et des types de contenu figurant sur les listes d’autorisation. L’emploi de Content-Type: application/json déclenche toujours un contrôle préalable. Access-Control-Max-Age met en cache les résultats des contrôles préalables afin de réduire les allers-retours OPTIONS répétés.