Um novo cabeçalho de resposta HTTP para limitar o script em todo o domínio e solicitar recursos dedicados do navegador.
Origin-Agent-Cluster
é um novo cabeçalho de resposta HTTP que instrui o navegador a impedir
o acesso de script síncrono entre páginas entre origens no mesmo site. Os navegadores também podem usar
Origin-Agent-Cluster
como uma dica de que a 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 no Chrome 88 ou mais recente. Ele foi projetado
em estreita colaboração com representantes do Mozilla Firefox, que o marcaram como vale a pena
prototipar, e tem uma
recepção preliminar
positiva 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
usuários. Os navegadores que não entenderem o valor vão simplesmente ignorá-lo. E, como as páginas em clusters de agentes com chave de origem podem fazer menos coisas do que as chaveadas por site (o padrão), não há problemas de interoperabilidade.
Por que os navegadores não podem segregar automaticamente as 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
está em uma
origem diferente de uma em https://b.example
ou https://sub.a.example
.
Nos bastidores, os navegadores usam a separação que as origens fornecem de maneiras diferentes. 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 fosse lenta, todas as outras também seriam. Ou, se uma guia usasse muita memória, ela travaria o navegador inteiro.
Atualmente, os navegadores são mais sofisticados e tentam separar origens diferentes em diferentes processos. A maneira exata como isso funciona varia de acordo com o navegador: a maioria deles tem algum nível de separação entre as guias, mas iframes diferentes dentro de uma única guia podem compartilhar um processo. E como os processos têm um overhead de memória, eles usam heurísticas para evitar a criação de muitos processos: 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 (onde ela é escassa).
Essas heurísticas não são perfeitas. E 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, os navegadores não podem segregar subdomínios automaticamente
uns dos outros.
Esse comportamento padrão é chamado de "clusters de agentes com chave de site": ou seja, o navegador agrupa páginas com base
no site. O novo cabeçalho Origin-Agent-Cluster
pede ao navegador para mudar esse comportamento padrão
de uma página específica, colocando-a em um cluster de agentes com chave origin, para que ela seja agrupada
apenas com outras páginas que têm a mesma origem. Especificamente, as páginas entre origens do mesmo site
serão excluídas do cluster de agentes.
Essa separação voluntária permite que os navegadores deem aos novos clusters de agentes com chave de origem 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
à página, você indica ao navegador que a página
se beneficiaria desses recursos dedicados.
No entanto, para realizar a separação e aproveitar esses benefícios, o navegador precisa desativar alguns recursos legados.
O que as páginas com chave de origem não podem fazer
Quando sua página está em um cluster de agentes com chave de origem, você perde algumas habilidades para se comunicar com páginas entre origens do 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 entre origens do mesmo site acessem o DOM uma da outra de forma síncrona, mas em clusters de agentes com chave de origem, ele fica desativado.Não é mais possível enviar objetos
WebAssembly.Module
para outras páginas entre origens do mesmo site usandopostMessage()
.(Somente 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 aquelas que:
Ter o melhor desempenho com os próprios recursos dedicados, quando possível. Exemplos incluem jogos com uso intensivo de recursos, sites de videoconferência ou apps de criação multimídia.
Contém iframes que usam muitos recursos e têm origem diferente, mas estão no mesmo site. Por exemplo, se
https://mail.example.com
incorporar iframeshttps://chat.example.com
, a chave de origemhttps://mail.example.com/
garante que o código escrito pela equipe de chat não possa interferir acidentalmente no código escrito pela equipe de e-mail e pode sugerir ao navegador que eles sejam separados para serem programados de forma independente e diminuir o impacto de desempenho entre eles.Espera-se que sejam incorporados em páginas de origem diferente no mesmo site, mas que exigem muitos recursos. Por exemplo, se o
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 poderá usar o cabeçalhoOrigin-Agent-Cluster
para tentar diminuir o impacto de desempenho nos incorporadores.
Além disso, você também precisa desativar os recursos de comunicação entre origens raramente usados discutidos acima e garantir que seu site esteja usando HTTPS.
Mas, no fim, essas são apenas orientações. A melhor forma de determinar se os clusters de agentes com origin-key vão ajudar seu site é por meio de medições. Em particular, medir as métricas de vitalidade da Web e, possivelmente, o uso de memória para saber qual é o impacto da chave de origem. O uso de memória, em particular, é uma possível preocupação, já que aumentar o número de processos em jogo pode causar mais sobrecarga de memória por processo. Não basta lançar a chave de origem e torcer para que dê certo.
Como isso se relaciona ao isolamento de origem cruzada?
A chave de origem de clusters de agentes pelo cabeçalho Origin-Agent-Cluster
está relacionada, mas separada
do isolamento entre origens pelos cabeçalhos Cross-Origin-Opener-Policy
e
Cross-Origin-Embedder-Policy
.
Qualquer site que se torne isolado de origem cruzada também desativa os mesmos recursos de comunicação de origem cruzada
no mesmo site que ao usar o cabeçalho Origin-Agent-Cluster
. No entanto, o
cabeçalho Origin-Agent-Cluster
ainda pode ser útil em cima do isolamento entre origens diferentes, como uma dica
adicional para o navegador modificar as heurísticas de alocação de recursos. Portanto, ainda é necessário
aplicar o cabeçalho Origin-Agent-Cluster
e medir os resultados, mesmo em páginas que já
estão isoladas entre origens.
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 de 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ê pode receber resultados inconsistentes, em que o navegador "lembra" de uma solicitação de chave de origem e, portanto, usa chaves de origem mesmo em páginas que não solicitam isso. Ou o contrário: se a primeira página que um usuário visita não tiver o cabeçalho, o navegador vai lembrar que a origem não quer ser chaveada e vai ignorar o cabeçalho nas páginas seguintes.
O motivo dessa "memória" é garantir a consistência da codificação de uma origem. Se algumas páginas em uma
origem tiverem chave de origem e outras não, você poderá ter duas páginas de mesma origem que foram
colocadas em clusters de agentes diferentes e, portanto, não puderam se comunicar entre si. Isso seria
muito estranho, tanto para desenvolvedores da Web quanto para as partes internas do navegador. Portanto, a especificação
de 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 é aplicada a um grupo de contexto de navegação, que é um grupo de guias, janelas ou
iframes que podem ser acessados uns pelos outros por mecanismos como window.opener
, frames[0]
ou
window.parent
. Isso significa que, depois que a chave de origem ou de site de uma origem for definida (pelo navegador que mostra ou não o cabeçalho), a mudança vai exigir a abertura de uma guia totalmente nova, não conectada à antiga de nenhuma forma.
Esses detalhes podem ser importantes para testar o cabeçalho Origin-Agent-Cluster
. Ao adicionar pela primeira vez
ao seu site, apenas atualizar a página não vai funcionar. Você precisa fechar a guia e abrir uma nova.
Para verificar se o cabeçalho Origin-Agent-Cluster
foi aplicado, use a propriedade
window.originAgentCluster
do JavaScript. Isso será true
nos casos em que o cabeçalho (ou outros
mecanismos, como isolamento entre origens) causou a chave de origem; false
quando não causou; e undefined
em navegadores que não implementam o cabeçalho Origin-Agent-Cluster
.
O registro desses dados na plataforma de análise pode ser uma verificação valiosa para garantir que você configurou
o 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 oferecem suporte a clusters de agentes com chave de origem.
A chave de origem não é um recurso de segurança
Embora o uso de um cluster de agente com chave de origem isole a origem do acesso síncrono de
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, 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 a origem tenha seu 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 nesse sentido. O navegador não tem a
obrigação de dar à sua origem um processo separado e pode não fazer 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 pena usar um processo separado. Por exemplo, em dispositivos Android com pouca memória ou na WebView do Android, o Chrome usa o menor número possível de processos.
O navegador pode querer 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á testando o uso de 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 pode ter navegado para uma página com chave de site na sua origem, fazendo com que a garantia de consistência seja ativada e o cabeçalho
Origin-Agent-Cluster
seja ignorado completamente.
Por esses motivos, é importante não pensar em clusters de agentes com chave de origem 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 alguns recursos em troca).
Feedback
A equipe do Chrome gostaria de saber se você está usando ou pretende usar o cabeçalho
Origin-Agent-Cluster
. Seu interesse e apoio público nos ajudam a priorizar recursos e mostrar a outros
fornecedores de navegadores como eles são importantes. Envie um tweet para @ChromiumDev e
compartilhe suas ideias e experiências com o Chrome DevRel.
Se você tiver mais dúvidas sobre a especificação ou os detalhes de como o recurso funciona,
registre um problema no repositório do GitHub do HTML Standard. Se você
encontrar algum problema com a implementação do Chrome, registre um bug em
new.crbug.com
com o campo "Components" definido como Internals>Sandbox>SiteIsolation
.
Saiba mais
Para saber mais sobre clusters de agentes com chave de origem, acesse estes links:
- Demonstração e fonte de demonstração
- Explicação
- Especificação
- Rastreamento de bugs: Chrome, Firefox e Safari