Какую проблему пытается решить CORS?
Я читал о CORS
и как это работает, но я нахожу много чего путаете. Например, есть много деталей, о таких вещах, как
пользователей
Joe
использует браузерBrowserX
получить данные изsite.com
, который в свою очередь отправляет запрос наspot.com
. Для этогоspot
есть специальный заголовок... yada yada yada
без большого фона, я не понимаю, почему веб-сайты не позволяли запросы из некоторых мест. Я то есть, они существуют, чтобы служить ответами на запросы, не так ли? Почему определенные просьбы не могут быть удовлетворены?
он был бы очень признателен за хорошее объяснение (или ссылку на один) проблемы, которая CORS
сделано для решения.
Итак, вопрос в том,
в чем проблема CORS
Это решение?
3 ответов
поведение по умолчанию веб-браузеров, которые инициируют запросы со страницы через JavaScript (он же AJAX), заключается в том, что они следуют политика того же происхождения. Это означает, что запросы могут быть сделаны только через AJAX на тот же домен (или поддомен). Запросы в совершенно другой домен завершатся ошибкой.
Это ограничение существует, потому что запросы, сделанные в других доменах вашим браузером, будут нести ваш печенье что часто означает, что вы зашел на другой сайт. Итак, без того же происхождения,любой сайт может разместить JavaScript, который вызвал выход из системы stackoverflow.com например, и он бы вышел из системы. Теперь представьте себе сложности, когда мы говорим о социальных сетях, банковских сайтах и т. д.
Итак, все браузеры просто ограничивают сетевые вызовы на основе скриптов своим собственным доменом, чтобы сделать его простым и безопасным.
сайт X на www.x.com не удается сделать AJAX-запросы на сайт Y at www.y.com, только для *.x.com
существуют некоторые известные обходные пути (например, JSONP, который не включает cookies в запрос), но они не являются постоянным решением.
CORS позволяет этим междоменным запросам происходить, но только когда каждая сторона выбирает поддержку CORS.
во-первых, давайте поговорим о той же политике происхождения. Я процитирую из мой предыдущий ответ:
политика того же происхождения была изобретена, потому что она предотвращает доступ кода с одного веб-сайта учетные данные-ограниченный контент на другом сайте. Запросы Ajax по умолчанию отправляются с любыми файлами cookie auth, предоставленными целевым сайтом.
например, предположим, что я случайно нагрузкой
http://evil.com/
, который отправляет запрос наhttp://mail.google.com/
. Если SOP не было на месте, и я был подписан в Gmail, скрипт наevil.com
мог видеть мой почтовый ящик. Если сайт наevil.com
хочет, чтобы загрузитьmail.google.com
без моих cookies, он может просто использовать прокси-сервер; публичное содержимоеmail.google.com
не являются секретом (но содержаниеmail.google.com
при доступе с моими cookies are секрет).
(обратите внимание, что я сказал "содержимое с ограничением учетных данных", но это также может быть топология-ограничено содержание когда веб-сайт виден только для определенных IP-адресов.)
Иногда, однако, это не evil.com
пытаются заглянуть в ваш почтовый ящик. Иногда это просто полезный веб-сайт (скажем,http://goodsite.foo
) попытка использовать публичный API из другого источника (скажем,http://api.example.com
). Программисты, которые упорно работали над api.example.com
хочу все источники для свободного доступа к содержимому своего сайта. В этом случае сервер API at api.example.com
можно использовать заголовки CORS, чтобы разрешить goodsite.foo
(или любой другой запрос origin)для доступа к ответам API.
Итак, в общем, мы предполагаем по умолчанию, что кросс-исходный доступ-это плохо (подумайте о том, что кто-то пытается прочитать ваш почтовый ящик), но есть случаи, когда это хороший thing (подумайте о веб-сайте, пытающемся получить доступ к публичному API). CORS позволяет хороший случай произойти, когда запрошенный сайт хочет, чтобы это произошло.
есть причины безопасности и конфиденциальности, чтобы не разрешать запросы из любого места. Если вы посетили мой веб-сайт, вы не хотите, чтобы мой код делал запросы в Facebook, reddit, ваш банк, eBay и т. д. из Вашего браузера, используя ваши куки, не так ли? Тогда мой сайт сможет делать сообщения, читать информацию, размещать заказы и т. д. от вашего имени. Или от моего имени с вашими счетами.