Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Durante o desenvolvimento de aplicações web, é comum encontrar dificuldades relacionadas a políticas de segurança de origem cruzada (CORS). Quando o frontend e o backend rodam em portas diferentes, mesmo na mesma máquina, o navegador bloqueia requisições por padrão, o que pode gerar confusão e atrasos.
O erro típico ocorre quando uma requisição AJAX feita a um servidor diferente do que serviu a página é bloqueada por políticas de CORS. No cenário mais comum, uma aplicação rodando em uma porta (por exemplo, 3000) tenta acessar uma API hospedada em outra porta (por exemplo, 8080). Apesar de ambos estarem na mesma máquina e, teoricamente, serem considerados na mesma origem, a combinação de protocolo, hostname e porta diferencia as origens.
A mensagem de erro "Origin <origin> is not allowed by Access-Control-Allow-Origin" indica que o servidor não permitiu a requisição de origem cruzada, o que é esperado sem uma configuração explícita.
A solução mais segura, especialmente para ambientes de desenvolvimento, é configurar o servidor para responder com o cabeçalho HTTP adequado: Access-Control-Allow-Origin. Essa configuração pode variar dependendo do servidor utilizado. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Para servidores Node.js com Express, por exemplo, basta usar o middleware cors:
const cors = require('cors'). app.use(cors({ origin: 'http://localhost:3000' })).
Se desejar permitir qualquer origem durante o desenvolvimento, pode usar: A decisão fica mais saudável quando o time consegue medir o impacto depois.
app.use(cors({ origin: '*' })).
No caso de servidores rodando em outros ambientes, a configuração é semelhante: adicione o cabeçalho na resposta HTTP. Para servidores GAE, por exemplo, você pode configurar o arquivo app.yaml ou usar filtros para inserir o cabeçalho. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Importante:
*) é aceitável em ambientes de desenvolvimento, mas nunca em produção, especialmente se o servidor manipula cookies ou credenciais, pois isso pode abrir brechas de segurança.withCredentials = true na requisição AJAX, o servidor deve especificar um domínio exato, e não usar *. Isso garante que cookies e credenciais sejam enviados de forma segura.A troca de Content-Type na requisição ou resposta não influencia diretamente na configuração de CORS, mas é importante garantir que o servidor aceite e processe os tipos de conteúdo enviados pelo frontend. Para requisições com cookies ou credenciais, o cabeçalho Content-Type deve ser compatível com o processamento no backend e a política CORS deve refletir isso. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Permitir qualquer origem (*) é uma solução prática, mas expõe o servidor a requisições indesejadas. Em ambientes de produção, é melhor restringir as origens a domínios específicos que você controla. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Outro ponto é que, se você estiver usando cookies ou sessões autenticadas, o servidor deve aceitar credenciais explicitamente via Access-Control-Allow-Credentials: true e limitar a origem, para evitar vazamento de informações. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
1. Identifique qual servidor está respondendo às requisições (Node, GAE, outro).
2. Configure o cabeçalho Access-Control-Allow-Origin para incluir seu domínio de desenvolvimento ou * para testes.
3. Se usar credenciais, ajuste para uma origem específica e adicione Access-Control-Allow-Credentials: true.
4. Teste as requisições após a configuração e monitore o console do navegador para erros.
5. Para ambientes de produção, revise o escopo de origens permitidas e ajuste as políticas de segurança.
Assim, dá pra manter o desenvolvimento fluido, sem abrir mão de uma configuração segura e controlada. O segredo é entender o impacto de cada cabeçalho e usar o mais restritivo possível que atenda às suas necessidades durante o desenvolvimento. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
---
Este método é bastante direto e evita a necessidade de alterar configurações do navegador ou usar plugins, além de manter o ambiente de testes mais próximo de produção, onde as regras de CORS são estritas. Você já tentou alguma dessas abordagens na sua rotina de desenvolvimento? Como foi o resultado? Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Patricia, na minha experiência, o ideal é restringir ao máximo. Usar * só em dev, pq se for pra produção, melhor colocar o domínio exato. Assim evita vulnerabilidades.
Boa explicação, mas no meu time sempre ficamos na dúvida se é melhor usar * ou uma origem específica. Pra ambientes de produção, qual tu recomenda?
Já passei por isso, o que ajudou foi criar um middleware que insere os headers automaticamente. Facilita o controle e evita esquecer de configurar em algum endpoint.
Concordo, e ainda mais se trabalha com cookies ou sessões. Nesse caso, o * não funciona e você precisa especificar a origem mesmo.