Se você chegou aqui, provavelmente está olhando pro console do navegador e vendo uma mensagem de erro vermelha mencionando "CORS policy" — e sua requisição simplesmente não funciona, mesmo que o código pareça correto. Boa notícia: é um dos erros mais comuns (e mais mal-entendidos) do desenvolvimento web, e na grande maioria dos casos a correção é rápida assim que você entende o que realmente está acontecendo.
O que é CORS, na prática
CORS significa Cross-Origin Resource Sharing — é uma regra de segurança que os navegadores aplicam por padrão. Por segurança, o navegador bloqueia que um site em um endereço (por exemplo, meusite.com) faça requisições pra uma API em outro endereço (por exemplo, api.outroservico.com), a menos que esse outro endereço diga explicitamente que permite.
O ponto mais importante de entender: o erro de CORS não é um bug no seu código do frontend — é o servidor (backend/API) que precisa avisar ao navegador que aceita requisições vindas do seu site. Se você não tiver acesso a esse servidor, a correção precisa ser feita por quem tem.
Passo 1: identifique a mensagem exata de erro
Abra o console do navegador (F12 → aba "Console") e procure por uma linha em vermelho. Geralmente aparece assim:
Isso significa exatamente o que foi explicado acima: a API em api.exemplo.com não incluiu o cabeçalho que autoriza meusite.com a fazer essa requisição.
Passo 2: descubra se você controla o backend
Antes de aplicar qualquer correção, responda uma pergunta: você tem acesso ao código do backend/API que está respondendo a essa requisição? Essa resposta decide qual dos dois caminhos abaixo seguir.
Passo 3: aplique a correção certa pro seu caso
Se você controla o backend (Node.js / Express)
O jeito mais simples é usar o pacote cors, que resolve isso com poucas linhas:
Isso avisa ao navegador que requisições vindas de meusite.com são permitidas. Se você quiser permitir mais de um domínio (por exemplo, ambiente de teste e produção), pode passar uma lista em vez de um único valor.
Se você usa Firebase (Cloud Functions)
O mesmo pacote cors funciona dentro de uma Cloud Function:
Se você usa Cloudflare Workers
Dentro do Worker, basta adicionar os cabeçalhos manualmente na resposta:
Se você NÃO controla o backend
Isso acontece bastante quando você está consumindo uma API pública ou de terceiros que não configurou CORS pra aceitar seu domínio. Nesse caso, você não pode "forçar" a API a liberar — as opções são:
- Verificar se a própria API tem uma documentação explicando como solicitar liberação de CORS (algumas exigem cadastro de domínio).
- Criar um pequeno servidor próprio (proxy) que faz a requisição por trás dos panos e repassa a resposta pro seu frontend — assim, quem fala com a API de terceiros é o seu servidor, não o navegador do usuário, e a regra de CORS deixa de se aplicar.
- Usar uma função serverless (Cloudflare Workers, Firebase Functions, Vercel Functions) como esse proxy — não precisa manter um servidor rodando o tempo todo.
Access-Control-Allow-Origin: * (liberando qualquer origem) em produção. Isso funciona pra resolver o erro, mas remove a proteção que o CORS existe pra fornecer — qualquer site poderia consumir sua API livremente. Use * só em ambiente de desenvolvimento/teste, e sempre restrinja ao domínio exato em produção.Passo 4: teste se a correção funcionou
Depois de aplicar a correção e reiniciar o servidor, abra o console do navegador de novo e repita a ação que causava o erro. Se a mensagem vermelha de CORS sumiu e os dados chegaram normalmente, funcionou. Se ainda aparecer erro, confira duas coisas: se o domínio configurado no CORS está escrito exatamente igual ao que aparece na barra de endereço (incluindo http vs https), e se o servidor foi realmente reiniciado depois da mudança.
Erros comuns ao tentar corrigir
- Configurar CORS no frontend: não existe "corrigir CORS" mexendo só no código React/Vue/JS do navegador — a configuração sempre precisa estar do lado do servidor que responde a requisição.
- Esquecer de reiniciar o servidor: depois de adicionar a configuração de CORS no backend, é preciso reiniciar o processo pra mudança valer.
- Confundir com erro de rede: se a API está totalmente fora do ar, o erro é diferente (timeout ou "Failed to fetch" sem menção a CORS) — vale confirmar que a API está realmente respondendo antes de investigar CORS.
- Digitar o domínio errado:
http://meusite.comehttps://meusite.comsão origens diferentes pro navegador — com ou sem "www" também conta como diferente.
localhost) e a API está em produção, lembre que localhost:3000 também precisa estar explicitamente liberado no CORS do backend — geralmente vale a pena manter uma lista separada de origens permitidas pra desenvolvimento e produção.Publicando seu próprio backend?
Veja nosso guia completo de hospedagem gratuita, do zero ao ar, no Cloudflare Pages.
Ver o guia completo