Pular para o conteúdo principal

Desvendando o CORS: Como Corrigir Erros de 'Cross-Origin' em APIs

Publicado em 17 de dezembro de 20250 min de leitura
Imagem de tecnologia relacionada ao artigo desvendando-cors-como-corrigir-erros-cross-origin

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:

  1. Protocolo (ex: http, https)
  2. Domínio (ex: meusite.com, api.meusite.com)
  3. 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?)

FrontendBackendMesma Origem?
http://meusite.comhttp://meusite.com/dadosSim
http://meusite.comhttps://meusite.com/dadosNão
http://meusite.comhttp://www.meusite.com/dadosNão
http://localhost:3000http://localhost:8080/apiNã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 origem http://localhost:3000".
  • Access-Control-Allow-Methods: "Eu permito os métodos GET, POST e PUT".
  • Access-Control-Allow-Headers: "Eu permito os cabeçalhos Content-Type e Authorization".

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:

bash
npm install cors

2. Use o middleware no seu código:

javascript
// 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 OPTIONS enviada 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

  1. MDN Web Docs. Cross-Origin Resource Sharing (CORS). A fonte mais completa e detalhada sobre o funcionamento técnico do protocolo.
  2. web.dev. Cross-Origin Resource Sharing. Artigo do Google com guias práticos sobre segurança e implementação de CORS.
  3. 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.
  4. CORS Anywhere. CORS Proxy Service. Ferramenta útil para entender como proxies podem ajudar em cenários complexos de integração.
  5. Postman Learning Center. CORS Guide. Dicas sobre como testar e diagnosticar problemas de CORS usando o Postman.
Imagem de tecnologia relacionada ao artigo desvendando-cors-como-corrigir-erros-cross-origin