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 evitar acesso de script síncrono 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 receber os próprios recursos separados, como um 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 marcaram como valendo prototipagem e tem um preliminar positivo da recepção do 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 em todos os seus usuários hoje. Os navegadores que não o entendem, a ignorarão. E, como as páginas os clusters de agente com origin-key podem, na verdade, fazer menos coisas do que os com site-key (os padrão), não há problema de interoperabilidade com 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 outro origin. Por exemplo, uma página hospedada em https://a.example está em um 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. No antigo dias, embora origens separadas não pudessem acessar os dados uma da outra, elas ainda compartilham recursos como linhas de execução do sistema operacional, processos e alocação de memória. Isso significava que, se uma guia estava lenta, isso tornaria todas as outras guias mais lentas. Ou, se uma guia usa muita memória, ela travaria todo o navegador.

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

Essas heurísticas não são perfeitas. E elas têm uma limitação importante: como não há exceções à política de mesma origem que permitem subdomínios como https://sub.a.example e https://a.example para se comunicarem entre si, os navegadores não podem separar automaticamente subdomínios de uns aos outros.

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

Essa separação por aceitação permite que os navegadores deem a esses novos clusters de agente com origin-key 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 agendadas em linhas de execução separadas. Ao adicionar o parâmetro Origin-Agent-Cluster à sua página, você indica ao navegador que a página se beneficiar 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 o mesmo site páginas de origem cruzada que estavam disponíveis anteriormente. Especificamente, faça o seguinte:

  • Não é mais possível definir document.domain Esta é uma que normalmente permite que páginas de origem cruzada no mesmo site acessem de forma síncrona cada do DOM de outros, mas está desativado em clusters de agente com origin-key.

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

  • (somente no Chrome) Não é mais possível enviar SharedArrayBuffer ou WebAssembly.Memory a 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. Por exemplo, 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 incorpora https://chat.example.com iframes, origin-key O https://mail.example.com/ garante que o código escrito pela equipe de chat não possa acidentalmente interferir no código escrito pela equipe de e-mail e pode sugerir ao navegador para fornecer processos para programá-los de maneira independente e diminuir o impacto no desempenho uns sobre os outros.

  • Esperam serem incorporadas em páginas do mesmo site com origens diferentes, mas sabem que são pode usar muitos recursos. Por exemplo, se https://customerservicewidget.example.com espera usar muitos recursos para bate-papo por vídeo e serão incorporados em várias origens ao longo https://*.example.com, a equipe que mantém esse widget pode usar a Origin-Agent-Cluster para tentar diminuir o impacto no desempenho dos embedders.

Além disso, você também precisa garantir que não tem problema em desativar o recurso raramente usado recursos de comunicação entre origens e que seu site usa recursos HTTPS.

Mas, no fim das contas, são apenas diretrizes. Se os clusters de agente com origin-key vão ajudar seu site ou não é mais bem determinado por medições. Em particular, convém medir suas Métricas da Web e, possivelmente, sua memória use, para conferir o impacto da origin-key. (Uso da memória em particular é uma preocupação potencial, pois aumentar o 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 pelo cabeçalho Origin-Agent-Cluster está relacionada, mas separada isolamento de origem cruzada via Cross-Origin-Opener-Policy e Cabeçalhos Cross-Origin-Embedder-Policy.

O isolamento de origem cruzada também desativa o recurso de origem cruzada no mesmo site recursos de comunicação, como no 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 dica para o navegador modificar sua heurística de alocação de recursos. Por isso, você ainda deve considerar aplicando o cabeçalho Origin-Agent-Cluster e avaliando os resultados, mesmo em páginas já isoladas 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:

Origin-Agent-Cluster: ?1

O valor de ?1 é o valor estruturado, Sintaxe de cabeçalho para um true booleano .

É importante enviar esse cabeçalho em todas as respostas da sua origem, não apenas em algumas páginas. Caso contrário, você pode obter resultados inconsistentes, em que o navegador "se lembra" uma combinação de origin-key solicitação e, por isso, a origem das chaves é mesmo em páginas que não a pedem. Ou vice-versa: se a primeira página quando um usuário visita não tem o cabeçalho, o navegador se lembra de que sua origem não quer precisa ter origin-key e ignorar o cabeçalho em páginas subsequentes.

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

A razão para essa "memória" é garantir a consistência da codificação de uma origem. Se algumas páginas de uma origem tiverem origin-key, enquanto outras não, você poderia ter duas páginas de mesma origem que foram colocados em clusters de agentes diferentes e, portanto, não podiam se comunicar entre eles. Isso seria muito estranhos, tanto para os desenvolvedores Web quanto para os componentes internos do navegador. A especificação para Origin-Agent-Cluster ignora o cabeçalho se ele for inconsistente com o anterior vista para uma determinada origem. No Chrome, isso vai resultar em um aviso no console.

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

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

Para verificar se o cabeçalho Origin-Agent-Cluster foi aplicado, use o JavaScript propriedade window.originAgentCluster. Ele será true nos casos em que o cabeçalho (ou outros mecanismos, como o isolamento de origem cruzada) causaram o origin-key; false quando 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 seu servidor corretamente.

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

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

O uso de um cluster de agente com origin-key isola sua origem do acesso síncrono dos páginas de origem cruzada no mesmo site, isso não garante 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 Spectre:

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

  • O 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 poderia fazer isso usando tecnologias de isolamento diferentes dos processos. Por exemplo, o Chrome é explorando usando linhas de execução em vez de processos para esse tipo de isolamento de desempenho.

  • O usuário ou o código em execução em um site diferente já pode ter navegado para uma página com site-key. na origem, o que faz com que a garantia de consistência entre em ação, e a 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 forma de ajudar o navegador a priorizar a alocação de recursos, insinuando que seu origem se beneficiaria de recursos dedicados (e que você está disposto a abrir mão de certas recursos em troca).

Feedback

A equipe do Chrome adoraria saber se você está usando ou pensando em usar a Origin-Agent-Cluster cabeçalho. Seu interesse e apoio públicos nos ajudam a priorizar recursos e mostrar outros aos fornecedores de navegador o quanto eles são importantes. Tweet em @ChromiumDev e conte suas ideias e experiências para o Chrome DevRel.

Se você tiver mais dúvidas sobre a especificação ou os detalhes de como o recurso funciona, envie um problema no repositório padrão de HTML do GitHub (link em inglês). E se você encontrar problemas com a implementação do Chrome, registre 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: