Como solicitar o isolamento de desempenho com o cabeçalho Origin-Agent-Cluster

Um novo cabeçalho de resposta HTTP para limitar scripts em todo o domínio e solicitar recursos dedicados do navegador.

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster é um novo cabeçalho de resposta HTTP que instrui o navegador a impedir o acesso a scripts síncronos entre páginas de origem cruzada no mesmo site. Os navegadores também podem usar Origin-Agent-Cluster como uma dica de que sua origem precisa ter os próprios recursos separados, como um processo dedicado.

Compatibilidade com navegadores

No momento, o cabeçalho Origin-Agent-Cluster só é implementado a partir do Chrome 88. Ele foi projetado em estreita colaboração com representantes do Mozilla Firefox, que o classificaram como aproveitando um protótipo, e recebeu uma recepção positiva preliminar de representantes do WebKit, o mecanismo de navegação usado pelo Safari.

Enquanto isso, não há problema em implantar o cabeçalho Origin-Agent-Cluster para todos os seus usuários atualmente. Os navegadores que não o entendem, a ignorarão. Além disso, como as páginas nos clusters de agente com origin-key podem fazer menos coisas do que as com site-key (o padrão), não há problema de interoperabilidade com o que se preocupar.

Por que os navegadores não podem separar automaticamente origens do mesmo site

A Web é baseada na política de mesma origem, que é um recurso de segurança que restringe como documentos e scripts podem interagir com recursos de outra origem. Por exemplo, uma página hospedada em https://a.example tem uma origem diferente de uma em https://b.example ou uma em https://sub.a.example.

Em segundo plano, os navegadores usam a separação que as origens oferecem de diferentes maneiras. Antigamente, embora origens separadas não pudessem acessar os dados umas das outras, elas ainda compartilhavam recursos como linhas de execução do sistema operacional, processos e alocação de memória. Isso significava que, se uma guia fosse lenta, todas as outras seriam ficariam mais lentas. Ou, se uma guia usasse muita memória, poderia travar todo o navegador.

Hoje em dia, os navegadores estão mais sofisticados e tentam separar origens diferentes em processos diferentes. A maneira exata como isso funciona varia de acordo com o navegador: a maioria dos navegadores tem algum nível de separação entre as guias, mas iframes diferentes dentro de uma única guia podem compartilhar um processo. Como os processos têm um certo overhead de memória, eles usam heurística para evitar a geração de excessos: por exemplo, o Firefox tem um limite de processo configurável pelo usuário, e o Chrome varia o comportamento entre computadores (onde a memória é mais abundante) e dispositivos móveis (quando é escassa).

Essas heurísticas não são perfeitas. Além disso, eles têm uma limitação importante: como há exceções à política de mesma origem que permitem que subdomínios como https://sub.a.example e https://a.example se comuniquem entre si, os navegadores não podem segregar automaticamente os subdomínios.

Esse comportamento padrão é chamado de "clusters de agente com site-key", ou seja, o navegador agrupa páginas com base no site. O novo cabeçalho Origin-Agent-Cluster solicita que o navegador altere esse comportamento padrão de uma determinada página, colocando-o em um cluster de agente com chave origin para que ele seja agrupado somente com outras páginas que tenham exatamente a mesma origem. Especificamente, páginas de origem cruzada do mesmo site serão excluídas do cluster do agente.

Essa separação por aceitação permite que os navegadores forneçam a esses novos clusters de agente com origin-key os próprios recursos dedicados, que não são combinados com os de outras origens. Por exemplo, essas páginas podem ter um processo próprio ou ser programadas em linhas de execução separadas. Ao adicionar o cabeçalho Origin-Agent-Cluster à sua página, você indica ao navegador que a página se beneficiaria desses recursos dedicados.

No entanto, para realizar a separação e ter esses benefícios, o navegador precisa desativar alguns recursos legados.

O que as páginas com origin-key não podem fazer

Quando sua página está em um cluster de agente com origin-key, você perde a capacidade de se comunicar com páginas de origem cruzada no mesmo site que estavam disponíveis anteriormente. Especificamente, faça o seguinte:

  • Não é mais possível definir document.domain. Esse é um recurso legado que normalmente permite que páginas de origem cruzada do mesmo site acessem de forma síncrona o DOM umas das outras, mas ele é desativado em clusters de agente com origin-key.

  • Não é mais possível enviar objetos WebAssembly.Module para outras páginas de origem cruzada no mesmo site via postMessage().

  • (Somente no Chrome) Não é mais possível enviar objetos SharedArrayBuffer ou WebAssembly.Memory para outras páginas de origem cruzada no mesmo site.

