Кратко

  • Проект W3C от февраля 2007 года предложил владельцу ресурса разрешать чтение ответа страницам других сайтов. В проекте CORS от марта 2009 года подробнее описаны Origin запрашивающей страницы, разрешающий ответ ресурса и проверка в браузере.
  • Рекомендация января 2014 года определила проверку Access-Control-Allow-Origin. Для некоторых методов или заданных программой заголовков сначала нужен запрос OPTIONS; простой запрос может дойти до сервера, даже если программа не получит права прочитать ответ.

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

В проекте W3C от 15 февраля 2007 года Enabling Read Access for Web Resources владелец ресурса мог ослабить ограничение на чтение с помощью заголовка HTTP или инструкции XML. Способы указать допустимые хосты ещё обсуждались. Это был предшественник, а не окончательный CORS. Однако принцип уже появился: право читать чужой ответ объявляет тот, кто публикует ресурс. Проект CORS от 17 марта 2009 года развил разговор между Origin в запросе, заголовками разрешения в ответе и браузером, который сопоставляет их.

Рекомендация W3C от 16 января 2014 года показывает, как ресурс отвечает заголовком Access-Control-Allow-Origin, называя допустимое происхождение. Браузер сверяет его с происхождением страницы и после успешной проверки даёт её программе прочитать ответ. Для общедоступного ресурса без учётных данных существует широкий вариант *. С учётными данными требуется совпадающее конкретное происхождение и Access-Control-Allow-Credentials: true. Объявление «вход свободный» и приглашение по имени открывают разные двери.

Иногда браузер сначала спрашивает, можно ли вообще приходить с таким запросом. Если программа выбирает метод или собственные заголовки вне простого набора, она вызывает предварительную проверку OPTIONS. Сервер отвечает, какие методы и заголовки допустимы для данного Origin. Браузер оценивает ответ и может ненадолго запомнить результат. Такая проверка нужна при определённых условиях, а не перед каждым межсайтовым запросом. Не стоит искать отсутствующий звонок в дверь там, где никто не должен был звонить.

Главная тонкость: простой запрос может достичь сервера, который уже обработает его, даже если браузер позже скроет ответ от программы страницы. Раздел о безопасности в рекомендации прямо отделяет разрешение самого запроса и его побочных эффектов от разрешения читать возвращённые данные. Право изменить счёт или отправить деньги должен проверять сервер. Заголовок CORS регулирует доступ к ответу в браузере; кассиром он не работает.

История публикаций W3C ведёт от проектов 2007 года к объявлению рекомендации в 2014 году и фиксирует формальный отзыв этого документа в 2020 году. Исторический механизм решал конкретную задачу: ресурс указывает, какие другие сайты вправе читать его ответ, а браузер обеспечивает исполнение. График получает цифры соседа. Ключи от всего дома остаются у хозяина.