Verificador de Isolamento entre Origens
Insira a URL de qualquer site para descobrir se ele está isolado entre origens e se SharedArrayBuffer e WebAssembly multithread funcionarão nele. O verificador lê os cabeçalhos de resposta Cross-Origin-Opener-Policy e Cross-Origin-Embedder-Policy da URL e informa o que está faltando. Ele lê apenas os cabeçalhos; nada mais é obtido ou armazenado.
Por que o isolamento entre origens é importante para jogos web
Alguns dos recursos mais úteis dos navegadores ficam bloqueados por trás do isolamento entre origens e, para jogos, o principal deles é o SharedArrayBuffer, a memória compartilhada que torna possível o WebAssembly multithread. Se seu motor disponibiliza uma versão web com múltiplas threads, ela não funcionará sem isso:
- As exportações web do Godot historicamente exigiam SharedArrayBuffer (o Godot 4.3+ adicionou uma exportação de thread única para dispensar os cabeçalhos).
- As versões WebGL multithread do Unity precisam dele.
- Pthreads do Emscripten, ffmpeg.wasm e muitas bibliotecas de física e codecs também precisam dele.
Sem o isolamento, o navegador também restringe temporizadores de alta resolução e performance.measureUserAgentSpecificMemory(). Portanto, se um jogo multithread falhar silenciosamente ao carregar ou performance.now() parecer estranhamente impreciso, verificar o isolamento é a primeira coisa a fazer.
Como funciona o isolamento entre origens
Uma página se torna isolada entre origens quando envia dois cabeçalhos de resposta no documento HTML:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corpCOOP: same-origin separa a página de outras janelas que não tenham a mesma origem. COEP: require-corp determina que todo sub-recurso deve permitir explicitamente sua incorporação. Quando ambos estão definidos, self.crossOriginIsolated passa a ser true e o SharedArrayBuffer é liberado.
O problema é o COEP: depois de ativá-lo, todo recurso de outra origem (imagens de CDN, fontes, scripts e iframes) deve enviar Cross-Origin-Resource-Policy: cross-origin ou ser obtido com CORS; caso contrário, o navegador o bloqueará. Essa é a parte que geralmente faz sites pararem de funcionar. Se você não puder controlar seus recursos de terceiros, use Cross-Origin-Embedder-Policy: credentialless, que carrega recursos de outras origens sem credenciais em vez de exigir que eles permitam explicitamente a incorporação.
Como ativar
Cloudflare Pages (um arquivo _headers):
/*
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corpServidor de desenvolvimento do Vite (vite.config.js):
export default {
server: {
headers: {
'Cross-Origin-Opener-Policy': 'same-origin',
'Cross-Origin-Embedder-Policy': 'require-corp',
},
},
}nginx:
add_header Cross-Origin-Opener-Policy same-origin;
add_header Cross-Origin-Embedder-Policy require-corp;itch.io: ative "SharedArrayBuffer support" nas opções de incorporação do seu jogo HTML; isso configurará os cabeçalhos para você.
Após a implantação, recarregue a página e execute novamente o verificador. crossOriginIsolated deverá mudar para true.
Perguntas frequentes
Como verifico se minha página está isolada entre origens?
Insira a URL do seu site no verificador acima. Ele lê no servidor os cabeçalhos Cross-Origin-Opener-Policy e Cross-Origin-Embedder-Policy da página e informa se essa combinação torna a página isolada. Para verificar durante a execução no seu próprio navegador, abra a página e execute crossOriginIsolated no console; o resultado será true quando o isolamento estiver ativo.
Por que SharedArrayBuffer está indefinido?
Os navegadores só disponibilizam SharedArrayBuffer para páginas isoladas entre origens. Se ele estiver undefined, sua página não tem os cabeçalhos Cross-Origin-Opener-Policy: same-origin e Cross-Origin-Embedder-Policy: require-corp, ou algum recurso de outra origem está impedindo o isolamento sob o COEP. Configure os cabeçalhos (veja acima) e teste novamente.
O que são COOP e COEP?
Cross-Origin-Opener-Policy (COOP) controla como uma página interage com outras janelas de navegação. Cross-Origin-Embedder-Policy (COEP) controla quais sub-recursos podem ser incorporados. Definir COOP: same-origin e COEP: require-corp em conjunto torna uma página isolada entre origens, liberando o SharedArrayBuffer e outros recursos avançados.
Meu jogo em WebAssembly não carrega no navegador. Esse pode ser o motivo?
Muitas vezes, sim. Versões WebAssembly multithread (algumas exportações web do Godot e Unity, pthreads do Emscripten e ffmpeg.wasm) precisam de SharedArrayBuffer, que exige isolamento entre origens. Se o verificador acima mostrar "não isolado", configure os cabeçalhos COOP/COEP ou use uma versão de thread única do motor, quando disponível.
Preciso do cabeçalho Cross-Origin-Resource-Policy?
Não na página que você está isolando. COOP e COEP são os cabeçalhos que tornam um documento isolado entre origens e devem ser definidos no documento. Cross-Origin-Resource-Policy (CORP) é um cabeçalho diferente, usado na direção oposta: você o coloca em um recurso de outra origem (uma imagem, fonte ou script) para permitir que uma página usando COEP: require-corp o incorpore. Portanto, se o verificador mostrar que CORP está "não definido" na sua página, isso é esperado e não representa um problema. Você só adicionaria CORP aos recursos que outras páginas isoladas precisam carregar.
Ativar o COEP pode interromper minhas incorporações de terceiros?
Pode. Com COEP: require-corp, todo recurso de outra origem deve enviar Cross-Origin-Resource-Policy ou usar CORS; caso contrário, ele será bloqueado. Se você incorpora recursos de CDN ou scripts de terceiros que não controla, use COEP: credentialless, que evita essa exigência.
Conteúdo relacionado
- COOP/COEP e SharedArrayBuffer — o tutorial completo com código
- Verificador de WebGL e WebGPU — teste os recursos de GPU do seu navegador
- Web Workers para a lógica do jogo — transfira tarefas para fora da thread principal
- Melhores motores de jogos web para 2026 — quais motores precisam de múltiplas threads
- Cinevva Engine — nosso motor desenvolvido primeiro para a web