web-dev-qa-db-ja.com

CORS Access-Control-Max-Ageは無視されます

私はWebAppと彼のAPIを異なるドメインでホストしており、CORSを使用して同じOriginポリシーを回避できるようにしています。ここまでは順調ですね。これは機能します。

セッションごとに1回だけCORSプリフライトを送信するには、Access-Control-Max-Ageを20日に設定しましたが、これは機能していません(Chromeでテスト済み): https://db.tt/vfIW3fD2

何を変更する必要がありますか?

25
Roland Schütz

Chrome Dev Toolsを使用している場合は、[DevToolsが開いている間はキャッシュを無効にする]があることを確認してください)チェックされていない。「Access-Control 「Max-Age」は、そのオプションがチェックされたことを理解するためだけに尊重されているわけではありません。

73
Nej Kutcharian

Chrome/Blinkのプリフライト時間の最大値は10分(600秒)です。これを定義するソースコード内の場所は次のとおりです。

https://chromium.googlesource.com/chromium/blink/+/master/Source/core/loader/CrossOriginPreflightResultCache.cpp#4

10分を超えるプリフライト時間は無視され、代わりに10分が使用されます。

ブラウザによって、最大有効期間ポリシーが異なる場合があります。 Safari/WebKitは最大5分間キャッシュし、Firefoxは最大24時間キャッシュします。 Chromeソースコードは、「安全なネットワークに切り替えた後、汚染されたキャッシュを使用するリスクを最小限に抑えるため」に最大値が存在することを示しています。

コードがmax-ageヘッダーを解析できない場合(またはサーバーがmax-ageヘッダーを指定していない場合)、ブラウザーのデフォルトは5秒です。

23
monsur

プリフライトキャッシュにはあまり依存しません。

スペックから:

ユーザーエージェントは、max-ageフィールドで指定された時間が経過する前にキャッシュエントリをクリアする場合があります。

また、次の点に注意してください(CORS仕様から):

プリフライト結果キャッシュにキャッシュエントリが存在する場合、次の条件を満たすキャッシュマッチがあります。

Originフィールド値は、ソースOriginの大文字と小文字を区別した一致です。

Urlフィールド値は、リクエストURLの大文字と小文字を区別した一致です。

資格情報フィールドの値がtrueで資格情報の除外フラグが設定されていないか、falseで資格情報の除外フラグが設定されています。

スクリーンショットは、上記のいずれかに該当するかどうかを判断する方法を提供していません。

10
Ray Nicholus