21 de Janeiro de 2025
CORS: por que Existe e Como Funciona de Verdade
Como entender CORS pelo problema que ele tenta controlar no navegador, sem confundir politica de browser com segurança total da sua API.
Andrews Ribeiro
Founder & Engineer
4 min Intermediario Frontend
O problema
Tem poucos assuntos web que geram tanta irritacao por tao pouco entendimento real quanto CORS.
O fluxo clássico e este:
- frontend chama API
- browser reclama
- alguém diz “libera tudo ai”
Isso resolve algumas vezes.
Também cria configuração ruim com frequência impressionante.
O problema central e que muita gente tenta decorar header sem entender a pergunta original:
por que o browser esta se metendo nessa request?
Modelo mental
CORS significa Cross-Origin Resource Sharing.
Ele existe porque o browser aplica regras para requests entre origens diferentes.
Origem, aqui, e a combinação de:
- protocolo
- host
- porta
Se uma pagina em https://app.exemplo.com tenta ler resposta de https://api.exemplo.com, já estamos falando de origem diferente.
E o browser quer saber:
essa outra origem autorizou compartilhar a resposta com esta pagina?
Quebrando o problema
CORS e politica do browser
Esse e o ponto que mais limpa a cabeca.
CORS e imposto pelo browser.
Isso significa:
- Postman não liga para CORS
- backend chamando backend não liga para CORS
curlnão liga para CORS
Quem bloqueia leitura da resposta no fluxo tipico e o navegador.
Por isso o mesmo endpoint pode:
- funcionar no servidor
- funcionar no Postman
- falhar no frontend no browser
O que o servidor manda
Quando quer autorizar, o servidor responde com headers como:
Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-HeadersAccess-Control-Allow-Credentials
Esses headers não “abrem a internet”.
Eles dizem ao browser o que aquela origem pode compartilhar.
O que e preflight
Em alguns casos o browser não faz a request final direto.
Ele primeiro manda uma OPTIONS para perguntar se aquilo e permitido.
Isso e o preflight.
Ele aparece com mais frequência quando:
- o metodo não e simples
- ha headers customizados
- ha uso de credenciais em certos cenarios
- o request foge do conjunto mais básico
Se a resposta do preflight não autoriza direito, o browser nem segue com o fluxo da forma esperada.
Credenciais deixam o caso mais sensivel
Quando entram cookie, autenticação baseada em sessao ou outras credenciais, o cuidado aumenta.
Não basta pensar em origem.
Você precisa alinhar:
- origem permitida
- envio de credenciais
- configuração de cookie
- comportamento do frontend
E tem uma armadilha famosa:
Access-Control-Allow-Origin: * não combina com credenciais.
Se a aplicação precisa enviar cookie entre origens, a politica precisa ser mais especifica.
CORS não substitui autenticação
Outra confusao comum:
achar que CORS protege a API por si só.
Não protege.
Se a API esta publica e aceita request com token valido, CORS não e a sua camada principal de autorização.
Ele controla como o browser compartilha respostas entre origens.
Não e substituto de:
- auth
- authz
- validação
- rate limiting
Exemplo simples
Imagine:
- frontend em
https://app.exemplo.com - API em
https://api.exemplo.com
O frontend faz:
fetch('https://api.exemplo.com/profile', {
credentials: 'include',
})
O browser pode mandar cookie, mas só vai deixar o frontend ler a resposta se o servidor responder algo coerente como:
Access-Control-Allow-Origin: https://app.exemplo.comAccess-Control-Allow-Credentials: true
Se o backend responder com configuração errada, o request pode até chegar na API.
Mas o browser ainda bloqueia o acesso do JavaScript ao resultado.
Do ponto de vista da API, a requisição pode ter sido atendida.
Do ponto de vista do browser, aquela resposta não pode ser exposta para esse JavaScript.
Esse detalhe confunde muita gente.
Porque parece que “a API falhou”, quando na verdade a politica do browser que barrou a leitura.
Erros comuns
- Tratar CORS como segurança completa da API.
- Achar que qualquer cliente HTTP sofre CORS.
- Responder
*por reflexo sem pensar em credenciais. - Ignorar preflight e depois estranhar request
OPTIONS. - Debugar só no backend e esquecer que o bloqueio esta no navegador.
Como um senior pensa
Quem tem mais experiência normalmente separa tres perguntas logo no início:
- Quem esta fazendo a chamada, browser ou servidor?
- As origens sao diferentes?
- Ha credenciais, headers customizados ou preflight no meio?
Só essa triagem já elimina metade do caos.
O raciocínio costuma ser:
“Antes de mexer em header no escuro, eu quero saber quem esta aplicando a restrição e qual origem precisa ser autorizada.”
O que o entrevistador quer ver
Em entrevista, CORS costuma ser um teste rápido de maturidade em web.
O avaliador quer ver se você entende o mecanismo e não só os nomes dos headers.
Sinais bons:
- você diz que CORS e politica do browser
- explica origem com protocolo, host e porta
- menciona preflight
- separa CORS de autenticação e autorização
Uma resposta forte costuma soar assim:
“CORS existe porque o browser restringe leitura entre origens diferentes. O servidor responde com headers dizendo o que pode compartilhar. Se houver credenciais ou headers fora do básico, pode rolar preflight antes.”
Decorar header ajuda pouco. Entender quem esta bloqueando o que muda o debug inteiro.
Resumo rápido
O que vale manter na cabeça
- CORS e politica de navegador, não mecanismo completo de segurança da API.
- O browser bloqueia leitura entre origens quando a resposta não autoriza aquela origem.
- Preflight existe para perguntar antes se certos metodos, headers ou credenciais sao aceitos.
- `Access-Control-Allow-Origin` aberto demais com credenciais costuma virar erro ou desenho perigoso.
Checklist de pratica
Use isto ao responder
- Consigo explicar quem aplica CORS e quem não aplica?
- Sei dizer quando o browser faz preflight?
- Consigo diferenciar erro de CORS de erro real vindo da API?
- Sei explicar por que Postman e backend-to-backend não sofrem CORS do mesmo jeito?
Você concluiu este artigo
Compartilhar esta página
Copie o link manualmente no campo abaixo.