Запрос изоляции производительности с помощью заголовка Origin-Agent-Cluster

Новый заголовок ответа HTTP, позволяющий ограничить выполнение сценариев на уровне домена и запросить выделенные ресурсы из браузера.

Доменик Деникола
Domenic Denicola

Origin-Agent-Cluster — это новый заголовок HTTP-ответа, который инструктирует браузер предотвратить синхронный доступ к сценариям между страницами одного и того же сайта с разными источниками. Браузеры также могут использовать Origin-Agent-Cluster как намек на то, что ваш источник должен получить свои собственные отдельные ресурсы, например выделенный процесс.

Совместимость с браузером

В настоящее время заголовок Origin-Agent-Cluster реализован только в Chrome 88 и более поздних версиях. Он был разработан в тесном сотрудничестве с представителями Mozilla Firefox, которые отметили его как достойный прототипирования , и получил предварительные положительные отзывы от представителей WebKit, браузерного движка, используемого Safari.

Но в то же время сегодня нет проблем с развертыванием заголовка Origin-Agent-Cluster для всех ваших пользователей. Браузеры, которые этого не понимают, просто проигнорируют это. А поскольку страницы в кластерах агентов с исходным ключом на самом деле могут выполнять меньше действий , чем страницы с ключами сайта (по умолчанию), нет проблем с совместимостью, о которых стоит беспокоиться.

Почему браузеры не могут автоматически разделять источники с одного и того же сайта

Интернет построен на основе политики одного и того же источника , которая представляет собой функцию безопасности, ограничивающую взаимодействие документов и сценариев с ресурсами из другого источника . Например, страница, размещенная по адресу https://a.example имеет другое происхождение, отличное от страницы https://b.example или https://sub.a.example .

За кулисами браузеры по-разному используют разделение, обеспечиваемое источниками. В прежние времена, даже если отдельные источники не могли получить доступ к данным друг друга, они все равно использовали общие ресурсы, такие как потоки операционной системы, процессы и распределение памяти. Это означало, что если одна вкладка работала медленно, это замедляло бы работу всех остальных вкладок. Или, если одна вкладка использовала слишком много памяти, это привело бы к сбою всего браузера.

В наши дни браузеры стали более сложными и пытаются разделить разные источники на разные процессы. Как именно это работает, зависит от браузера: большинство браузеров имеют некоторый уровень разделения вкладок, но разные iframe внутри одной вкладки могут использовать общий процесс. А поскольку процессы требуют определенных затрат памяти, они используют эвристику, чтобы избежать создания слишком большого количества процессов: например, Firefox имеет настраиваемый пользователем лимит процессов , а Chrome меняет свое поведение между настольными компьютерами (где памяти больше) и мобильными устройствами (где ее больше). скудно).

Эти эвристики не идеальны. И они страдают от важного ограничения: поскольку из политики одного и того же происхождения существуют исключения, которые позволяют поддоменам, таким как https://sub.a.example и https://a.example , взаимодействовать друг с другом, браузеры не могут автоматически разделять поддомены. друг от друга.

Такое поведение по умолчанию называется «кластерами агентов с ключом сайта»: то есть страницы браузера группируются на основе их сайта . Новый заголовок Origin-Agent-Cluster просит браузер изменить это поведение по умолчанию для данной страницы, поместив ее в кластер агентов с ключом происхождения , чтобы он группировался только с другими страницами, имеющими точно такое же происхождение. В частности, из кластера агентов будут исключены страницы одного и того же сайта с перекрестным происхождением.

Такое разделение по согласию позволяет браузерам предоставлять этим новым кластерам агентов с ключом источника свои собственные выделенные ресурсы, которые не объединяются с ресурсами других источников. Например, такие страницы могут иметь собственный процесс или быть запланированы для отдельных потоков. Добавляя заголовок Origin-Agent-Cluster на свою страницу, вы указываете браузеру, что страница выиграет от таких выделенных ресурсов.

Однако, чтобы выполнить разделение и получить эти преимущества, браузеру необходимо отключить некоторые устаревшие функции.

