Совместное использование ресурсов между источниками (CORS ) - это механизм, который позволяет запрашивать ограниченные ресурсы на веб-странице из другого домена за пределами домена, из которого был обслужен первый ресурс.
Веб-страница может свободно встраивать изображения из разных источников, таблицы стилей, скрипты, фреймы и видео. Некоторые "междоменные" запросы, в частности запросы Ajax, по умолчанию запрещены политикой безопасности того же происхождения. CORS определяет способ, которым браузер и сервер могут взаимодействовать, чтобы определить, безопасно ли разрешить запрос из разных источников. Он обеспечивает большую свободу и функциональность, чем запросы с одним и тем же происхождением, но более безопасен, чем простое разрешение всех запросов от одного источника.
Спецификация CORS включена как часть Fetch Living Standard WHATWG. Эта спецификация описывает, как CORS в настоящее время реализован в браузерах. Более ранняя спецификация была опубликована как рекомендация W3C.
Стандарт CORS описывает новые заголовки HTTP, которые предоставляют браузерам возможность запрашивать удаленные URL-адреса только при наличии у них разрешения. Хотя некоторая проверка и авторизация могут быть выполнены сервером, обычно браузер несет ответственность за поддержку этих заголовков и соблюдение налагаемых ими ограничений.
Для методов Ajax и HTTP-запросов, которые могут изменять данные (обычно HTTP-методы, отличные от GET, или для использования POST с определенными типами MIME ), спецификация требует, чтобы браузеры выполняли предварительную проверку запроса, запрашивая поддерживаемые методы с сервера с помощью метода запроса HTTP OPTIONS, а затем, после «утверждения» с сервера, отправляя фактический запрос с фактическим методом запроса HTTP. Серверы также могут уведомлять клиентов о том, следует ли отправлять с запросами «учетные данные» (включая файлы cookie и данные HTTP-аутентификации).
Предположим, пользователь посещает http://www.example.com и страница пытается выполнить запрос из разных источников для получения данных пользователя с http://service.example.com. Браузер, совместимый с CORS, попытается сделать запрос к service.example.com из разных источников следующим образом.
Origin
HTTP-заголовком на service.example.com, содержащий домен, обслуживающий родительскую страницу: Origin: http: / /www.example.com
Access-Control-Allow-Origin
(ACAO) в его ответе указывается, что запросы от источника разрешены. Например, в этом случае это должно быть: Access-Control-Allow-Origin: http://www.example.com
Access-Control-Allow-Origin
(ACAO) с подстановочным знаком, указывающим, что запросы из всех доменов разрешены: Access-Control-Allow-Origin: *
Политика одинакового происхождения с подстановочными знаками уместна, когда страница или ответ API считаются полностью общедоступным контентом и должны быть доступны всем, включая любой код на любом сайте. Примером может служить свободно доступный веб-шрифт на общедоступной службе хостинга, такой как Google Fonts.
Политика одинакового происхождения с подстановочными знаками также широко и уместно используется в модели объектных возможностей, где страницы имеют нераспознаваемые URL-адреса и предназначены для доступа всем, кто знает секрет.
Значение «*» является особенным, поскольку оно не позволяет запросам предоставлять учетные данные, то есть не позволяет отправлять HTTP-аутентификацию, клиентские SSL-сертификаты или файлы cookie в междоменном запросе..
Обратите внимание, что в архитектуре CORS заголовок Access-Control-Allow-Origin устанавливается внешней веб-службой (service.example.com), а не исходным сервером веб-приложений (www.example. com). Здесь service.example.com использует CORS, чтобы разрешить браузеру авторизовать www.example.com для выполнения запросов к service.example.com.
Если сайт указывает заголовок «Access-Control-Allow-Credentials: true», сторонние сайты могут иметь возможность выполнять привилегированные действия и получать конфиденциальную информацию. Даже если это не так, злоумышленники могут обойти любые средства управления доступом на основе IP, проксируя через браузеры пользователей.
При выполнении определенных типов междоменных запросов Ajax современные браузеры, поддерживающие CORS, будут вставлять дополнительный запрос предварительной проверки, чтобы определить, есть ли у них разрешение на выполнение действия. Таким образом, запросы с перекрестным происхождением обрабатываются заранее, потому что они могут иметь последствия для пользовательских данных.
OPTIONS / Host: service.example.com Источник: http://www.example.com
Если service.example.com готов принять действие, он может ответить следующие заголовки:
Access-Control-Allow-Origin: http://www.example.com Access-Control-Allow-Methods: PUT, DELETE
Затем браузер создаст исходный запрос. Если service.example.com не принимает межсайтовые запросы от этого источника, он ответит ошибкой на запрос OPTIONS, и браузер не сделает исходный запрос.
Заголовки HTTP, которые относятся к CORS:
Источник
Access-Control-Request-Method
Access-Control -Request-Headers
Access-Control-Allow-Origin
Access-Control-Allow-Credentials
Access-Control-Expose-Headers
Access-Control-Max-Age
Access-Control-Allow-Methods
Access-Control-Allow-Headers
CORS поддерживается всеми браузерами на основе следующих механизмов компоновки:
Поддержка разных источников происхождения была первоначально предложена Мэттом Ошри, Брэдом Портером и Майклом Боделлом из Tellme Networks в марте 2004 г. для включения в VoiceXML 2.1. чтобы разрешить безопасные запросы данных из разных источников браузерами VoiceXML. Этот механизм считался общим по своей природе, а не специфическим для VoiceXML, и впоследствии был выделен в ПРИМЕЧАНИЕ по реализации. Рабочая группа W3C по веб-приложениям с участием основных поставщиков браузеров приступила к оформлению ПРИМЕЧАНИЕ в Рабочий проект W3C на пути к формальному статусу Рекомендации W3C.
В мае 2006 года был представлен первый рабочий проект W3C. В марте 2009 г. проект был переименован в «Совместное использование ресурсов между источниками», а в январе 2014 г. он был принят как рекомендация W3C.
CORS можно использовать в качестве современной альтернативы в шаблон JSONP. Преимущества CORS:
GET
, CORS также поддерживает другие типы HTTP-запросов.Основным преимуществом JSONP была его способность работать в устаревших браузерах, предшествующих поддержке CORS (Opera Mini и Internet Explorer 9 и ранее). CORS теперь поддерживается большинством современных веб-браузеров.