Кратко
СкопированоCORS расшифровывается как Cross-Origin Resource Sharing. Это механизм браузера, который позволяет определить список ресурсов, к которым страница может получить доступ. Он необходим для обеспечения безопасности и защиты пользователей от злоумышленников при использовании HTTP протокола.
По умолчанию, сайты могут запрашивать ресурсы только со своего origin
. Такое ограничение называется Same-Origin Policy. CORS расширяет Same-Origin Policy, позволяя получать доступ к ресурсам с разных доменов.
origin
- это комбинация протокола, домена и порта (если он указан). Например, doka
- это домен, а https
- origin
.
Настройка доступа должна происходить как со стороны браузера, так и со стороны сервера.
Это означает, что и браузер, и сервер должны быть настроены на разрешение или запрет доступа к ресурсам с других origin
.
Как работает
СкопированоРассмотрим пример работы CORS без дополнительной настройки:
Пользователь открывает страницу сайта
doka
. Страница отправляет запрос к стороннему источнику. guide api
.. example . com
Браузер сравниваетorigin
и понимает, чтоapi
- сторонний. example . com origin
для нашего сайта, из-за чего блокирует запрос. Причём запрос может быть заблокирован и в рамках одного домена, например уhttp
и: / / doka . guide https
: / / doka . guide origin
будет отличаться из-за несовпадения протоколов.
Такие запросы с сайта на сайт называются перекрёстными.
Правильная настройка CORS помогает решить возможные проблемы с доступом к другим ресурсам и обеспечить безопасность веб-приложений.
Настройка
СкопированоДля настройки CORS со стороны сервера используются специальные заголовки запроса:
Access
- указывает на- Control - Allow - Origin origin
, откуда на сервер разрешены запросы.Access
- указывает, какие HTTP-методы разрешены для запросов на сервер. Например,- Control - Allow - Methods GET
,POST
,DELETE
.Access
- определяет, какие заголовки могут быть использованы в ответе от сервера, которые не являются стандартными для HTTP.- Control - Allow - Headers Access
- указывает, разрешено ли отправлять cookie и авторизационные данные вместе с запросом на сервер. Для разрешения используется значение- Control - Allow - Credentials true
.Access
- определяет максимальное время, в течение которого должны кэшироваться предыдущие ответы на запросы предварительной проверки CORS.- Control - Max - Age Access
- определяет список заголовков, которые могут быть доступны на клиентской стороне.- Control - Expose - Headers
Также есть заголовок для настройки со стороны браузера:
Origin
- указывает на комбинацию домена, порта и протокола, откуда на сервер поступает запрос.
И заголовки для настройки предварительных запросов:
Access
- определяет метод запроса, который будет использоваться в основном запросе.- Control - Request - Method Access
- используется для указания заголовков, которые будут использоваться в основном запросе.- Control - Request - Headers
Предварительные запросы
СкопированоПредварительный запрос - это дополнительный HTTP запрос, который отправляется браузером перед основным запросом.
Когда страница запрашивает данные с другого origin
, браузер отправляет предварительный запрос OPTIONS
на сервер, чтобы узнать, разрешены ли такие запросы. При повторном запросе на тот же origin
, запрос OPTIONS
может и не отправляться, а все данные будут получены из кеша.
При отправке запроса на api
, браузер проставит заголовок Origin
, сформирует запрос в определённом формате и отправит его на сервер:
OPTIONS / HTTP/1.1 Host: api.example.com Origin: doka.guide
Если сервер запрещает доступ к ресурсу, то в результате запроса в браузере мы увидим ошибку.
А если доступ разрешён, то сервер ответит на запрос заголовком:
Access
Такая запись означает, что сервер разрешает доступ с домена doka
.
Также можно разрешить доступ сразу для нескольких доменов. Тогда запись будет выглядеть так:
Access
Или задать маску:
*
- для разрешения доступа с любого поддомена. site . com site
.. com *
- для разрешения доступа отовсюду.
Однако необходимо быть осторожным при использовании этого заголовка, так как неправильная конфигурация может привести к уязвимостям безопасности. Например, если сервер отправляет Access
, это означает, что любой origin
может получить доступ к ресурсам на сервере. Это может привести к возможности выполнения атак, например, CSRF и других.
Важно помнить
СкопированоНастройка CORS происходит как со стороны браузера, так и со стороны сервера. Поэтому необходимо правильно настроить сервер, чтобы он возвращал нужные заголовки при запросах с других origin
.