Marcio Cunha

Por que o CORS bloqueia requisições e como configurar no Node

Descubra os fundamentos da Same-Origin Policy e aprenda como configurar cabeçalhos Access-Control-Allow-Origin no Node.js para eliminar erros de CORS.

Marcio Cunha•5 min
Também disponível em:EnglishEspañol
Resumo
  • A Same-Origin Policy isola contextos de navegação para impedir que scripts maliciosos roubem dados entre diferentes origens.
  • O navegador envia uma requisição de teste preflight usando o método OPTIONS antes de executar chamadas complexas ao backend.
  • O cabeçalho Access-Control-Allow-Origin autoriza domínios específicos ou qualquer origem a ler a resposta dos recursos fornecidos.
  • O ecossistema Node.js simplifica essa segurança por meio de bibliotecas dedicadas que injetam os cabeçalhos HTTP necessários automaticamente.
  • Cabeçalhos adicionais como credentials exigem configuração estrita para permitir o envio de cookies e tokens de autenticação com segurança.

O que é o CORS e por que ele existe na web moderna?

Quem programa para a web inevritavelmente já se deparou com aquela mensagem vermelha no console do navegador informando que uma requisição foi bloqueada por causa do CORS. Esse mecanismo de segurança costuma gerar frustração inicial em desenvolvedores que tentam conectar um aplicativo frontend a um servidor backend hospedado em outro endereço. No entanto, longe de ser um mero empecilho, o CORS cumpre um papel fundamental para manter a integridade dos dados e a privacidade dos usuários em um ecossistema digital altamente conectado.

Para entender o bloqueio, precisamos voltar um passo e olhar para a diretriz básica que rege a navegação: a Same-Origin Policy, ou política de mesma origem. Em termos práticos, essa regra determina que um script executado em uma página web só pode interagir com recursos que vieram exatamente do mesmo protocolo, domínio e porta. Se o seu site roda em https://meusite.com, ele não pode ler dados de https://api.outrosite.com por padrão, pois o navegador assume que o segundo site pode ser malicioso e tentar roubar informações sensíveis da sessão do usuário.

É aqui que entra o CORS, sigla em inglês para Compartilhamento de Recursos entre Origens Diferentes. Ele funciona como uma espécie de alfândega inteligente para o navegador. Quando uma aplicação tenta burlar a política de mesma origem por meio de requisições assíncronas, o CORS entra em ação para permitir que o servidor autorize de forma explícita quais origens externas têm permissão para acessar os dados fornecidos. Para aprofundar seu conhecimento sobre o comportamento de servidores e redes, vale conferir as orientações do artigo sobre por que o CORS bloqueia requisições e como liberar no backend.

Como a checagem prévia e o método OPTIONS funcionam na prática

Muitos programadores se surpreendem ao descobrir que o navegador faz mais de uma chamada ao servidor quando realizamos requisições que modificam dados ou utilizam cabeçalhos personalizados. Esse processo envolve a chamada conhecida como preflight, uma requisição de teste enviada de forma automática pelo navegador antes da requisição real. O objetivo é verificar se o servidor remoto aceita os parâmetros da comunicação que está prestes a acontecer.

Na prática, essa requisição preliminar utiliza o método HTTP chamado OPTIONS. O navegador pergunta ao servidor quais são as regras vigentes, enviando cabeçalhos informando qual método real será utilizado e quais credenciais ou parâmetros extras acompanharão a carga útil. Se o servidor responder positivamente com as permissões corretas, o navegador autoriza a requisição principal a seguir viagem. Caso contrário, o bloqueio é ativado e nenhum dado sensível chega ao frontend.

Esse comportamento nos mostra que o CORS é, primariamente, uma restrição imposta pelo lado do cliente, ou seja, pelo próprio navegador. Se você fizer a mesma requisição usando ferramentas de linha de comando como o curl ou scripts de servidores backend, o bloqueio não ocorrerá porque essas ferramentas não implementam a Same-Origin Policy. Compreender essa distinção evita a falsa impressão de que a API está falhando quando, na verdade, o navegador está apenas cumprindo seu papel de guarda-costas digital do usuário.

