web-dev-qa-db-ja.com

ドメイン全体にCORSプリフライトキャッシュを適用する方法

私はREST CORSを利用するアプリケーションを構築しています。すべてのREST呼び出しは異なり、プリフライトOPTIONS呼び出しを取得する際にかなりのオーバーヘッドがあることがわかりました。 。同じドメインへの後続の呼び出しがキャッシュされた応答を使用するように、プリフライトOPTIONS結果をキャッシュして適用する方法はありますか?

73
MindWire

プリフライトは、ドメイン全体ではなく、リクエストにのみ適用できます。私はメーリングリストで同じ質問を持ち出しましたが、セキュリティ上の懸念がありました。スレッド全体を次に示します。 http://lists.w3.org/Archives/Public/public-webapps/2012AprJun/0228.html

プリフライトリクエストの数を制限する場合は、考慮すべき点がいくつかあります。最初に、WebKit/Blinkベースのブラウザでは、プリフライトの最大キャッシュが10分に設定されていることに注意してください。

https://github.com/WebKit/webkit/blob/master/Source/WebCore/loader/CrossOriginPreflightResultCache.cpphttps://chromium.googlesource.com/chromium/blink/ +/master/Source/core/loader/CrossOriginPreflightResultCache.cpp

(これが他のブラウザーに当てはまるかどうかはわかりません)。したがって、常にAccess-Control-Max-Ageヘッダーを設定する必要がありますが、最大値は10分です。

次に、PUT/DELETEリクエストのプリフライトを回避することは不可能であることに注意してください。したがって、APIの更新/削除には、10分ごとに少なくとも1回のプリフライトが必要です。

GET/POSTでは、カスタムヘッダーはプリフライトをトリガーするため、可能な限り避けてください。 APIがJSONを返す場合、「application/json」のContent-Typeもプリフライトをトリガーすることに注意してください。

APIがどれほど「RESTful」であるかを曲げる意思がある場合、試してみることができるものがいくつかあります。 1つは、「text/plain」のようなプリフライトを必要としないContent-Typeを使用することです。カスタムヘッダーは常にプリフライトをトリガーするため、カスタムヘッダーがある場合はクエリパラメーターに移動できます。極端な場合、すべての要求が単一のエンドポイントに対して行われるJSON-RPCのようなプロトコルを使用できます。

正直なところ、ブラウザのプリフライトキャッシュの制限は10分であり、RESTのリソースURLにより、プリフライトキャッシュはほとんど役に立ちません。長時間実行中のアプリでプリフライトを制限するためにできることはほとんどありません。 CORS仕様の作者が将来これに対処しようとすることを期待しています。

97
monsur

XDomainを使用してみてください

angularまたはjQueryを使用する場合、セットアップは非常に簡単でした。アプリサーバーで、以下のリンクのヘルプに記載されているようにproxy.htmlを追加します。jsを参照するタグを追加します「クライアント」およびビオラ上のファイル、プリフライトは不要これはiframeにラップされ、corsチェックの必要性を回避します。

https://github.com/jpillora/xdomain

4
Chewy