Ограничение совместного использования модулей Wasm одним и тем же источником

Совместное использование модуля WebAssembly в средах одного сайта будет ограничено одним и тем же источником.

Совместное использование модуля WebAssembly (Wasm) в средах с одним и тем же сайтом, но с несколькими источниками, будет прекращено, чтобы позволить кластерам агентов ограничиваться источниками в долгосрочной перспективе. Разработчики, использующие модули Wasm таким образом, должны обязательно создать экземпляры этих модулей в одном и том же источнике, чтобы продолжить их использование после Chrome 95.

Что такое модули Wasm и как они работают

Программы WebAssembly организованы в модули, которые являются единицами развертывания, загрузки и компиляции.

В следующем примере кода модуль Wasm, импортированный из https://iframe.site.example используется совместно с https://main.site.example через postMessage() . Обратите внимание, что эти домены относятся к одному и тому же сайту, но имеют перекрестное происхождение .

Модуль Wasm на https://iframe.site.example :

(async () => {
  const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
  iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();

Начиная с Chrome 95, отправитель и получатель должны иметь одно и то же происхождение. В приведенном выше случае https://iframe.site.example должен быть https://main.site.example или наоборот.

Зачем это нужно

Chrome внутренне обрабатывает различные документы, вкладки и фреймы в кластерах агентов с ключом сайта. Это означает, что документы одного и того же сайта обрабатываются в рамках одного и того же процесса (как именно это работает, зависит от браузера). Недавно Chrome начал обрабатывать их в более детальных единицах: origins. Мы называем это кластерами агентов с исходным ключом . Однако, поскольку это требует больших затрат ресурсов, кластеры агентов с ключом происхождения эвристически применялись только к ограниченным веб-сайтам.

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

  • (Только для Chrome) Вы больше не можете отправлять объекты SharedArrayBuffer или WebAssembly.Memory на другие страницы одного и того же сайта с перекрестным происхождением. Это уже существует, начиная с Chrome 92 .
  • Вы больше не можете отправлять объекты WebAssembly.Module на другие страницы одного и того же сайта с перекрестным происхождением через postMessage() . Более подробно это изменение описано ниже.
  • Вы больше не можете устанавливать document.domain . Это устаревшая функция, которая обычно позволяет страницам одного и того же сайта с несколькими источниками синхронно получать доступ к DOM друг друга, но в кластерах агентов с исходным ключом она отключена.

Учитывая все вышеперечисленные изменения, Chrome перейдет на использование кластеров агентов с исходным ключом по умолчанию.

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

Следующие шаги и ресурсы

Чтобы Chrome по умолчанию работал с кластерами агентов с исходным ключом, мы сделаем document.domain доступным только для чтения. Команда Chrome планирует внедрить это изменение где-то в 2022 году.

Фото Маркуса Винклера на Unsplash