Access-Control-Allow-Credentialsヘッダーは正確には何をしますか?


167

CORSの使用方法を理解しようとしてAccess-Control-Allow-Credentialsいますが、ヘッダーの機能について混乱しています。

ドキュメントは言う

資格情報フラグがtrueの場合に、要求への応答を公開できるかどうかを示します。

しかし、「公開されている」という応答の意味がわかりません。

このヘッダーがtrueに設定されていること(クレデンシャルフラグがtrueに設定されていることと組み合わせて)が実際に何をするかを誰かが説明できますか?


クライアント側のxhr.withCredential DOC developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/...
Weishi曽

回答:


264

デフォルトでは、CORSはクロスオリジンリクエストにCookieを含めません。これは、JSON-Pなどの他のクロスオリジン技術とは異なります。JSON-Pには常にリクエストにCookieが含まれており、この動作により、クロスサイトリクエストフォージェリ(CSRF)と呼ばれる脆弱性のクラスが発生する可能性があります。

CORSでのCSRFの脆弱性の可能性を減らすために、CORSはサーバーとクライアントの両方に、要求にCookieを含めてもよいことを認めることを要求します。これを行うと、何も制御せずに受動的に発生するものではなく、Cookieが能動的な決定になります。

クライアントコードは、しなければならない設定withCredentialsのプロパティをXMLHttpRequestするtrue許可を与えるために。

ただし、このヘッダーだけでは十分ではありません。サーバーはヘッダーで応答する必要がありますAccess-Control-Allow-Credentials。このヘッダーで応答trueすると、サーバーはCookie(または他のユーザー資格情報)をクロスオリジンリクエストに含めることができるようになります。

また、クロスオリジンの認証済みリクエストを機能させたい場合は、ブラウザがサードパーティのCookieをブロックしていないことを確認する必要があります

同一オリジンまたはクロスオリジンのどちらのリクエストを作成する場合でも、サイトをCSRFから保護する必要があることに注意してください(特にリクエストにCookieが含まれている場合)。


1
私はあなたの質問をカバーするために答えを明確にしました。基本的にJSON-Pはそれを間違っており、安全性が低くなります。
monsur 2014

28
「露出した」の意味についてコメントするためにこれに少し追加したいだけです。仕様では、GETリクエストのプリフライト(サーバーが資格情報を許可するかどうかを確認するための追加の往復)は必要ありません。プリフライトの代わりに、ブラウザーは常に要求を行い、withCredentials設定されている場合はCookieを送信しますが、withCredentialsが設定されている場合、応答を受信すると、応答にアクセス権がある場合にのみ、結果を呼び出し側のJavaScriptに配信/公開します-Control-Allow-Credentialsヘッダーセット。ヘッダーがない場合、応答は公開されず、効果的にブラックホール化されます。
heavi5ide 2015年

4
@ heavi5ide、ええ、ブラウザーがクライアントコードへの応答を公開していなくても、cookie付きのrequestはまだ送信されていました(プリフライトされていない要求の場合)。したがって、CSRFは引き続き実行されます。
Pacerier

7
これは非常に人気のある回答であるため、もう1つ重要な情報を追加します。要求ヘッダーと応答ヘッダーを正しく構成することに加えて、ブラウザーがサードパーティのCookieをブロックしていないことを確認する必要があります。クロスオリジンの認証済みリクエストを機能させたい。stackoverflow.com/a/16634887/2970321を
alexw '18

5
これは非常に明確な答えであるため、初めてそれを読んだ人なら誰でも、Cookieでうまく機能していないように見えるコードを理解して修正できます。ありがとう!
asgs '06 / 06/21
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.