Как я должен использовать Access-Control-Allow-Headers?
Я создаю бэкенд на Django, который принимает запросы от других доменов, поэтому я использую django-cors-headers для обработки CORS. Однако я столкнулся с проблемой, когда один из внешних доменов обращается к моему бэкенду, потому что их код запроса a) устанавливает withCredentials и b) имеет некоторые дополнительные заголовки в запросе.
Оба этих пункта не должны иметь значения для того, чтобы они могли попасть в мой бэкенд, но я получаю ожидаемые ошибки Access-Control-Allow-Credentials' header in the response is '' which must be 'true'
и Request header field [field_name] is not allowed by Access-Control-Allow-Headers in preflight response.
Некоторые другие сообщения на stackoverflow указали мне на Access-Control-Allow-Credentials = 'true'
для первого и Access-Control-Allow-Headers = '*'
для второго, но я не смог найти много информации о том, какова лучшая практика.
Что я пытаюсь выяснить, так это
- Безопасно ли устанавливать оба этих флага? Есть и другие заголовки, включенные в запрос, которые обрабатывают аутентификацию с помощью токенов, поэтому я не уверен, что здесь есть большой риск для безопасности .
- Должен ли я вместо этого сказать своим пользователям, что мой бэкенд запрещает учетные данные и другие заголовки (потому что они не нужны для работы кода)?
- В документации по Access-Control-Allow-Headers указано
‘The value “*” only counts as a special wildcard value for requests without credentials (requests without HTTP cookies or HTTP authentication information). In requests with credentials, it is treated as the literal header name “*” without special semantics. Note that the Authorization header can’t be wildcarded and always needs to be listed explicitly.’
Правильно ли я понимаю, что я не смогу установить иAccess-Control-Allow-Credentials = true
, иAccess-Control-Allow-Headers = '*'
?
- См. мой ответ на ваш 3-й пункт.
- Да. Ваш сервер, ваши правила.
- Устанавливать и
Access-Control-Allow-Credentials: true
иAccess-Control-Allow-Headers: *
никогда не полезно:
- Из соображений безопасности браузеры, поддерживающие символ подстановки в
Access-Control-Allow-Headers
обрабатывают значение*
буквально в случае авторизованных запросов . - Браузеры, не поддерживающие подстановочный знак в
Access-Control-Allow-Headers
, всегда трактуют значение*
буквально.