web-dev-qa-db-ja.com

CORSプリフライトリクエストの適切なステータスコードとは何ですか?

よく書かれたHTTPサーバーは、CORSプリフライト(OPTIONS)リクエストを受け取ったときにどのステータスコードを返す必要がありますか?

200204 または、他の何か?

Originが許可されている(および対応するヘッダーが設定される)または許可されていない(およびCORSヘッダーが設定されないか、Originと一致しない)場合、ステータスコードは異なる必要がありますか?

25
Andrej

その要点は、200を使用するだけです。

もう少し一般的に:CORSプリフライトOPTIONSリクエストに対して、他のOPTIONSリクエストに対して返送するのと同じステータスコードを返送する必要があります。関連する仕様では、それ以上の要件や推奨事項はありません。

関連する仕様: https://fetch.spec.whatwg.org/ のFetch仕様は、CORSプロトコルの要件が定義されている場所であり、ステータスは範囲内であれば何でもかまいません200-299

これは、 CORS-プリフライトフェッチアルゴリズム にあります。これには 「OKステータス」にできるというステップ

CORSがrequestresponseが成功を返し、responseをチェックする場合ステータスは
an ok status 、次のサブステップを実行します:…

そして、「OKステータス」が何であるかについては、仕様では次のように書かれています。

ok statusは、200から299の範囲の包括的ステータスです。

ただし、Fetch仕様では、200-299内の特定のステータスは推奨されていません。

ここで関連する他の仕様は、HTTP 1.1仕様です。これには、すべてのHTTP応答ステータスコードのセマンティクスを定義するセクションがあり、その中に、 Successful 2xx コード。

そしてそのセクション内には 200 OK)の特定のセクション があり、これはこう言っています:

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;

したがって、CORSプリフライトオプションへの応答は次のとおりです。

それが 200 OK がHTTP仕様で定義されているため、すぐに停止できます。

しかし、 そのセクションの残りの2xxコード を読み通すと、OPTIONS応答に対して意味をなさないコードのセマンティクスを確認できます。ただし、- 204 No Content

204 No Contentに関する限り、OPTIONS応答にそれを使用してもwrongはありませんが、私が見る限りでは、実際にはありません。任意のポイント。それは:

  • 他のいくつかのメソッドとは異なり、HTTP仕様はOPTIONSペイロードの使用を定義していません
  • したがって、実際には、クライアントはOPTIONSのためにペイロード(コンテンツ)が戻ってくることを期待していません(そして戻ってきたペイロードでは何もしません)

…私の知る限りでは、OPTIONS応答で特定の204ステータスコードを使用して、ペイロードがないことをクライアントに明示的に伝えることには実用的な目的はありません。

間違っている可能性がありますが、欠けているニュアンスがあります。しかし、私はそうは思いません。

Originが許可されている(および対応するヘッダーが設定される)または許可されていない(およびCORSヘッダーが設定されないか、Originと一致しない)場合、ステータスコードは異なる必要がありますか?

いいえ、違いはないと思います。とにかく使用できる200または204以外の標準定義のコードはわかりません。異なる場合は使用します。考えてみてください。これら2つのケースのステータスコードに違いがあるため、既存のクライアントコードはどのように異なるのでしょうか。

その質問に対する答えが「Nothing」である場合、私が見る限り、それを変更する意味はありません。


上記すべてを考えると、最終行は次のとおりです。CORSプリフライトOPTIONS応答に200 OKを送信するだけです。 200 OK以外のコードを送信する必要はありません。

29
sideshowbarker