Кратко

  • В январе 2009 года проект Origin предложил сообщать серверу, из какого контекста браузер отправил запрос. RFC 6454, опубликованный в декабре 2011 года, описал более общий принцип: какие страницы браузер считает одним источником прав.
  • Границу задают схема, хост и порт. Путь в сравнении не участвует. Чужая HTML-страница на том же origin может получить в браузере положение страницы самого приложения.

У каталога не было собственного паспорта

У сервиса есть /account для владельца учётной записи и /uploads для присланных материалов. Администратор видит два каталога и, возможно, две серверные политики. Браузер сравнивает схему адреса, имя хоста и порт. Если эта тройка совпадает, обе страницы принадлежат одному origin. Название папки не становится границей доверия.

RFC 6454 от декабря 2011 года дал точный язык практике, сложившейся в браузерах раньше его публикации. Разделять права по каждому URL было бы неудобно: приложение живёт сразу на многих страницах и использует множество файлов. Общий origin позволяет им работать вместе. Такая удобная общность заставляет внимательно смотреть на содержимое, которое оператор помещает внутрь.

Примеры RFC хорошо показывают цену каждого элемента. Страница HTTP на example.com и другой путь на том же хосте с явно указанным портом 80 находятся в одном origin: 80 — обычный порт HTTP. Другой порт меняет результат. Переход от HTTP к HTTPS тоже меняет его, даже при прежнем имени хоста. Страница, полученная по незащищённому каналу, не должна автоматически наследовать доверие страницы, пришедшей через HTTPS. А замена /account на /uploads для этого сравнения ничего не значит.

Чужой HTML сел за общий стол

Если оператор отдаёт материал посетителя как активный HTML из основного origin, браузер может запустить его код с правами этого origin. RFC отдельно обращает внимание на тип содержимого в разговоре о пользовательских материалах. Сервер всё ещё способен требовать отдельного разрешения для конкретного действия. Это не меняет того, в какой контекст браузер поместил исполняемую страницу. Табличка /uploads не понижает её статус.

Проект Origin, выпущенный в январе 2009 года, смотрел прежде всего на запрос, который видит сервер. Заголовок должен был назвать контекст, вызвавший запрос, чтобы сервер мог проверять в том числе межсайтовую подделку запросов. Документ имел статус Internet-Draft, а не утверждённого стандарта. RFC 6454 расширил описание: origin определяет группировку страниц ещё до отправки запроса, а заголовок сообщает об источнике его возникновения. Origin без обычной тройки превращается в строку null; для контекста, чувствительного к приватности, RFC также предписывает null.

Позднее рекомендация W3C по CORS 2014 года использовала сведения об origin, когда ресурс решал, кому дать прочитать ответ. Текст отдельно рассматривал право прочитать ответ и разрешение на последствия самого запроса. Это уже следующая дверь. Первая стоит в браузере: кого он вообще записал в жильцы одного дома?

RFC 6454 закрепил эту первую запись. Порт попал в паспорт, путь остался внутри. Состав жильцов зависит от того, как сайт публикует свои страницы.