Кратко
Скопировано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.