Um novo cabeçalho de resposta HTTP para limitar scripts em todo o domínio e solicitar recursos dedicados do navegador.
O Origin-Agent-Cluster
é um novo cabeçalho de resposta HTTP que instrui o navegador a impedir
o acesso síncrono de scripts entre páginas de origem cruzada do mesmo site. Os navegadores também podem usar
Origin-Agent-Cluster
como uma dica de que sua origem precisa ter recursos próprios e separados, como um
processo dedicado.
Compatibilidade com navegadores
Atualmente, o cabeçalho Origin-Agent-Cluster
só é implementado no Chrome 88 e versões mais recentes. Ele foi projetado em estreita colaboração com representantes do Mozilla Firefox que o marcaram como para prototipagem e tem uma recepção positiva preliminar de representantes do WebKit, o mecanismo de navegador usado pelo Safari.
Enquanto isso, não há problema em implantar o cabeçalho Origin-Agent-Cluster
para todos os seus
usuários hoje. Os navegadores que não o entendem, simplesmente o ignoram. Além disso, como as páginas em clusters de agente com origin-key podem fazer menos coisas do que as codificadas pelo site (o padrão), não há problema de interoperabilidade com que se preocupar.
Por que os navegadores não podem separar automaticamente as origens do mesmo site
A Web é criada com base 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
está em uma
origem diferente de uma em https://b.example
ou de uma em https://sub.a.example
.
Por trás de tudo, os navegadores usam a separação que as origens oferecem de diferentes maneiras. Antigamente, mesmo que 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 estivesse lenta, todas as outras ficavam lentas. Ou, se uma guia usasse muita memória, ela travava todo o navegador.
Atualmente, os navegadores são mais sofisticados e tentam separar origens diferentes em processos diferentes. A forma exata como isso funciona varia de acordo com o navegador: a maioria deles tem algum nível de separação entre guias, mas iframes diferentes em uma única guia podem compartilhar um processo. Como os processos têm uma sobrecarga de memória, eles usam heurísticas para evitar a geração de muitos dados. Por exemplo, o Firefox tem 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 é 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 separar automaticamente subdomínios
um do outro.
Esse comportamento padrão é chamado de "clusters de agente com site-key", ou seja, o navegador agrupa páginas com base
no site delas. O novo cabeçalho Origin-Agent-Cluster
solicita que o navegador altere esse comportamento padrão para uma determinada página, colocando-a em um cluster de agente com chave origin para que seja agrupado apenas com outras páginas que tenham exatamente a mesma origem. Especificamente, páginas de origem cruzada no mesmo site serão excluídas do cluster de agente.
Com essa separação, os navegadores podem dar 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 o próprio processo 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 fazer 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ê deixa de ter alguns recursos para 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 no mesmo site acessem de forma síncrona o DOM das outras, mas, em clusters de agente com origin-key, ele fica desativado.Não é mais possível enviar objetos
WebAssembly.Module
para outras páginas de origem cruzada no mesmo site viapostMessage()
.(Apenas no Chrome) Não é mais possível enviar objetos
SharedArrayBuffer
ouWebAssembly.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:
Ter o melhor desempenho com recursos próprios dedicados sempre que possível. Exemplos incluem jogos com alto desempenho, sites de videoconferência ou apps de criação multimídia.
Contém iframes com muitos recursos que são de origem diferente, mas no mesmo site. Por exemplo, se
https://mail.example.com
incorporar iframeshttps://chat.example.com
, o uso de origin-keyhttps://mail.example.com/
vai garantir que o código escrito pela equipe de chat não interfira acidentalmente com o da equipe de e-mail e pode sugerir ao navegador que ofereça processos separados para programá-los de maneira independente e diminuir o impacto deles no desempenho uns dos outros.Esperam-se incorporados em páginas de origem diferente, no mesmo site, mas sabem que consomem muitos recursos. Por exemplo, se
https://customerservicewidget.example.com
espera usar muitos recursos para chat por vídeo e será incorporado em várias origens emhttps://*.example.com
, a equipe que mantém esse widget pode usar o cabeçalhoOrigin-Agent-Cluster
para tentar diminuir o impacto do desempenho nos embedders.
Além disso, também é necessário ter certeza de que você concorda em desativar os recursos de comunicação de origem cruzada discutidos acima e que seu site está usando HTTPS.
Mas, no fim das contas, são apenas orientações. Use medições para determinar se os clusters de agente com origin-key vão ajudar seu site ou não. Especificamente, convém avaliar suas Métricas da Web e, possivelmente, seu uso de memória, para ver o impacto que o origin-key tem. O uso da memória em particular é uma preocupação potencial, já que aumentar o número de processos em execução pode causar mais sobrecarga de memória por processo. Você não deve apenas implementar 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 separada
do isolamento de origem cruzada por meio dos 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
do 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 adicional
para o navegador modificar a heurística de alocação de recursos. Portanto, considere aplicar o cabeçalho Origin-Agent-Cluster
e medir os resultados, mesmo em páginas que já têm um isolamento de origem cruzada.
Como usar o cabeçalho Origin-Agent-Cluster
Para usar o cabeçalho Origin-Agent-Cluster
, configure o 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 de 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ê pode receber resultados inconsistentes, em que o navegador "se lembra" de ter visto uma solicitação de origin-key e, portanto, usa chaves de origem mesmo nas páginas que não pedem isso. Ou o contrário: se a primeira página que um usuário acessar não tiver cabeçalho, o navegador vai lembrar que sua origem não quer ser inserida na origem e vai ignorar o cabeçalho nas páginas subsequentes.
O motivo dessa "memória" é garantir a consistência da chave para uma origem. Se algumas páginas em uma
origem tiverem esse tipo de chave, enquanto outras não, seria possível ter duas páginas de mesma origem que foram
colocadas em diferentes clusters de agente e, portanto, não tinham permissão para se comunicar entre si. Isso seria muito estranho, tanto para desenvolvedores da Web quanto para os componentes internos do navegador. Portanto, a especificação para Origin-Agent-Cluster
ignora o cabeçalho se for inconsistente com o que foi visto anteriormente para uma determinada origem. No Chrome, isso resulta em um aviso do 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 alcançar por meio de mecanismos como window.opener
, frames[0]
ou
window.parent
. Isso significa que, depois que a inserção de origem ou site-chave de uma origem for definida (pelo navegador vendo ou não o cabeçalho), a alteração requer a abertura de uma guia totalmente nova, não conectada à antiga.
Esses detalhes podem ser importantes para testar o cabeçalho Origin-Agent-Cluster
. Ao adicioná-la
pela primeira vez ao site, atualizar a página não funcionará. Será necessário fechar a guia e abrir uma
nova.
Para verificar se o cabeçalho Origin-Agent-Cluster
foi aplicado, use a propriedade JavaScript
window.originAgentCluster
. Isso será true
nos casos em que o cabeçalho ou outros
mecanismos, como o isolamento de origem cruzada, causaram a chave de origem, 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
seu servidor corretamente.
Por fim, o cabeçalho Origin-Agent-Cluster
só funciona em contextos
seguros, ou seja, em páginas HTTPS
ou em http://localhost
. As páginas HTTP que não são do localhost não são compatíveis com clusters de agente
com origin-key.
A chave de origem 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 em
páginas de origem cruzada no mesmo site, ele não oferece a proteção de
cabeçalhos relacionados à segurança, como
Cross-Origin-Resource-Policy
e
Cross-Origin-Opener-Policy
.
Em particular, ela não é uma proteção confiável contra ataques de canal lateral, como o
Spectre.
Isso pode ser um pouco surpreendente, porque usar origin-key pode fazer com que a origem tenha um
processo próprio, 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. O navegador não tem
nenhuma obrigação de fornecer à sua origem um processo separado e pode não fazer isso por vários motivos:
Um navegador pode não implementar essa tecnologia. 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 usar 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.O usuário ou o código em execução em outro site pode já ter navegado para uma página inserida no site na sua origem, fazendo com que a garantia de consistência apareça 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 forma 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 determinados recursos em troca.
Feedback
A equipe do Chrome gostaria de saber se você usa ou está pensando em usar o cabeçalho
Origin-Agent-Cluster
. Seu interesse público e seu suporte nos ajudam a priorizar os recursos e mostrar a importância deles aos outros
fornecedores de navegadores. Envie um tweet para @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 HTML padrão do GitHub (em inglês). Se você
tiver 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:
- Demonstração e fonte de demonstração
- Explicação
- Especificação
- Rastreamento de bugs: Chrome, Firefox, Safari