Чего не могут делать страницы с исходным ключом

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

  • Вы больше не можете устанавливать document.domain . Это устаревшая функция, которая обычно позволяет страницам одного и того же сайта с несколькими источниками синхронно получать доступ к DOM друг друга, но в кластерах агентов с исходным ключом она отключена.

  • Вы больше не можете отправлять объекты WebAssembly.Module на другие страницы одного и того же сайта с перекрестным происхождением через postMessage() .

  • (Только для Chrome) Вы больше не можете отправлять объекты SharedArrayBuffer или WebAssembly.Memory на другие страницы одного и того же сайта с перекрестным происхождением.

Когда следует использовать кластеры агентов с ключом происхождения

Источники, которые больше всего выигрывают от заголовка Origin-Agent-Cluster это те, которые:

  • По возможности добивайтесь наилучших результатов, используя собственные выделенные ресурсы. Примеры включают требовательные к производительности игры, сайты видеоконференций или приложения для создания мультимедиа.

  • Содержит ресурсоемкие iframe, имеющие разное происхождение, но находящиеся на одном сайте. Например, если https://mail.example.com встраивает iframe https://chat.example.com , использование исходного кода https://mail.example.com/ гарантирует, что код, написанный командой чата, не сможет случайно помешать с кодом, написанным командой почты, и может намекнуть браузеру, что нужно предоставить им отдельные процессы, чтобы планировать их независимо и уменьшать их влияние на производительность друг друга.

  • Ожидайте, что их будут встраивать на страницы одного и того же сайта разного происхождения, но знайте, что они ресурсоемки. Например, если https://customerservicewidget.example.com планирует использовать много ресурсов для видеочата и будет встроен в различные источники по всему https://*.example.com , команда, обслуживающая этот виджет, может использовать Origin-Agent-Cluster -Заголовок Origin-Agent-Cluster , чтобы попытаться уменьшить их влияние на производительность при внедрении.

Кроме того, вам также необходимо убедиться, что вы согласны с отключением обсуждавшихся выше редко используемых функций связи между источниками и что ваш сайт использует HTTPS .

Но, в конце концов, это всего лишь рекомендации. Помогут ли кластеры агентов с ключом происхождения вашему сайту или нет, в конечном итоге лучше всего определить путем измерений. В частности, вам нужно измерить показатели веб-показателей и, возможно, использование памяти , чтобы увидеть, какое влияние оказывает кодирование источника. (Использование памяти, в частности, является потенциальной проблемой, поскольку увеличение количества задействованных процессов может привести к увеличению накладных расходов памяти для каждого процесса.) Не следует просто внедрять исходное кодирование и надеяться на лучшее.

Как это связано с изоляцией перекрестного происхождения?

Ввод ключей для кластеров агентов через заголовок Origin-Agent-Cluster связан с изоляцией между источниками через заголовки Cross-Origin-Opener-Policy и Cross-Origin-Embedder-Policy но отличается от нее.

Любой сайт, который изолирован от разных источников, также отключит те же функции связи между разными источниками , что и при использовании заголовка Origin-Agent-Cluster . Однако заголовок Origin-Agent-Cluster по-прежнему может быть полезен помимо изоляции между источниками в качестве дополнительной подсказки браузеру о необходимости изменить эвристику распределения ресурсов. Таким образом, вам все равно следует рассмотреть возможность применения заголовка Origin-Agent-Cluster и измерения результатов даже на страницах, которые уже изолированы между источниками.

Как использовать заголовок Origin-Agent-Cluster

Чтобы использовать заголовок Origin-Agent-Cluster , настройте свой веб-сервер для отправки следующего заголовка ответа HTTP:

Origin-Agent-Cluster: ?1

Значение ?1 представляет собой синтаксис структурированного заголовка для логического true значения.

Важно отправлять этот заголовок во все ответы от вашего источника, а не только на некоторые страницы. В противном случае вы можете получить противоречивые результаты, когда браузер «запоминает», что видел запрос на ввод исходного ключа, и поэтому он вводит исходные ключи даже на страницах, которые этого не запрашивают. Или наоборот: если первая страница, которую посещает пользователь, не имеет заголовка, то браузер запомнит, что ваш источник не хочет использовать ключ источника, и будет игнорировать заголовок на последующих страницах.

Почему браузер не всегда может учитывать заголовок?