Quando usar clusters de agente com origin-key

As origens que mais se beneficiam do cabeçalho Origin-Agent-Cluster são as que:

  • Atingir o melhor com recursos próprios dedicados sempre que possível. Os exemplos incluem jogos que exigem alto desempenho, sites de videoconferência ou apps de criação de multimídia.

  • Contém iframes com uso intensivo de recursos de origens diferentes, mas do mesmo site. Por exemplo, se https://mail.example.com incorporar iframes https://chat.example.com, a chave de origem https://mail.example.com/ vai garantir que o código escrito pela equipe de chat não interfira acidentalmente no código escrito pela equipe de e-mail e poderá sugerir ao navegador que forneça processos separados para programá-los de maneira independente e diminuir o impacto no desempenho uns sobre os outros.

  • Espera-se serem incorporadas em páginas de origem diferente do mesmo site, mas sabem que demandam muitos recursos. Por exemplo, se https://customerservicewidget.example.com pretende usar muitos recursos para chat por vídeo e será incorporado em várias origens ao longo de https://*.example.com, a equipe que mantém esse widget pode usar o cabeçalho Origin-Agent-Cluster para tentar diminuir o impacto no desempenho nos incorporadores.

Além disso, também é necessário confirmar se você concorda em desativar os recursos de comunicação de origem cruzada raramente usados mencionados acima e se o site está usando HTTPS.

Mas, no fim das contas, são apenas diretrizes. Use medições para determinar se os clusters de agente com origin-key vão ajudar seu site ou não. Em particular, é importante medir suas Web Vitals e, potencialmente, o uso de memória, para verificar o impacto da origin-key. O uso da memória em particular é uma possível preocupação, já que o aumento do número de processos em jogo pode causar mais sobrecarga de memória por processo. Você não deve apenas lançar a origin-key e torcer pelo melhor.

Como isso está relacionado ao isolamento de origem cruzada?

A chave de origem de clusters de agente por meio do cabeçalho Origin-Agent-Cluster está relacionada, mas separado, do isolamento de origem cruzada pelos cabeçalhos Cross-Origin-Opener-Policy e Cross-Origin-Embedder-Policy.

Qualquer site com isolamento de origem cruzada também desativará os mesmos recursos de comunicação de origem cruzada no mesmo site usados com o cabeçalho Origin-Agent-Cluster. No entanto, o cabeçalho Origin-Agent-Cluster ainda pode ser útil além do isolamento de origem cruzada, como uma dica extra para que o navegador modifique a heurística de alocação de recursos. Portanto, considere aplicar o cabeçalho Origin-Agent-Cluster e avaliar os resultados, mesmo em páginas que já têm isolamento de origem cruzada.

Como usar o cabeçalho Origin-Agent-Cluster

Para usar o cabeçalho Origin-Agent-Cluster, configure seu servidor da Web para enviar o seguinte cabeçalho de resposta HTTP:

Origin-Agent-Cluster: ?1

O valor de ?1 é a sintaxe do cabeçalho estruturado para um valor booleano true.

É importante enviar esse cabeçalho em todas as respostas da sua origem, não apenas em algumas páginas. Caso contrário, você poderá ter resultados inconsistentes, em que o navegador "se lembra" de ver uma solicitação de origin-key e, portanto, usa chaves de origem mesmo em páginas que não a solicitam. Ou vice-versa: se a primeira página que o usuário visita não tiver o cabeçalho, o navegador vai se lembrar de que sua origem não quer ser codificada na origem e vai ignorar o cabeçalho nas páginas seguintes.

Por que o navegador nem sempre respeita o cabeçalho?

O motivo dessa "memória" é garantir a consistência da codificação de uma origem. Se algumas páginas em uma origem tiverem origin-key, enquanto outras não, seria possível ter duas páginas de mesma origem que foram colocadas em clusters de agente diferentes e, portanto, não teriam permissão para se comunicar entre si. Isso seria muito estranho, tanto para desenvolvedores Web quanto para os componentes internos do navegador. Portanto, a especificação para Origin-Agent-Cluster ignora o cabeçalho se ele for inconsistente com o que foi visto anteriormente para uma determinada origem. No Chrome, isso vai resultar em um aviso no console.

