Совместное использование ресурсов между источниками

редактировать
Механизм запроса ресурсов с ограниченным доступом из другого домена

Совместное использование ресурсов между источниками (CORS ) - это механизм, который позволяет запрашивать ограниченные ресурсы на веб-странице из другого домена за пределами домена, из которого был обслужен первый ресурс.

Веб-страница может свободно встраивать изображения из разных источников, таблицы стилей, скрипты, фреймы и видео. Некоторые "междоменные" запросы, в частности запросы Ajax, по умолчанию запрещены политикой безопасности того же происхождения. CORS определяет способ, которым браузер и сервер могут взаимодействовать, чтобы определить, безопасно ли разрешить запрос из разных источников. Он обеспечивает большую свободу и функциональность, чем запросы с одним и тем же происхождением, но более безопасен, чем простое разрешение всех запросов от одного источника.

Спецификация CORS включена как часть Fetch Living Standard WHATWG. Эта спецификация описывает, как CORS в настоящее время реализован в браузерах. Более ранняя спецификация была опубликована как рекомендация W3C.

Содержание
  • 1 Как работает CORS
  • 2 Простой пример
  • 3 Пример предпечатной проверки
  • 4 Заголовки
    • 4.1 Заголовки запроса
    • 4.2 Заголовки ответов
  • 5 Поддержка браузера
  • 6 История
  • 7 CORS против JSONP
  • 8 См. Также
  • 9 Ссылки
  • 10 Внешние ссылки
Как работает CORS
Путь XMLHttpRequest (XHR) через CORS.

Стандарт 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 из разных источников следующим образом.

  1. Браузер отправляет запрос GET с дополнительным OriginHTTP-заголовком на service.example.com, содержащий домен, обслуживающий родительскую страницу:
    Origin: http: / /www.example.com
  2. Сервер service.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 можно использовать в качестве современной альтернативы в шаблон JSONP. Преимущества CORS:

  • Хотя JSONP поддерживает только метод запроса GET, CORS также поддерживает другие типы HTTP-запросов.
  • CORS позволяет веб-программисту использовать обычный XMLHttpRequest, который поддерживает лучшую обработку ошибок, чем JSONP.
  • Хотя JSONP может вызывать проблемы межсайтового скриптинга (XSS) при взломе внешнего сайта, CORS позволяет веб-сайтам вручную анализировать ответы на повышение безопасности.

Основным преимуществом JSONP была его способность работать в устаревших браузерах, предшествующих поддержке CORS (Opera Mini и Internet Explorer 9 и ранее). CORS теперь поддерживается большинством современных веб-браузеров.

См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-16 09:40:00
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте