Gerador de Cabeçalho CORS Customizado
Constrói o conjunto completo de headers CORS para uma API: Access-Control-Allow-Origin, Methods, Headers, Credentials e Max-Age.
CORS a fundo: origens, preflight, credentials e os headers que importam
CORS (Cross-Origin Resource Sharing) é o mecanismo que permite a uma página na origem A fazer requisições HTTP para uma API na origem B. Faz parte do padrão Fetch do WHATWG, descende da recomendação W3C CORS, e é integralmente aplicado pelo browser — o servidor apenas sugere o que permite, o browser decide se expõe a resposta para o JavaScript.
Uma origem é a tupla scheme + host + port — https://exemplo.com:443 é uma origem, http://exemplo.com é outra, e https://api.exemplo.com é uma terceira. Por padrão a same-origin policy impede scripts de ler respostas entre origens; CORS é o opt-in controlado em que o servidor diz "sim, aquela origem pode ler isto".
Requisições simples vs preflight
Uma requisição simples usa GET, HEAD ou POST, apenas headers padrão e Content-Type entre application/x-www-form-urlencoded, multipart/form-data ou text/plain. O browser apenas envia a requisição com um header Origin: https://app.com e o servidor responde com Access-Control-Allow-Origin: https://app.com (ou * para APIs públicas).
Qualquer outra coisa — PUT, DELETE, PATCH, headers customizados como Authorization ou X-API-Key, ou Content-Type JSON — dispara um preflight. O browser envia uma requisição OPTIONS antes e o servidor precisa responder com o conjunto completo de allow headers:
Access-Control-Allow-Origin: https://app.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400
Max-Age diz ao browser por quanto tempo cachear o preflight (em segundos) — sem ele, toda requisição que muda estado faz dois round-trips. Chrome trava em 7200, Firefox em 86400.
Credentials: cookies e Authorization
Quando o cliente envia cookies, auth HTTP ou um fetch(..., { credentials: 'include' }), o servidor precisa responder com Access-Control-Allow-Credentials: true. Crucial: o header Origin na resposta NUNCA pode ser * quando credentials estão habilitadas — precisa ser a origem literal que chamou. A maioria dos frameworks implementa isso como "reflete o Origin da requisição se estiver na allow-list".
Para deixar seu JS ler headers de resposta não-padrão (paginação, contadores de rate-limit), exponha-os: Access-Control-Expose-Headers: X-Total-Count, X-Pagination, X-RateLimit-Remaining. Sem esse header o browser esconde mesmo que cheguem na camada de rede.
Configurando CORS em servidores reais
- Express:
app.use(cors({ origin: ['https://app.com'], credentials: true, maxAge: 86400 }))— o pacotecorsdo npm cuida do OPTIONS automaticamente. - nginx:
add_header Access-Control-Allow-Origin "$http_origin" always;mais um blocolocationdedicado que retorna 204 para OPTIONS. - AWS CloudFront: anexe uma Response Headers Policy ao behaviour; o CloudFront só repassa
Originse você incluir na chave de cache. - AWS API Gateway: habilite CORS por recurso — ele gera uma integração mock para OPTIONS.
- S3 static hosting: configure o
CORSConfigurationXML em nível de bucket (separado da bucket policy).
Pegadinhas comuns
Allow-Origin: *combinado comAllow-Credentials: true— o browser silenciosamente bloqueia a resposta. Reflita a origem específica.- A spec CORS não permite múltiplos valores em
Allow-Origin— você precisa ecoar uma única origem da sua allow-list (padrão reflect-origin). - CDN cacheando sem
Vary: Originpode servir a resposta CORS errada para outra origem — sempre adicione o Vary. - Falhas de preflight passam despercebidas — o OPTIONS retorna 200 mas o browser ainda bloqueia a requisição real porque o
Allow-Methodsestava incompleto. - Redirects não preservam o header
Originno preflight em browsers antigos — evite 301/302 em rotas de API.
FAQ
Por que vejo "CORS error" no console? O servidor não retornou um header Access-Control-Allow-Origin casando com a origem da página, ou não respondeu 2xx no preflight. Inspecione a aba Network — o OPTIONS vai mostrar exatamente qual header está faltando.
Dá pra bypassar CORS do lado cliente? Não. CORS é aplicado pelo browser; só o servidor pode autorizar a leitura. Workarounds (CORS proxies, flags do browser) só funcionam em dev. Em produção, conserte o servidor ou mova a chamada para o backend.
Preflight acontece em toda requisição? Só em requisições não-simples, e só se o cache estiver frio. Coloque Access-Control-Max-Age em algumas horas e o browser reutiliza o resultado para aquela combinação origem/método/header.
CORS é uma feature de segurança? É uma feature de relaxamento, não de proteção. Permite leituras cross-origin que a same-origin policy bloquearia. Não protege o servidor de CSRF, XSS ou chamadas diretas via curl/Postman — essas não passam pelo browser.
Como suportar múltiplas origens? Mantenha uma allow-list, confira o Origin recebido contra ela e reflita aquele valor exato de volta. Sempre adicione Vary: Origin para os caches segmentarem as respostas corretamente.
Ferramentas Relacionadas
Gerador de resposta paginada JSON
Gere uma resposta JSON paginada fictícia (com page, pageSize, total e items) para mockar uma API REST. Acelere o desenvolvimento e os testes de front-end.
Gerador de Cabeçalho de Fatura
Gera o cabeçalho HTML de uma fatura/invoice profissional: logo, nome da empresa, dados fiscais, número e data. Pronto para imprimir/PDF.
Gerador de Token / Chave de API
Gere tokens aleatórios criptograficamente seguros: hexadecimal, alfanumérico, Base58 ou UUID. Ideal para chaves de API, segredos e tokens de sessão.