Причиной этой «памяти» является обеспечение согласованности кодирования источника. Если некоторые страницы источника имели ключ источника, а другие — нет, то у вас могли быть две страницы одного происхождения, которые были помещены в разные кластеры агентов и, таким образом, им не разрешалось взаимодействовать друг с другом. Это было бы очень странно, как для веб-разработчиков, так и для внутренностей браузера. Таким образом, спецификация Origin-Agent-Cluster вместо этого игнорирует заголовок, если он не соответствует тому, что он ранее видел для данного источника. В Chrome это приведет к появлению предупреждения на консоли.

Эта согласованность ограничена группой контекста просмотра, которая представляет собой группу вкладок, окон или iframe, которые могут связываться друг с другом через такие механизмы, как window.opener , frames[0] или window.parent . Это означает, что после того, как ключ происхождения или сайта установлен (браузер либо видит, либо не видит заголовок), его изменение требует открытия совершенно новой вкладки, никак не связанной со старой. .

Эти детали могут быть важны для тестирования заголовка Origin-Agent-Cluster . При первом добавлении на свой сайт просто перезагрузить страницу не получится; вам нужно будет закрыть вкладку и открыть новую.

Чтобы проверить, применяется ли заголовок Origin-Agent-Cluster , используйте свойство JavaScript window.originAgentCluster . Это будет true в тех случаях, когда заголовок (или другие механизмы, такие как изоляция между источниками ) вызывают ввод ключей источника; false , когда это не так; и undefined в браузерах, которые не реализуют заголовок Origin-Agent-Cluster . Регистрация этих данных на вашей аналитической платформе может обеспечить ценную проверку правильности настройки вашего сервера.

Наконец, обратите внимание, что заголовок Origin-Agent-Cluster будет работать только в защищенных контекстах , то есть на страницах HTTPS или http://localhost . HTTP-страницы, не относящиеся к локальному хосту, не поддерживают кластеры агентов с исходным ключом.

Ключ происхождения не является функцией безопасности

Хотя использование кластера агентов с ключом источника изолирует ваш источник от синхронного доступа со страниц одного и того же сайта с несколькими источниками, оно не обеспечивает защиту связанных с безопасностью заголовков, таких как Cross-Origin-Resource-Policy и Cross-Origin-Opener-Policy . В частности, это не надежная защита от атак по побочным каналам, таких как Spectre .

Это может быть немного удивительно, поскольку использование ключей происхождения иногда может привести к тому, что ваш источник получит собственный процесс, а отдельные процессы являются важной защитой от атак по побочным каналам. Но помните, что заголовок Origin-Agent-Cluster — это лишь подсказка в этом отношении. Браузер не обязан выделять ваш источник в отдельный процесс, и он может не делать этого по ряду причин:

  • Браузер может не реализовать соответствующую технологию. Например, в настоящее время Safari и Firefox могут размещать отдельные вкладки в своих процессах, но пока не могут делать это для iframe.

  • Браузер может решить, что не стоит тратить время на отдельный процесс. Например, на устройствах Android с низким объемом памяти или в Android WebView Chrome использует как можно меньше процессов.

  • Браузер может захотеть уважать запрос, указанный в заголовке Origin-Agent-Cluster , но он может сделать это, используя другую технологию изоляции, чем процессы. Например, Chrome изучает возможность использования потоков вместо процессов для такого рода изоляции производительности.

  • Пользователь или код, работающий на другом сайте, возможно, уже перешел на страницу с ключом сайта в вашем источнике, что приводит к срабатыванию гарантии согласованности и полному игнорированию заголовка Origin-Agent-Cluster .

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

Обратная связь

Команда Chrome хотела бы услышать ваше мнение, используете ли вы или планируете использовать заголовок Origin-Agent-Cluster . Ваш общественный интерес и поддержка помогают нам расставлять приоритеты в функциях и показывать другим поставщикам браузеров, насколько они важны. Напишите в Твиттере @ChromiumDev и расскажите Chrome DevRel о своих мыслях и впечатлениях.

Если у вас есть дополнительные вопросы по спецификации или подробностям о том, как работает эта функция, вы можете сообщить о проблеме в репозитории HTML Standard GitHub . А если у вас возникнут какие-либо проблемы с реализацией Chrome, вы можете сообщить об ошибке на new.crbug.com , указав в поле «Компоненты» значение Internals>Sandbox>SiteIsolation .

Узнать больше

Чтобы узнать больше о кластерах агентов с исходным ключом, вы можете углубиться в подробности по этим ссылкам: