[Документация Yandex Cloud](../index.md) > [Облачная терминология](index.md) > Сети и доставка контента > CORS

# CORS и принцип одинакового источника

## Описание термина

CORS (Cross-Origin Resource Sharing, англ.  «совместное использование ресурсов разных источников») — это стандарт, позволяющий предоставлять веб-страницам доступ к объектам сторонних интернет-ресурсов.
Сторонним считается любой интернет-ресурс, который отличается от запрашиваемого протоколом, доменом или портом.

Доступ предоставляется по специализированным запросам. Интернет-ресурс, принимающий запрос, содержит список доверенных источников, которым разрешен доступ к объектам. Страница-источник запроса получает доступ, если входит в список доверенных источников. Для предоставления доступа всем сторонним интернет-страницам используется маска «*».

## Как появился стандарт

Первоначально для защиты информации была разработана «Политика одинакового источника» (_Same-Origin Policy_, SOP). Поддерживающий политику SOP веб-браузер сверяет комбинации сетевого протокола (например, https), точное имя домена и номер порта, чтобы разрешить доступ к ресурсам веб-страницы по запросам с другой страницы. Политика SOP не обязательна к применению, однако все современные веб-браузеры ее поддерживают.

Если веб-ресурсы интернет-источника соответствуют SOP, для доступа к ним из другого источника браузер должен поддерживать технологию _Cross-Origin Resource Sharing_. В 2006 году рабочая группа Консорциума Всемирной паутины (World Wide Web Consortium, W3C – организация, разрабатывающая интернет-стандарты) представила первый рабочий проект этой технологии. В 2014 году CORS был принят в качестве Рекомендации W3C.

## Структура Cross-Origin Resource Sharing

Методы CORS предназначены для управления доступом к дескрипторам (тегам) на веб-страницах в сети. Управляемые типы доступа подразделяются на три основных категории по работе с информацией сторонних ресурсов:

1.	_Доступ на запись_ — это доступ к ссылкам, заполнению веб-форм и переадресации на сторонние веб-страницы, т.е. на передачу информации в сторонний источник (веб-ресурс).

1.	_Доступ на вставку_ относится к категории доступа на считывание информации из стороннего источника. К этому типу принадлежат вставки в код дескрипторов `audio`, `video`, `img`, `embed`, `object`, `link`, `script`, `iframe` и другие элементы оформления веб-страниц. Структура подобных дескрипторов подразумевает самостоятельную инициацию перекрестных (cross-origin) запросов из сторонних источников. Все дескрипторы этой категории представляют низкий уровень угрозы безопасности, поэтому разрешены в веб-браузере по умолчанию.

1.	_Доступ на считывание_ — это дескрипторы, загружаемые с использованием фоновых методов вызова, таких как `fetch()`, технологии обмена данными Ajax и пр. Поскольку подобные дескрипторы могут содержать в теле любые участки кода (в том числе вредоносного), они запрещены в веб-браузерах по умолчанию.

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

## Принцип работы CORS

При создании перекрестного HTTP-запроса браузер клиента добавляет в него объявление домена веб-страницы, инициирующей запрос. Домен объявляется в заголовке Origin.

Например, страница `https://client-1.ru/page.html` запрашивает данные со страницы `https://server-site.ru/info`.
Пример запроса от браузера клиента, использующего методы CORS, приведен ниже:

```
GET /info HTTP/1.1
Host: server-site.ru
Origin: client-1.ru
```

В случае, если сервер по адресу `www.server-site.ru` разрешает странице-источнику запроса доступ к данным с домена, в его ответе на запрос появится CORS-заголовок `Access-Control-Allow-Origin` с именем объявленного домена:

```
Access-Control-Allow-Origin: https://client-1.ru
```

Если сервер, на который запрошен доступ, не добавит в ответ указанную строку, браузер клиента вместо данных файла `info` вернет код ошибки.

Если на сервере разрешен доступ к ресурсу страницам любого стороннего домена, в ответе будет указана маска `*`.

```
Access-Control-Allow-Origin: *
```

Если на сервере разрешен доступ не всем, а нескольким сторонним клиентам, ответ сервера содержит имена всех этих доменов, выведенных отдельными строками или разделенных пробелами:

```
Access-Control-Allow-Origin: https://client-1.ru https://client-2.ru https://client-3.ru
```

Если заголовок Origin отсутствует в запросе браузера клиента, сервер не возвращает CORS-заголовки в ответе.

## Сферы применения

Механизм CORS используется как более защищенная альтернатива технологии JSONP, так как позволяет использовать все преимущества xml-запросов через http, и является неуязвимым для внедрения в запрос стороннего кода (SQL-инъекций).

Все современные браузеры поддерживают эту технологию (Yandex Browser, Google Chrome, Mozilla Firefox и др.)

Важно понимать, что технологию CORS должен поддерживать как приемник данных (веб-браузер), так и источник (веб-ресурс).

Например, [Yandex Object Storage](https://yandex.cloud/ru-kz/services/storage/) — универсальный облачный сервис для хранения данных, который поддерживает кросс-доменные запросы к ресурсам в каждом бакете. Подробнее в [документации](../storage/index.md).

Подписчикам сервиса доступны удобные механизмы управления CORS, такие как консоль управления Yandex Cloud или HTTP API, совместимый с Amazon S3.

Конфигурация CORS — это XML-файл с правилами доступа. Конфигурация содержит не больше 100 правил, размер файла не превышает 64КБ. Готовый файл конфигурации можно загрузить в бакет с помощью AWS CLI (режима командной строки Amazon), либо создать с помощью встроенной консоли управления.

#### Полезные ссылки {#see-also}

* [Пример проверочной таблицы](https://ru.wikipedia.org/wiki/Правило_ограничения_домена)
* [Примеры возможных ошибок](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors)
* [CORS-конфигурация бакетов](../storage/s3/api-ref/cors/xml-config.md)
* [Примеры настройки и управления доступом к отдельным ресурсам бакета](../storage/operations/buckets/cors.md)