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.phpdo 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.