Краткий ответ: если вы действительно хотите, чтобы ответ OPTIONS был полезен для включения CORS сервера, вам не следует возвращать 403 только потому, что пользователь не вошел в систему.
Подробности:
Сервер всегда может вернуть 403
для запроса OPTIONS
. Протокол CORS не требует, чтобы ваш сервер возвращал 2xx
успешный ответ на OPTIONS
запрос. Но если ваш сервер не возвращает 2xx
для OPTIONS
запросов к определенному URL-адресу, предварительные OPTIONS
запросы CORS к этому URL не будут выполнены. Так что, если вы на самом деле хотите, чтобы это произошло, то ответ 403
— это нормально, так же как и ответ 405
или 501
или любой другой код ответа, который может иметь значение, подходящее для вашего конкретного случая.
Но важно помнить, что протокол CORS требует, чтобы браузеры никогда не отправляли учетные данные для аутентификации в составе запроса CORS preflight OPTIONS
. Таким образом, если ваш сервер настроен на требование аутентификации, чтобы OPTIONS
запросов давали 2xx
успешных ответов, то все предварительные проверки CORS, поступающие из браузеров, будут завершаться ошибкой в 100% случаев. Другими словами, вы гарантируете, что все запросы, которые поступают на сервер из внешнего кода JavaScript, работающего в браузере, и которые добавляют настраиваемые заголовки ответа (например, заголовки Content-Type
или Authorization
), не будут выполняться, и поэтому будут запускаться предварительные проверки.
Я не знаю какой-либо конкретной дыры в безопасности, которая может возникнуть, если отвечать 2xx
на неаутентифицированные OPTIONS
запросы (от непроверенных пользователей). Это не позволяет пользователям получать с вашего сервера какую-либо информацию, кроме той, которую вы намеренно решили поместить в заголовки ответа, которые вы отправляете в ответ на запрос OPTIONS
. И, конечно же, это не мешает вам запрашивать аутентификацию для GET
или POST
или любых других методов. Но с точки зрения протокола CORS, это единственный способ для вашего сервера указать, какие методы и заголовки запросов он разрешает в запросах от внешнего JavaScript.
Также обратите внимание: текущие активно поддерживаемые требования для CORS определены в спецификации Fetch https://fetch.spec.whatwg.org. Спецификация https://w3.org/TR/cors устарела, больше не поддерживается и не должна ни для чего (см. https://w3.org/2017/08/16-webappsec-minutes.html#item03 и ответ на https://stackoverflow.com/a/45926657/441757).
Я не знаю, почему спецификация https://w3.org/TR/cors не уже был четко помечен как устаревший, но я постараюсь убедиться, что он будет помечен как таковой в ближайшее время.
person
sideshowbarker
schedule
29.01.2019
Access-Control-Allow-Credentials
в этот момент. - person Alexis Wilke   schedule 29.01.2019