
Desvendando o CORS: Como Corrigir Erros de 'Cross-Origin' em APIs
Se existe um erro que une desenvolvedores web em um momento de frustração universal, é este: Access to fetch at 'http://api.exemplo.com/dados' from origin 'http://localhost:3000' has been blocked by CORS policy. Ver essa mensagem vermelha no console do navegador é um rito de passagem.
Mas o que exatamente é o CORS? Por que ele existe e, acima de tudo, como podemos domá-lo? Vamos desmistificar o Cross-Origin Resource Sharing de uma vez por todas, revelando que ele não é um erro para ser temido, mas um dos pilares de segurança que mantêm a web de pé. É hora de entender como configurar seu backend para que as fronteiras dos domínios trabalhem a seu favor.
O Que é a Política de Mesma Origem (Same-Origin Policy)?
Para entender o CORS, primeiro precisamos conhecer seu pai: a Política de Mesma Origem (Same-Origin Policy). Trata-se de uma regra de segurança fundamental implementada por todos os navegadores modernos. Ela dita que um script carregado de uma origem só pode fazer requisições para recursos dessa mesma origem.
Mas o que é uma "origem"? Uma origem é definida pela combinação de três coisas:
- Protocolo (ex:
http,https) - Domínio (ex:
meusite.com,api.meusite.com) - Porta (ex:
80,443,3000)
Se qualquer um desses três elementos for diferente entre o local onde a página web está (o frontend) e o local para onde a requisição é enviada (a API), o navegador considera que são origens diferentes.
Exemplos de Origens (Same-Origin?)
| Frontend | Backend | Mesma Origem? |
|---|---|---|
| http://meusite.com | http://meusite.com/dados | Sim |
| http://meusite.com | https://meusite.com/dados | Não |
| http://meusite.com | http://www.meusite.com/dados | Não |
| http://localhost:3000 | http://localhost:8080/api | Não |
💡 O navegador bloqueia requisições Cross-Origin a menos que o servidor explicitamente as autorize via cabeçalhos CORS.
Essa política é vital para a segurança. Sem ela, se você entrasse em um site malicioso (malvado.com), o JavaScript dessa página poderia fazer uma requisição para o seu internet banking (meubanco.com), ler seus dados e enviá-los para um hacker, já que seu navegador estaria logado no banco. A Same-Origin Policy bloqueia exatamente esse tipo de ataque.
Entra em Cena o CORS (Cross-Origin Resource Sharing)
Acontece que, no mundo moderno das APIs e Single-Page Applications (SPAs), é extremamente comum e necessário que origens diferentes conversem. Seu frontend em React rodando em http://localhost:3000 precisa conversar com sua API em http://localhost:8080.
É para isso que o CORS foi criado. Ele não é um erro, mas sim um mecanismo que permite ao servidor relaxar a Same-Origin Policy de forma controlada. Em outras palavras, o servidor pode dizer ao navegador: "Ei, navegador, está tudo bem. Eu confio nesse outro domínio e autorizo que ele acesse meus recursos".
Como o CORS Funciona na Prática: O Preflight
Quando o frontend tenta fazer uma requisição "complexa" para outra origem (métodos como PUT, DELETE, ou que incluem cabeçalhos customizados), o navegador não envia a requisição diretamente. Em vez disso, ele primeiro envia uma requisição "sondagem" chamada preflight.
Essa requisição preflight usa o método OPTIONS e pergunta ao servidor: "Servidor, estou prestes a enviar uma requisição PUT vinda da origem http://localhost:3000. Você permite isso?".
O servidor, se estiver configurado para aceitar, responde com alguns cabeçalhos especiais, como:
Access-Control-Allow-Origin: "Sim, eu permito requisições da origemhttp://localhost:3000".Access-Control-Allow-Methods: "Eu permito os métodosGET,POSTePUT".Access-Control-Allow-Headers: "Eu permito os cabeçalhosContent-TypeeAuthorization".
Se a resposta do OPTIONS for positiva, o navegador então envia a requisição PUT original. Se a resposta for negativa ou não incluir os cabeçalhos CORS, o navegador bloqueia a requisição e exibe o famoso erro no console.
Importante: O bloqueio do CORS é uma ação do navegador, não do servidor. A requisição pode até chegar ao servidor, mas é o navegador que se recusa a entregar a resposta ao JavaScript do frontend.
Como Corrigir o Erro de CORS (no Backend!)
A correção do CORS deve ser feita no servidor (na sua API), não no frontend. É o servidor que precisa informar ao navegador quais origens são permitidas.
A forma mais fácil de fazer isso é usando um middleware. Veja um exemplo para uma API em Node.js com Express:
1. Instale o pacote cors:
npm install cors2. Use o middleware no seu código:
// server.js
const express = require('express');
const cors = require('cors'); // Importa o middleware
const app = express();
// Configuração básica (permite todas as origens)
// CUIDADO: Em produção, seja mais específico!
app.use(cors());
// Configuração recomendada para produção
const corsOptions = {
origin: 'https://meu-frontend.com', // Apenas seu frontend pode acessar
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
};
// app.use(cors(corsOptions)); // Use esta opção em produção
app.get('/dados', (req, res) => {
res.json({ message: 'Estes dados vieram do backend!' });
});
app.listen(8080, () => {
console.log('API rodando na porta 8080');
});Configurações Comuns:
app.use(cors()): Permite requisições de qualquer origem. Ótimo para desenvolvimento, mas perigoso em produção.cors({ origin: 'https://meu-site.com' }): Permite requisições apenas do seu site.cors({ origin: ['https://site1.com', 'https://site2.com'] }): Permite requisições de uma lista de sites.
A lógica é a mesma para outras linguagens e frameworks (Django, Spring, Laravel, etc.). Procure pela biblioteca ou configuração de CORS específica para a sua tecnologia.
Conclusão
O erro de CORS, embora frustrante, é um sinal de que os mecanismos de segurança da web estão funcionando. Ele nos força, como desenvolvedores de backend, a sermos explícitos sobre quem pode acessar nossa API.
Lembre-se sempre:
- CORS é uma proteção implementada pelo navegador.
- A correção é feita no servidor, adicionando os cabeçalhos
Access-Control-*. - Em desenvolvimento,
cors()é seu amigo. Em produção, especifique sempre as origens permitidas.
Da próxima vez que encontrar esse erro, não se desespere. Respire fundo, vá até o código da sua API e configure os cabeçalhos CORS corretamente. Você estará construindo uma web mais segura e funcional.
Glossário Técnico
- Origin (Origem): A combinação de protocolo, domínio e porta que identifica de onde vem uma requisição web.
- Preflight (Voo Prévio): Uma requisição
OPTIONSenviada pelo navegador antes da requisição real para verificar se o servidor autoriza a comunicação. - Middleware: Software que atua como uma ponte entre diferentes aplicações ou partes de um programa, frequentemente usado para tratar segurança e CORS.
- Access-Control-Allow-Origin: O principal cabeçalho de resposta que indica quais domínios podem acessar os recursos do servidor.
- Same-Origin Policy (SOP): Regra de segurança fundamental dos navegadores que impede que scripts de um site acessem dados de outro sem permissão.
Referências
- MDN Web Docs. Cross-Origin Resource Sharing (CORS). A fonte mais completa e detalhada sobre o funcionamento técnico do protocolo.
- web.dev. Cross-Origin Resource Sharing. Artigo do Google com guias práticos sobre segurança e implementação de CORS.
- Auth0 Blog. CORS Tutorial: A Guide to Cross-Origin Resource Sharing. Explicação visual e didática sobre os processos de preflight e segurança em APIs.
- CORS Anywhere. CORS Proxy Service. Ferramenta útil para entender como proxies podem ajudar em cenários complexos de integração.
- Postman Learning Center. CORS Guide. Dicas sobre como testar e diagnosticar problemas de CORS usando o Postman.
