Um guia para ativar o isolamento de origem cruzada

O isolamento de origem cruzada permite que uma página da Web use recursos poderosos, como SharedArrayBuffer. Este artigo explica como ativar o isolamento de origem cruzada no seu site.

Neste guia, mostramos como ativar o isolamento entre origens. O isolamento entre origens é necessário se você quiser usar SharedArrayBuffer, performance.measureUserAgentSpecificMemory() ou timer de alta resolução com maior precisão.

Se você pretende ativar o isolamento entre origens, avalie o impacto que isso vai ter em outros recursos entre origens no seu site, como posicionamentos de anúncios.

Se você não sabe em que parte do seu site um SharedArrayBuffer é usado, há duas maneiras de descobrir:

  • Usar o Chrome DevTools
  • (Avançado) Como usar os relatórios de suspensão de uso

Se você já sabe onde está usando SharedArrayBuffer, pule para Analisar o impacto do isolamento de origem cruzada.

Como usar o Chrome DevTools

O Chrome DevTools permite que os desenvolvedores inspecionem sites.

  1. Abra o Chrome DevTools na página que você suspeita que esteja usando SharedArrayBuffer.
  2. Selecione o painel Console.
  3. Se a página estiver usando SharedArrayBuffer, a seguinte mensagem será exibida:
    [Deprecation] SharedArrayBuffer will require cross-origin isolation as of M92, around May 2021. See https://developer.chrome.com/blog/enabling-shared-array-buffer/ for more details. common-bundle.js:535
  4. O nome do arquivo e o número da linha no final da mensagem (por exemplo, common-bundle.js:535) indicam de onde vem SharedArrayBuffer. Se for uma biblioteca de terceiros, entre em contato com o desenvolvedor para corrigir o problema. Se ele estiver implementado como parte do seu site, siga as instruções abaixo para ativar o isolamento entre origens.
Aviso do console do DevTools quando o SharedArrayBuffer é usado sem isolamento de origem cruzada
Aviso do Console do DevToools quando SharedArrayBuffer é usado sem isolamento de origem cruzada.

(Avançado) Como usar os relatórios de suspensão de uso

Alguns navegadores têm uma funcionalidade de relatórios de APIs descontinuadas para um endpoint especificado.

  1. Configure um servidor de relatórios de descontinuação e receba o URL do relatório. Para isso, use um serviço público ou crie um por conta própria.
  2. Usando o URL, defina o seguinte cabeçalho HTTP para páginas que podem estar exibindo SharedArrayBuffer.
    Report-To: {"group":"default","max_age":86400,"endpoints":[{"url":"THE_DEPRECATION_ENDPOINT_URL"}]}
  3. Quando o cabeçalho começar a ser propagado, o endpoint que você registrou vai começar a coletar relatórios de descontinuação.

Confira um exemplo de implementação aqui: https://cross-origin-isolation.glitch.me.

Analisar o impacto do isolamento de origem cruzada

Não seria ótimo se você pudesse avaliar o impacto que ativar o isolamento entre origens teria no seu site sem quebrar nada? Os cabeçalhos HTTP Cross-Origin-Opener-Policy-Report-Only e Cross-Origin-Embedder-Policy-Report-Only permitem fazer exatamente isso.

  1. Defina Cross-Origin-Opener-Policy-Report-Only: same-origin no documento de nível superior. Como o nome indica, esse cabeçalho só envia relatórios sobre o impacto que o COOP: same-origin teria no seu site. Ele não desativa a comunicação com janelas pop-up.
  2. Configure os relatórios e um servidor da Web para receber e salvar os relatórios.
  3. Defina Cross-Origin-Embedder-Policy-Report-Only: require-corp no documento de nível superior. Novamente, esse cabeçalho permite ver o impacto da ativação de COEP: require-corp sem afetar o funcionamento do site. É possível configurar esse cabeçalho para enviar relatórios ao mesmo servidor de relatórios que você configurou na etapa anterior.

Reduzir o impacto do isolamento de origem cruzada

Depois de determinar quais recursos serão afetados pelo isolamento de origem cruzada, confira estas diretrizes gerais sobre como ativar esses recursos de origem cruzada:

  1. Em recursos entre origens, como imagens, scripts, folhas de estilo, iframes e outros, defina o cabeçalho Cross-Origin-Resource-Policy: cross-origin. Em recursos do mesmo site, defina o cabeçalho Cross-Origin-Resource-Policy: same-site.
  2. Para recursos que podem ser carregados usando o CORS, verifique se ele está ativado definindo o atributo crossorigin na tag HTML (por exemplo, <img src="example.jpg" crossorigin>). Para a solicitação de busca do JavaScript, verifique se request.mode está definido como cors.
  3. Se você quiser usar recursos avançados, como SharedArrayBuffer em um iframe carregado, anexe allow="cross-origin-isolated" ao <iframe>.
  4. Se os recursos de origem cruzada carregados em iframes ou scripts worker envolverem outra camada de iframes ou scripts worker, aplique recursivamente as etapas descritas nesta seção antes de prosseguir.
  5. Depois de confirmar que todos os recursos entre origens estão ativados, defina o cabeçalho Cross-Origin-Embedder-Policy: require-corp em iframes e scripts de worker. Isso é necessário independentemente de origem única ou entre origens.
  6. Verifique se não há janelas pop-up entre origens que exigem comunicação por postMessage(). Não é possível mantê-los funcionando quando o isolamento entre origens diferentes está ativado. É possível mover a comunicação para outro documento que não seja isolado de origem cruzada ou usar um método de comunicação diferente (por exemplo, solicitações HTTP).

Ativar o isolamento entre origens

Depois de mitigar o impacto com o isolamento de origem cruzada, siga estas diretrizes gerais para ativar o isolamento de origem cruzada:

  1. Defina o cabeçalho Cross-Origin-Opener-Policy: same-origin no documento de nível superior. Se você definiu Cross-Origin-Opener-Policy-Report-Only: same-origin, substitua-a. Isso bloqueia a comunicação entre o documento de nível superior e as janelas pop-up.
  2. Defina o cabeçalho Cross-Origin-Embedder-Policy: require-corp no documento de nível superior. Se você definiu Cross-Origin-Embedder-Policy-Report-Only: require-corp, substitua-o. Isso vai bloquear o carregamento de recursos entre origens que não foram ativados.
  3. Verifique se self.crossOriginIsolated retorna true no console para verificar se a página está isolada entre origens.

Recursos