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

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

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

В прошлом, когда интернет-технологии были еще новинкой, возникали проблемы с подделкой межсайтовых запросов (CSRF). Из-за этого поддельные клиентские запросы из браузера жертвы отправлялись в другое приложение.

Предположим, жертва вошла в приложение своего банка. Затем ее обманом заставили загрузить внешний веб-сайт в новой вкладке браузера. После этого внешний веб-сайт использовал учетные данные жертвы в виде файлов cookie и передал данные в банковское приложение, выдавая себя за жертву. В результате неавторизованные пользователи получили несанкционированный доступ к банковскому приложению.

Чтобы предотвратить такие проблемы с CSRF, во всех браузерах теперь применяется политика одинакового источника.

Политика одинакового источника

Сегодня браузеры требуют, чтобы клиенты могли отправлять запросы только тому к ресурсу, источник которого совпадает с URL-адресом клиента. Протокол, порт и имя хоста URL-адреса клиента должны соответствовать серверу, которому отправляется запрос.

Например, рассмотрим сравнение источников приведенных ниже URL-адресов с URL-адресом клиента http://store.aws.com/dir/page.html.

URL-адрес

Результат

Причина

http://store.aws.com/dir2/new.html

Тот же источник

Отличается только путь

http://store.aws.com/dir/inner/other.html        

Тот же источник

Отличается только путь

https://store.aws.com/page.html

Другой источник      

Другой протокол

http://store.aws.com:81/dir/page.html

Другой источник

Другой порт (для http:// по умолчанию используется порт 80)

http://news.aws.com/dir/page.html

Другой источник

Другой хост

Таким образом, политика одинакового источника отличается высокой безопасностью, но не обладает гибкостью, достаточной для реальных случаев использования.

Совместное использование ресурсов между разными источниками (CORS) является расширением политики одинакового источника. Он необходим для авторизованного обмена ресурсами с внешними третьими сторонами. Например, вам потребуется CORS, если необходимо получить данные из внешних API, которые являются общедоступными или авторизованными. Также CORS необходим, если вы хотите предоставить авторизованный сторонний доступ к вашим собственным серверным ресурсам.

Как работает совместное использование ресурсов из разных источников?

При стандартной интернет-связи ваш браузер отправляет HTTP-запрос на сервер приложений, получает данные в виде HTTP-ответа и отображает их. В браузерной терминологии текущий URL-адрес браузера называется текущим источником, а сторонний URL-адрес – URL-адресом из стороннего источника.

Когда вы отправляете запрос между разными источниками, происходит следующий процесс запроса-ответа.

  1. Браузер добавляет в запрос заголовок источника с информацией о протоколе, хосте и порте текущего источника
  2. Сервер проверяет текущий исходный заголовок и отвечает запрошенными данными и заголовком Access-Control-Allow-Origin
  3. Браузер видит заголовки запросов контроля доступа и передает возвращенные данные клиентскому приложению.

В качестве альтернативы, если сервер не хочет разрешать доступ между разными источниками, он отвечает сообщением об ошибке.

Пример совместного использования ресурсов из разных источников

Например, рассмотрим сайт с адресом https://news.example.com. Этот сайт хочет получить доступ к ресурсам через API partner-api.com.

Разработчики на сайте https://partner-api.com сначала настраивают заголовки совместного использования ресурсов между источниками (CORS) на своем сервере, добавляя new.example.com в список разрешенных источников. Для этого они добавляют следующую строку в свой файл конфигурации сервера.

Access-Control-Allow-Origin: https://news.example.com

После настройки доступа к CORS news.example.com может запрашивать ресурсы на сайте partner-api.com. На каждый запрос partner-api.com отправит ответ Access-Control-Allow-Credentials : "true". Теперь браузеру известно, что подключение авторизовано, и он разрешает доступ между разными источниками.

Если вы хотите предоставить доступ к нескольким источникам, используйте список, разделенный запятыми, или подстановочные знаки, такие как *, которые предоставляют доступ всем.

Что такое предварительный запрос CORS?

В HTTP методы запроса являются операциями над данными, которые клиент отправляет серверу для выполнения. К распространенным методам HTTP относятся GET, POST, PUT и DELETE.

При обычном обмене ресурсами между источниками (CORS) браузер отправляет запрос вместе с заголовками управления доступом. Обычно это запросы данных GET, которые считаются низкорисковыми.

Однако некоторые HTTP-запросы считаются сложными и требуют подтверждения со стороны сервера перед отправкой фактического запроса. Процесс предварительного утверждения называется предварительным запросом.

Сложные запросы из разных источников

Запросы из разных источников являются сложными, если в них используется что-то из следующего.

  • Методы, отличные от GET, POST и HEAD
  • Заголовки, отличные от Accept-Language, Accept или Content-Language
  • Заголовки Content-Type, отличные от multipart/form-data, application/x-www-form-urlencoded и text/plain

Так, например, запросы на удаление или изменение существующих данных считаются сложными.

Как работают предварительные запросы

Браузеры создают предварительные запросы по необходимости. Это запрос OPTIONS, подобный следующему.

OPTIONS /data HTTP/1.1

Источник: https://example.com

Access-Control-Request-Method: DELETE

Браузер отправляет предварительный запрос перед сообщением с фактическим запросом. Сервер должен ответить на предварительный запрос информацией о запросах из разных источников, которые сервер готов принять с URL-адреса клиента. Заголовки ответа сервера должны содержать следующее.

  • Access-Control-Allow-Methods
  • Access-Control-Allow-Headers
  • Access-Control-Allow-Origin

Ниже приведен пример ответа сервера.

HTTP/1.1 200 OK

Access-Control-Allow-Headers: Content-Type

Access-Control-Allow-Origin: https://news.example.com

Access-Control-Allow-Methods: GET, DELETE, HEAD, OPTIONS

В предварительный ответ иногда включается дополнительный заголовок Access-Control-Max-Age. Этот показатель определяет время (в секундах), в течение которого браузер кэширует результаты предварительной проверки в браузере. Кэширование позволяет браузеру отправлять несколько сложных запросов между предварительными запросами. Ему не приходится отправлять еще один предварительный запрос до истечения времени, указанного в параметре max-age.

 

В чем разница между CORS и JSONP?

JSON с заполнением (JSONP) – это давняя технология, позволяющая производить обмен данными между веб-приложениями, работающими в разных доменах.

В JSONP используются теги HTML-скриптов на странице клиента. Тег скрипта загружает внешние файлы JavaScript или встраивает код JavaScript непосредственно в страницу HTML. Поскольку на сценарии не распространяется политика одинакового источника, вы можете извлекать данные из разных источников с помощью кода JavaScript.

Однако эти данные должны быть в формате JSON. Кроме того, JSONP менее безопасен, чем совместное использование ресурсов между источниками (CORS), поскольку для обеспечения безопасности данных он полагается на надежность внешнего домена.

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

Подробнее о JavaScript »

Подробнее о JSON »

Каковы рекомендации по работе с CORS?

При настройке совместного использования ресурсов между источниками (CORS) на сервере следует учитывать следующее.

Определите соответствующие списки доступа

Всегда лучше предоставлять доступ к отдельным доменам, указывая их в списке через запятую. Избегайте использования подстановочных знаков, если не собираетесь сделать API общедоступным. В противном случае использование подстановочных знаков и регулярных выражений может привести к созданию уязвимостей.

Предположим, что вы пишете регулярное выражение, предоставляющее доступ ко всем сайтам с суффиксом permitted-website.com. Одним выражением вы предоставляете доступ к сайтам api.permitted-website.com и news.permitted-website.com. Но вы также непреднамеренно предоставляете доступ к неавторизованным сайтам, которые могут использовать такие домены, как maliciouspermitted-website.com.

Избегайте использования нулевого источника в списке

Некоторые браузеры отправляют значение null в заголовке запроса в определенных сценариях, таких как запросы к файлам или запросы с локального хоста.

Однако не следует включать в список доступа нулевое значение. Из-за него возникают угрозы безопасности, поскольку доступ открывается и для несанкционированных запросов, содержащих нулевые заголовки.

Как AWS обеспечивает соответствие вашим требованиям к CORS?

Во многие из наших сервисов встроена поддержка совместного использования ресурсов между источниками (CORS). Поэтому вы можете контролировать доступ из разных источников к своим API и ресурсам, размещенным на Amazon Web Services (AWS).

Ниже перечислены несколько сервисов AWS с поддержкой CORS.

  • Amazon Simple Storage Service (Amazon S3) – это сервис хранилища объектов с экономичными классами хранилищ для всех примеров использования хранилищ данных. Amazon S3 позволяет создать документ конфигурации CORS с правилами, определяющими источники доступа к данным S3, операции (методы HTTP), которые вы будете поддерживать для каждого источника, и другую информацию, относящуюся к конкретной операции. В конфигурацию можно добавить до 100 правил.
  • Amazon API Gateway – это полностью управляемый сервис, предназначенный для создания, публикации, обслуживания, мониторинга и обеспечения безопасности API в любых масштабах. Включить CORS для API REST можно одним щелчком мыши прямо в консоли API шлюза Amazon.

Создайте учетную запись уже сегодня и начните работу с API на AWS.

AWS: дальнейшие шаги

Дополнительные ресурсы к продукту
Сервисы интеграции приложений 
Зарегистрировать бесплатный аккаунт

Получите мгновенный доступ к уровню бесплатного пользования AWS.

Регистрация 
Начать разработку в консоли

Начните разработку в Консоли управления AWS.

Вход