Що саме робить заголовок Access-Control-Allow-Credentials?


167

Я намагаюся зрозуміти, як використовувати CORS, і я збентежений, що Access-Control-Allow-Credentialsробить заголовок.

У документації йдеться

Вказує, чи можна відповідати на запит, коли прапор облікових даних є істинним.

Але я не розумію, що означає "відповідь" відповіді.

Чи може хто-небудь пояснити, що насправді робить цей заголовок, встановлений на істину (у поєднанні з прапором облікових даних, встановленим істинним)?


xhr.withCredential doc на стороні клієнта developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…
Weishi Zeng

Відповіді:


265

За замовчуванням CORS не включає файли cookie на запити перехресного походження. Це відрізняється від інших методів перехресного походження, таких як JSON-P. JSON-P завжди включає файли cookie із запитом, і така поведінка може призвести до класу вразливостей, який називається підробкою запиту між веб-сайтами або CSRF.

Щоб знизити ймовірність уразливості CSRF в CORS, CORS вимагає і сервера, і клієнта підтвердити, що нормально включати кукі в запити. Це робить cookie активним рішенням, а не тим, що відбувається пасивно без будь-якого контролю.

Клієнтський код повинен встановити withCredentialsвласності на XMLHttpRequestдля trueтого , щоб дати дозвіл.

Однак одного цього заголовка недостатньо. Сервер повинен відповідати Access-Control-Allow-Credentialsзаголовком. Відповідаючи цим заголовком, trueозначає, що сервер дозволяє включати файли cookie (або інші облікові дані користувачів) на запити перехресного походження.

Вам також потрібно переконатися, що ваш веб-переглядач не блокує сторонні файли cookie, якщо ви хочете, щоб запити, що перехрещуються, поширювались.

Зауважте, що незалежно від того, ви робите запити з однаковим або перехресним походженням, вам потрібно захистити свій сайт від CSRF (особливо якщо ваш запит включає файли cookie).


1
Я уточнив відповідь, щоб висвітлити ваше запитання. В основному JSON-P робить це неправильно і є менш захищеним.
монсур

28
Просто хочу додати до цього трохи прокоментувати значення "викритого". Спеціалізація не вимагає попереднього польоту (додатковий зворотній переїзд, щоб перевірити, чи дозволить сервер облікові дані) для GET-запитів. Замість попереднього польоту браузер просто завжди буде робити запит, надсилаючи файли cookie, якщо withCredentialsце встановлено, але тоді, коли він отримує відповідь, якщо встановлено функцію withCredentials, він буде доставляти / викривати результат на виклик javascript, якщо відповідь має доступ -Control-Allow-Credentials набір заголовків. Якщо заголовок відсутній, він не викриває відповідь, фактично занурюючи її.
Heavi5ide

4
@ Heavi5ide, Так, навіть якщо браузер не виставляє відповіді на клієнтський код, все ще надсилається cookie-запит (для запитів, які не є попередньо відміченими). Отже, КСВР все-таки буде зроблено.
Pacerier

7
Оскільки це така популярна відповідь, я збираюся додати ще одну важливу інформацію: окрім правильного налаштування запиту та заголовків відповідей, вам також потрібно переконатися, що ваш браузер не блокує сторонні файли cookie, якщо ви хочуть, щоб запити, підтверджені підтвердженням перехресного походження, працювали. Див stackoverflow.com/a/16634887/2970321
alexw

5
Це настільки чітка відповідь, що кожен, хто читає його вперше, може зрозуміти і виправити свій код, який, здається, не працює з файлами cookie. Дякую!
асг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.