Quel code d'état un serveur HTTP bien écrit doit-il renvoyer lorsqu'il reçoit une demande de contrôle en amont CORS (OPTIONS
)?
200
, 204
ou autre chose?
Le code d'état doit-il être différent si l'origine est autorisée (et les en-têtes correspondants seront définis) ou non (et les en-têtes CORS ne seront pas définis ou ne correspondront pas à l'origine)?
L'essentiel est, utilisez simplement 200
.
Un peu plus généralement: vous devez simplement renvoyer le même code d’état pour la demande de contrôle en amont OPTIONS
de CORS que vous devez renvoyer pour toute autre demande OPTIONS
. Les spécifications pertinentes n'exigent ni ne recommandent rien de plus que cela.
En ce qui concerne les spécifications pertinentes: La spécification Fetch à https://fetch.spec.whatwg.org/ est l'endroit où les exigences pour le protocole CORS sont définies, et il indique que l'état peut être n'importe quoi dans la plage 200
-299
.
Cela provient de algorithme de récupération CORS-preflight , qui a ne étape indiquant qu'il peut s'agir de n'importe quel "état ok" :
Si un CORS vérifie demande et réponse renvoie le succès et réponse le statut de
an état ok , exécutez ces sous-étapes:…
Et en ce qui concerne le "statut ok", la spécification dit ceci:
Un état ok est un état de la plage
200
à299
, inclus.
Au-delà de cela, la spécification Fetch ne recommande aucun état particulier dans 200
-299
.
L'autre spécification pertinente ici est la spécification HTTP 1.1, qui a une section définissant la sémantique de tous les codes d'état de réponse HTTP, et à l'intérieur de cela, ne section spécifique qui définit Successful 2xx = codes.
Et dans cette section, il y a ne section spécifique pour 200 OK , qui dit ceci:
The 200 (OK) status code indicates that the request has succeeded.
The payload sent in a 200 response depends on the request method.
For the methods defined by this specification, the intended meaning
of the payload can be summarized as:
…
OPTIONS a representation of the communications options;
Donc, une réponse à une OPTIONS de contrôle en amont CORS doit simplement être:
Access-Control-Allow-Methods
et Access-Control-Allow-Headers
en-têtes de réponse)C'est ce que 200 OK
est défini par la spécification HTTP, vous pouvez donc vous arrêter là.
Mais si vous lisez le reste du 2xx
codes dans cette section , vous pouvez confirmer que la sémantique d'aucun d'entre eux n'a de sens pour une réponse OPTIONS
— sauf pour 204 No Content
.
Maintenant jusqu'à 204 No Content
va, il n'y a rien mal en l'utilisant pour les réponses OPTIONS
- mais pour autant que je puisse voir, il n'y a pas vraiment de point. C'est parce que:
OPTIONS
OPTIONS
(et ne ferait rien avec une charge utile qui est revenue)… Pour autant que je sache, il n'y a aucun intérêt pratique à utiliser un 204
code d'état dans une réponse OPTIONS
pour indiquer explicitement aux clients qu'il n'y a pas de charge utile.
Il est possible que je me trompe, cependant, et il y a une nuance qui me manque. Mais je ne pense pas.
Le code d'état doit-il être différent si l'origine est autorisée (et les en-têtes correspondants seront définis) ou non (et les en-têtes CORS ne seront pas définis ou ne correspondront pas à l'origine)?
Non, je ne pense pas que ça devrait être différent. Je ne sais pas quel code défini en standard autre que 200
ou 204
vous pouvez utiliser de toute façon, mais indépendamment de cela, les spécifications n'exigent pas qu'il soit différent et ne définissent aucune utilisation différente si c'est le cas. Et pensez-y: qu'est-ce qu'un code client existant va faire différemment en raison d'une différence dans les codes d'état pour ces deux cas?
Si la réponse à cette question est, "Rien", pour autant que je puisse voir, il est inutile de le rendre différent.
Compte tenu de tout ce qui précède, la conclusion est la suivante: envoyez simplement 200 OK
pour CORS preflight OPTIONS
réponses. Envoi de tout code autre que simplement 200 OK
n'est ni nécessaire ni utile.