Переход на Reporting API v1

Доступна новая версия API для создания отчетов. Она более конфиденциальна и, скорее всего, будет поддерживаться во всех браузерах.

API отчетов предоставляет информацию об ошибках, возникающих на вашем сайте во время его использования посетителями. Он обеспечивает прозрачность в отношении вмешательств браузера, сбоев браузера, нарушений политики безопасности контента (Content-Security-Policy), нарушений COOP/COEP, предупреждений об устаревании и многого другого.

Доступна новая версия API для создания отчетов. Новый API стал более компактным и, скорее всего, будет поддерживаться во всех браузерах.

Краткое содержание

Разработчики сайта

Если на вашем сайте уже есть функция создания отчетов : перейдите на версию 1, используя новый заголовок ( Reporting-Endpoints ), но некоторое время сохраните старый заголовок ( Report-To ). См. пример кода миграции .

Если вы только что добавили на свой сайт функциональность создания отчетов , используйте только новый заголовок ( Reporting-Endpoints ).

⚠️ В обоих случаях убедитесь, что заголовок Reporting-Endpoints добавлен ко всем ответам, которые могут генерировать отчеты.

Разработчики сервисов отчетности

Если вы поддерживаете службу конечных точек или используете собственную, ожидайте увеличения трафика по мере того, как вы или внешние разработчики будете переходить на Reporting API v1 (заголовок Reporting-Endpoints ).

Читайте дальше, чтобы узнать подробности и посмотреть примеры кода!

Журналирование сетевых ошибок

Будет разработан новый механизм для регистрации сетевых ошибок. Как только он станет доступен, переключитесь с Reporting API v0 на этот новый механизм.

Демонстрация и код

Различия между v0 и v1

Что меняется?

  • Поверхность API отличается.
v0 (устаревшая версия)
 Report-To: { group: "main-endpoint", "max_age": 86400, "endpoints": [ { "url": ... }, { "url": ... }] }, { group: "default-endpoint", "max_age": 86400, "endpoints": [ { "url": ... }, { "url": ... }] }
 Document-Policy: ...; report-to main-endpoint

{0 использует заголовок Report-To для настройки именованных групп конечных точек , а директива report-to в других заголовках используется для ссылки на эти группы конечных точек.

v1 (новая)
 Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default"
 Document-Policy: ...; report-to main-endpoint

В версии v1 для настройки именованных конечных точек используется заголовок Reporting-Endpoints . Как и в версии v0, для ссылки на эти группы конечных точек используется директива report-to в других заголовках.

  • Объем отчета отличается.
v0 (устаревшая версия)

В версии v0 можно задавать конечные точки для формирования отчетов только для некоторых ответов. Другие документы (страницы) на этом источнике будут автоматически использовать эти внутренние конечные точки.

v1 (новая)

В версии 1 необходимо устанавливать заголовок Reporting-Endpoints во всех ответах, которые могут генерировать отчеты.

  • Оба API поддерживают одни и те же типы отчетов, за одним исключением: версия 1 не поддерживает отчеты об ошибках сети . Подробнее см. в шагах миграции .
  • Версия v0 не поддерживается и не будет поддерживаться во всех браузерах. Поддержка версии v1 в нескольких браузерах, скорее всего, появится в будущем.

Что остаётся неизменным

  • Формат и структура отчетов остаются неизменными.
  • Запрос, отправленный браузером на конечную точку, остается POST запросом с Content-type application/reports+json .
  • В версиях v0 и v1 поддерживается сопоставление определенных конечных точек с определенными типами отчетов.
  • Роль конечной точки default остается неизменной.
  • API Reporting версии 1 не оказывает никакого влияния на ReportingObserver . ReportingObserver продолжает получать доступ ко всем наблюдаемым отчетам, и их формат остается неизменным.

Все различия между v0 и v1

API для создания отчетов (версия 0)
Заголовок Report-To
Новый API для создания отчетов (версия 1)
заголовок Reporting-Endpoints
Поддержка браузеров Chrome 69+ и Edge 69+. Chrome 96+ и Edge 96+. Firefox поддерживает. Safari не возражает. См. сигналы браузера .
Конечные точки Отправляет отчеты любому из нескольких сборщиков отчетов (для каждой группы конечных точек определено несколько URL-адресов). Отправляет отчеты конкретным сборщикам отчетов (для каждой конечной точки определен только один URL-адрес).
Поверхность API Использует заголовок `Report-To` для настройки именованных групп конечных точек . Использует заголовок `Reporting-Endpoints` для настройки именованных конечных точек .
Типы отчетов, которые можно сгенерировать с помощью этого API.
  • Амортизация
  • Вмешательство
  • Крушение
  • COOP/COEP
  • Уровень политики безопасности контента 3 (CSP Level 3)
  • Журналирование сетевых ошибок (NEL)
Подробнее о типах отчетов можно узнать в статье об API для создания отчетов .
Без изменений, за исключением регистрации сетевых ошибок (NEL): эта функция не поддерживается в новом API отчетов (v1) .
Объем отчета Источник.
Заголовок Report-To документа влияет на другие документы (страницы) из этого источника. Поле url отчета по-прежнему различается для каждого документа.
Документ.
Заголовок Reporting-Endpoints в документе влияет только на этот документ. Поле url в отчете по-прежнему различается для каждого документа.
Отчет об изоляции (пакетной обработке) Различные документы (страницы) или сайты/источники, генерирующие отчет примерно в одно и то же время и имеющие одну и ту же конечную точку формирования отчетов, будут объединены в одну группу: они будут отправлены в одном сообщении на конечную точку формирования отчетов.
  • Отчеты из разных документов (страниц) никогда не отправляются одновременно. Даже если два документа (страницы) из одного источника одновременно генерируют отчет для одной и той же конечной точки, они не будут объединены в пакет. Это механизм для защиты от атак на конфиденциальность.
  • Отчеты, составленные на основе одного и того же документа (страницы), могут быть отправлены вместе.
Поддержка балансировки нагрузки / приоритетов Да Нет

Разработчики конечных устройств: ожидайте увеличения трафика.

Если вы настроили собственный сервер в качестве конечной точки для формирования отчетов, или если вы разрабатываете или поддерживаете сервис сбора отчетов, ожидайте увеличения трафика на эту конечную точку.

Это связано с тем, что отчеты в Reporting API v1 не формируются пакетами, как в Reporting API v0. Поэтому, по мере того как разработчики приложений начнут переходить на Reporting API v1, количество отчетов останется примерно таким же, но объем запросов к серверу конечной точки увеличится.

Разработчики приложений: Переход на Reporting-Endpoints (v1)

Что вам следует сделать?

Использование нового API для создания отчетов (версия 1) имеет ряд преимуществ ✅:

  • Сигналы браузера положительные , что означает, что для версии 1 можно ожидать кроссбраузерной поддержки (в отличие от версии 0, которая поддерживается только в Chrome и Edge).
  • API стал более компактным.
  • В настоящее время разрабатываются инструменты на основе нового API для создания отчетов (версия 1).

С учетом этого:

  • Если ваш сайт уже использует Reporting API v0 с заголовком Report-To , перейдите на Reporting API v1 (см. шаги миграции ). Если ваш сайт уже использует функциональность отчетности о нарушениях Content-Security Policy, ознакомьтесь с конкретными шагами миграции для отчетности по CSP .
  • Если ваш сайт еще не использует API отчетов, и вы добавляете функциональность отчетов, используйте новый API отчетов (v1) (заголовок Reporting-Endpoints ). Есть одно исключение : если вам необходимо использовать журнал ошибок сети, используйте Report-To (v0). В настоящее время журнал ошибок сети не поддерживается в API отчетов v1. Новый механизм для журнала ошибок сети будет разработан — пока он не станет доступен, используйте API отчетов v0. Если вам нужен журнал ошибок сети наряду с другими типами отчетов, используйте как Report-To (v0), так и Reporting-Endpoints (v1). v0 предоставляет вам журнал ошибок сети, а v1 — отчеты всех остальных типов.

Этапы миграции

Ваша цель при миграции — не потерять отчеты, которые вы получали с версией v0.

  1. Шаг 1 (выполнить сейчас) : Используйте оба заголовка: Report-To (v0) и Reporting-Endpoints (v1).

    В результате вы получаете:

    • Отчеты из новых версий Chrome и Edge благодаря Reporting-Endpoints (v1).
    • Благодаря Report-To (v0) отчеты из более старых версий Chrome и Edge.

    Экземпляры браузеров, поддерживающие Reporting-Endpoints будут использовать Reporting-Endpoints , а экземпляры, не поддерживающие эту функцию, будут использовать Report-To . Формат запроса и отчета одинаков для версий v0 и v1.

  2. Шаг 2 (выполнить сейчас): Убедитесь, что заголовок Reporting-Endpoints установлен для всех ответов, которые могут генерировать отчеты.

    В версии 0 можно было установить конечные точки для формирования отчетов только для некоторых ответов, а другие документы (страницы) на этом источнике использовали бы эту «фоновую» конечную точку. В версии 1 из-за различий в области действия необходимо устанавливать заголовок Reporting-Endpoints для всех ответов, которые могут генерировать отчеты.

  3. Шаг 3 (начать позже): После того, как все или большинство ваших пользователей обновятся до более поздних версий Chrome или Edge (96 и более поздние), удалите Report-To (v0) и оставьте только Reporting-Endpoints .

    Одно исключение: если вам необходимы отчеты о сетевых ошибках, используйте Report-To до тех пор, пока не будет внедрен новый механизм для регистрации сетевых ошибок.

Примеры кода смотрите в руководстве по миграции .

Этапы миграции для отчетности CSP

Существует два способа настройки отчетов о нарушениях политики безопасности контента :

  • С помощью одного только заголовка CSP, заданного директивой report-uri , обеспечивается широкая поддержка браузеров, включая Chrome, Firefox, Safari и Edge. Отчеты отправляются с типом содержимого application/csp-report и имеют формат, специфичный для CSP. Эти отчеты называются «отчетами CSP уровня 2» и не зависят от API отчетов.
  • При использовании Reporting API это осуществляется через заголовок Report-To (устаревшая версия) или через более новую Reporting-Endpoints (v1). Поддерживается только в Chrome и Edge. Запросы на получение отчетов имеют тот же формат, что и другие запросы Reporting API, и тот же тип содержимого application/reports+json .

Использование первого подхода (только report-uri ) больше не рекомендуется , а второй подход имеет ряд преимуществ. В частности, он позволяет использовать единый способ настройки отчетов для всех типов отчетов, а также задать универсальную конечную точку (поскольку все запросы к отчетам, генерируемые через Reporting API⏤CSP и другие⏤, имеют одинаковый формат application/reports+json .

Однако, report-to поддерживается лишь немногими браузерами . Поэтому рекомендуется использовать report-uri наряду с подходом Reporting API ( Report-To или, лучше, Reporting-Endpoints ), чтобы получать отчеты о нарушениях CSP из нескольких браузеров. В браузере, который распознает report-uri и report-to , report-uri будет игнорироваться, если присутствует report-to . В браузере, который распознает только report-uri , будет учитываться только report-uri .

  1. Шаг 1 (выполнить сейчас) : Если вы еще не добавили report-to вместе с report-uri , сделайте это. Браузеры, поддерживающие только report-uri (Firefox), будут использовать report-uri , а браузеры, поддерживающие также report-to (Chrome, Edge), будут использовать report-to . Чтобы указать именованные конечные точки, которые вы будете использовать в report-to , используйте оба заголовка: Report-To и Reporting-Endpoints . Это гарантирует получение отчетов как от старых, так и от новых версий Chrome и Edge.

  2. Шаг 3 (начать позже): После того, как все или большинство ваших пользователей обновятся до более поздних версий Chrome или Edge (96 и выше), удалите Report-To (v0) и оставьте только Reporting-Endpoints . Сохраните report-uri , чтобы получать отчеты только для браузеров, которые его поддерживают.

Примеры кода для этих шагов см. в разделе «Миграция отчетов CSP» .

Миграция: пример кода

Обзор

Если вы используете устаревший API отчетов (v0) для получения отчетов о нарушениях для COOP (заголовок Cross-Origin-Opener-Policy ), COEP (заголовок Cross-Origin-Embedder-Policy ) или политики документа (заголовок Document-Policy ), вам не нужно изменять сами заголовки этих политик при переходе на API отчетов версии 1. Вам необходимо перейти с устаревшего заголовка Report-To на новый заголовок Reporting-Endpoints .

Если вы используете устаревший API отчетов (v0) для получения отчетов о нарушениях CSP (заголовок Content-Security-Policy ), вам может потребоваться изменить заголовок Content-Security-Policy в рамках миграции на новый API отчетов (v1).

Базовая миграция

Устаревший код (с версией v0)
Report-To: { group: "main-endpoint", "endpoints": [ { "url": "https://reports.example/main" }] }, { group: "default-endpoint", "endpoints": [ { "url": "https://reports.example/default" }] }
Новый код (код перехода с версией v0 параллельно с версией v1)
Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default"
Report-To: { group: "main-endpoint", "max_age": 86400, "endpoints": [ { "url": "https://reports.example/main" }] }, { group: "default-endpoint", "max_age": 86400, "endpoints": [ { "url": "https://reports.example/default" }] }

Если на вашем сайте уже есть функция создания отчетов, используйте Report-To только временно (пока не обновится большинство браузеров Chrome и Edge), чтобы избежать потери отчетов.

Если вам необходима функция регистрации сетевых ошибок, используйте Report-To до тех пор, пока не появится замена для регистрации сетевых ошибок .

Новый код (только для версии 1)
Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default"

Вот как может выглядеть ваш код в будущем, когда большинство клиентов Chrome и Edge будут обновлены и начнут поддерживать API версии 1.

Обратите внимание, что в версии 1 вы по-прежнему можете отправлять отчеты определенных типов на определенные конечные точки . Однако для каждой конечной точки может быть только один URL-адрес.

Просмотр всех страниц

Устаревший код (с версией v0), например, с использованием Express.
app.get("/", (request, response) => {
  response.set("Report-To", )
  response.render(...)
});
app.get("/page1", (request, response) => {
  response.render(...)
});

В версии v0 можно задавать конечные точки для отчетов только для некоторых ответов. Другие документы (страницы) на этом источнике автоматически используют эти общие конечные точки. В данном случае конечные точки, заданные для "/" используются для всех ответов, например, для page1 .

Новый код (с версией 1), например, с использованием Express.
// Use a middleware to set the reporting endpoint(s) for *all* requests.
app.use(function(request, response, next) {
  response.set("Reporting-Endpoints", );
  next();
});

app.get("/", (request, response) => {
  response.render(...)
});

app.get("/page1", (request, response) => {
  response.render(...)
});

В версии 1 необходимо устанавливать заголовок Reporting-Endpoints во всех ответах, которые могут генерировать отчеты.

Миграция отчетов CSP

Устаревший код, содержащий только report-uri.
Content-Security-Policy: ...; report-uri https://reports.example/main

Использование только report-uri больше не рекомендуется . Если ваш код выглядит так, как показано выше, выполните миграцию. См. новые примеры кода ниже (выделены зеленым).

Улучшенный устаревший код с использованием report-uri и директивы report-to с заголовком Report-To (v0).
Content-Security-Policy: ...; report-uri https://reports.example/main; report-to main-endpoint
Report-To: main-endpoint="https://reports.example/main"

Это лучше: в этом коде используется report-to, более новая замена report-uri. При этом report-uri сохраняется для обратной совместимости; некоторые браузеры не поддерживают report-to но поддерживают report-uri .

Тем не менее, это можно улучшить: в этом коде используется Reporting API v0 (заголовок Report-To ). Перейдите на v1: см. примеры «Нового кода» ниже (выделены зеленым).

Новый код с директивой report-uri и директивой report-to, а также заголовком Reporting-Endpoints (v1).
Content-Security-Policy: ...; report-uri https://reports.example/main; report-to main-endpoint
Reporting-Endpoints: main-endpoint="https://reports.example/main"
Report-To: ...

Сохраняйте директиву report-uri вместе с директивой report-to до тех пор, пока директива report-to не будет поддерживаться во всех браузерах. См. таблицу совместимости браузеров .

Временно оставьте Report-To рядом с Reporting-Endpoints . Как только большинство посетителей Chrome и Edge обновятся до версий браузера 96 и выше, удалите Report-To .

Дополнительная информация

Выражаю огромную благодарность Яну Клелланду, Эйдзи Китамуре и Милице Михайловиа за их отзывы и предложения по этой статье.