Essa consistência tem o escopo definido para um grupo de contexto de navegação, que é um grupo de guias, janelas ou iframes que podem se comunicar entre si por mecanismos como window.opener, frames[0] ou window.parent. Isso significa que, depois que a origem ou o site-key de uma origem for resolvida (pelo navegador vendo ou não o cabeçalho), a alteração exigirá a abertura de uma guia totalmente nova, sem nenhuma conexão com a antiga.

Esses detalhes podem ser importantes para testar o cabeçalho Origin-Agent-Cluster. Ao adicioná-la ao seu site pela primeira vez, apenas recarregar a página não funcionará. Você precisará fechar a guia e abrir uma nova.

Para verificar se o cabeçalho Origin-Agent-Cluster foi aplicado, use a propriedade JavaScript window.originAgentCluster. Ela será true nos casos em que o cabeçalho (ou outros mecanismos, como o isolamento de origem cruzada) causaram o origin-key. false quando isso não aconteceu e undefined em navegadores que não implementam o cabeçalho Origin-Agent-Cluster. O registro desses dados na sua plataforma de análise pode fornecer uma verificação valiosa de que você configurou o servidor corretamente.

Por fim, observe que o cabeçalho Origin-Agent-Cluster só funciona em contextos seguros, ou seja, em páginas HTTPS ou em http://localhost. Páginas HTTP que não são de localhost não oferecem suporte a clusters de agente com origin-key.

O Origin-key não é um recurso de segurança

Embora o uso de um cluster de agente com origin-key isole sua origem do acesso síncrono de páginas de origem cruzada no mesmo site, ele não fornece a proteção de cabeçalhos relacionados à segurança, como Cross-Origin-Resource-Policy e Cross-Origin-Opener-Policy. Em particular, ele não é uma proteção confiável contra ataques de canal lateral como o Spectre.

Isso pode ser um pouco surpreendente, porque a chave de origem às vezes pode fazer com que sua origem tenha o próprio processo, e processos separados são uma defesa importante contra ataques de canal lateral. Mas lembre-se de que o cabeçalho Origin-Agent-Cluster é apenas uma dica a esse respeito. O navegador não tem a obrigação de fornecer um processo separado à origem e talvez não faça isso por vários motivos:

  • Um navegador pode não implementar a tecnologia para fazer isso. Por exemplo, atualmente o Safari e o Firefox podem colocar guias separadas nos próprios processos, mas ainda não podem fazer isso para iframes.

  • O navegador pode decidir que não vale a sobrecarga de um processo separado. Por exemplo, em dispositivos Android com pouca memória ou no Android WebView, o Chrome usa o mínimo de processos possível.

  • O navegador pode respeitar a solicitação indicada pelo cabeçalho Origin-Agent-Cluster, mas pode fazer isso usando uma tecnologia de isolamento diferente dos processos. Por exemplo, o Chrome está explorando usando linhas de execução em vez de processos para esse tipo de isolamento de desempenho.

  • É possível que o usuário ou o código em execução em outro site já tenha navegado para uma página codificada no site na sua origem, fazendo com que a garantia de consistência seja ativada e o cabeçalho Origin-Agent-Cluster seja totalmente ignorado.

Por esses motivos, é importante não pensar nos clusters de agente com origin-key como um recurso de segurança. Em vez disso, é uma maneira de ajudar o navegador a priorizar a alocação de recursos, sugerindo que sua origem se beneficiaria de recursos dedicados e que você está disposto a abrir mão de certos recursos em troca.

Feedback

A equipe do Chrome adoraria saber se você está usando (ou considerando usar) o cabeçalho Origin-Agent-Cluster. Seu interesse público e apoio nos ajudam a priorizar recursos e mostrar a outros fornecedores de navegadores a importância deles. Crie um tweet em @ChromiumDev e deixe o Chrome DevRel conhecer suas ideias e experiências.

Se você tiver mais dúvidas sobre a especificação ou os detalhes de como o recurso funciona, registre um problema no repositório padrão de HTML do GitHub (em inglês). Se você encontrar problemas com a implementação do Chrome, poderá registrar um bug em new.crbug.com com o campo "Componentes" definido como Internals>Sandbox>SiteIsolation.

Saiba mais

Para saber mais sobre clusters de agente com origin-key, confira os detalhes nestes links: