Todos os artigos

CORS: por que o navegador bloqueia requisições "normais" para outro domínio

O Brasil é reconhecido como um dos maiores mercados do Laravel no mundo, e o framework traz um arquivo config/cors.php pronto desde a versão 7. O erro clássico nesse ecossistema é definir 'allowed_origins' => ['*'] para simplificar o desenvolvimento e esquecer de restringi-lo antes do deploy — o que passa despercebido até alguém habilitar 'supports_credentials' => true para autenticação via Sanctum, momento em que o navegador passa a rejeitar a combinação de wildcard com credenciais.

A política de mesma origem

Por padrão, os navegadores aplicam a Same-Origin Policy: o código JavaScript de uma página de uma origem (domínio + esquema + porta) não pode ler respostas de requisições feitas a uma origem diferente. Esse é um mecanismo de segurança fundamental que impede um script malicioso em um site de roubar dados de outro site onde o usuário está autenticado.

Como o CORS flexibiliza essa política

CORS (Cross-Origin Resource Sharing) é um conjunto de cabeçalhos HTTP com os quais um servidor autoriza explicitamente certas origens externas (ou todas) a ler suas respostas. O cabeçalho principal é o Access-Control-Allow-Origin, que indica quais domínios têm permissão.

A armadilha do wildcard com credenciais

Quando uma requisição é enviada com credentials: 'include' — necessário para mandar o cookie de sessão a uma API em outro subdomínio —, o navegador simplesmente recusa aceitar Access-Control-Allow-Origin: * na resposta. A especificação proíbe explicitamente combinar uma origem coringa com credenciais; o servidor precisa devolver a origem exata da requisição.

Para que serve isso

  • Diagnosticar um erro de CORS e entender exatamente quais cabeçalhos estão faltando no servidor.
  • Detectar um config/cors.php do Laravel liberado demais antes de ele chegar à produção.
  • Entender a diferença entre requisições "simples" e requisições preflight (OPTIONS).

CORS não protege o servidor de ataques

É um equívoco comum pensar que CORS é uma medida de segurança do lado do servidor — na verdade, ele apenas restringe o que o JavaScript no navegador pode ler. Um invasor usando curl, Postman ou um script backend diretamente ignora completamente o CORS, porque essas ferramentas não aplicam a política de mesma origem. CORS nunca deve substituir autenticação e autorização reais no servidor.

Experimentar a ferramenta