Como configurar o CORS corretamente em uma aplicação Node.js

Quando desenvolvemos APIs utilizando o ecossistema Node.js com frameworks populares como o Express, precisamos orientar explicitamente o servidor a responder aos navegadores com os cabeçalhos de permissão corretos. O cabeçalho mais importante nessa estrutura é o Access-Control-Allow-Origin, que define quem tem o direito de ler a resposta gerada pela aplicação.

A forma mais elegante e segura de gerenciar isso no Node.js é utilizando o pacote oficial de middleware de CORS. Em vez de escrever manualmente linhas de código para injetar cabeçalhos em cada resposta HTTP, a biblioteca gerencia tanto as requisições normais quanto as chamadas de teste OPTIONS de forma centralizada e sem complicação.

const express = require('express');
const cors = require('cors');
const app = express();

const corsOptions = {
  origin: 'https://meufrontend.com',
  optionsSuccessStatus: 200
};

app.use(cors(corsOptions));

app.get('/api/dados', (req, res) => {
  res.json({ mensagem: 'Acesso liberado com sucesso!' });
});

app.listen(3000, () => {
  console.log('Servidor rodando na porta 3000');
});

No trecho de código acima, configuramos a aplicação para aceitar requisições estritamente vindas de https://meufrontend.com. Se qualquer outro site tentar consumir essa rota usando um navegador, a resposta será barrada pelas regras do cliente. Para cenários de desenvolvimento local, é comum permitir múltiplos domínios ou até mesmo liberar temporariamente todas as origens usando o caractere coringa *, embora essa prática deva ser evitada em ambientes de produção por questões de segurança.

Cuidados essenciais ao lidar com credenciais e cabeçalhos customizados

Liberar o acesso genérico a qualquer domínio costuma ser suficiente para APIs públicas, mas o cenário muda drasticamente quando precisamos autenticar usuários. Se a sua aplicação utiliza cookies seguros, tokens de sessão ou cabeçalhos de autorização personalizados, o comportamento padrão do CORS exige configurações adicionais rigorosas tanto no cliente quanto no servidor.

Quando ativamos o envio de credenciais através da propriedade credentials: true no fetch do frontend, o servidor Node.js deixa de aceitar o caractere coringa * no cabeçalho de origem. A resposta do servidor precisa obrigatoriamente especificar o domínio exato que está autorizado a realizar a operação. Essa exigência evita que sites maliciosos consigam extrair dados de sessões autenticadas sem o consentimento explícito do administrador da API.

Além da origem e das credenciais, vale a pena monitorar o uso de cabeçalhos customizados. Se o seu frontend precisar enviar um token de autenticação proprietário em um cabeçalho chamado X-Custom-Token, o servidor Node.js deve explicitamente listar esse nome na configuração do CORS através do parâmetro correspondente, garantindo que o navegador não intercepte e descarte a comunicação durante a fase de validação prévia. Para complementar essa implementação em produção, vale conferir também nossas análises técnicas sobre Como testar uma fonte ATX de PC com um clipe de papel e Como diagnosticar perda de pacotes na rede usando o comando ping.

Considerações finais sobre segurança e arquitetura de APIs

O domínio do mecanismo CORS é uma competência indispensável para qualquer desenvolvedor que atue no desenvolvimento web full-stack. Compreender que o bloqueio não representa um defeito do código, mas sim uma camada de proteção arquitetural imposta pelos navegadores, muda completamente a forma como encaramos os erros de integração entre frontend e backend.

Ao configurar o seu servidor Node.js com políticas restritivas e adequadas ao ambiente de produção, você garante que sua aplicação permaneça acessível para os clientes legítimos enquanto bloqueia tentativas indesejadas de exploração. Manter essas diretrizes bem ajustadas evita falhas de segurança silenciosas e fortalece a robustez de toda a infraestrutura digital da sua organização.