Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Quando trabalhamos com aplicações web que envolvem múltiplos servidores ou ambientes de desenvolvimento, é comum encontrar problemas relacionados à política de segurança de Cross-Origin Resource Sharing (CORS). Um cenário frequente é ao fazer requisições AJAX entre servidores rodando localmente, como uma API hospedada em um servidor de desenvolvimento e uma aplicação front-end servida por outro.
Ao tentar fazer uma requisição AJAX de um domínio para outro, o navegador bloqueia a resposta por questões de segurança, retornando erros como "Origin <origin> is not allowed by Access-Control-Allow-Origin". Mesmo que ambos os servidores estejam na mesma máquina, se estiverem em portas diferentes, são considerados origens distintas, o que ativa as restrições de CORS.
No cenário comum, um servidor em localhost:3000 tenta acessar uma API em localhost:8080, mas o navegador impede a comunicação por padrão. Essa restrição é uma medida de segurança para evitar chamadas maliciosas, mas durante o desenvolvimento, ela pode atrapalhar a agilidade na implementação e testes. 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.
O primeiro passo é verificar o cabeçalho de resposta HTTP para confirmar se o servidor está enviando os cabeçalhos CORS adequados. A ausência ou configuração incorreta desses cabeçalhos é a causa principal do bloqueio.
Para testar, você pode usar ferramentas como o DevTools do navegador, inspecionar a requisição na aba de rede e verificar o valor do campo "Access-Control-Allow-Origin". Se estiver vazio, ou com valor diferente do domínio de origem, o navegador irá bloquear a requisição. 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. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
A abordagem mais prática em ambientes de desenvolvimento é habilitar CORS no servidor backend. Para isso, você pode configurar o servidor Node.js para responder com os cabeçalhos apropriados. Existem várias formas de fazer isso: 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. 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.
No seu servidor Node.js, adicione um middleware que insira os cabeçalhos "Access-Control-Allow-Origin" e outros relacionados:
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', 'http://localhost:3000'). res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'). res.header('Access-Control-Allow-Headers', 'Content-Type'). // Se for uma requisição com credenciais, você precisa especificar o domínio exato
// res.header('Access-Control-Allow-Credentials', 'true'). next(). }).
Para facilitar, utilize pacotes como "cors" do npm, que simplificam essa configuração:
const cors = require('cors'). app.use(cors({ origin: 'http://localhost:3000' })). Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. 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. 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.
Durante o desenvolvimento, é comum usar "*" como valor de "Access-Control-Allow-Origin" para permitir qualquer origem. Contudo, se sua aplicação usar cookies ou credenciais, essa abordagem não é segura, pois o navegador não permitirá o envio de cookies com uma origem genérica. 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. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Para ambientes de produção, configure o servidor para responder apenas às origens específicas que você controla, evitando vulnerabilidades. 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. 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, mesmo em desenvolvimento, pode parecer cômodo, mas aumenta o risco de chamadas não autorizadas. Além disso, ao liberar CORS, você precisa garantir que o servidor não exponha dados sensíveis inadvertidamente. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. 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. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. 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.
Outra questão é a configuração de "withCredentials". Se sua aplicação precisa enviar cookies ou cabeçalhos de autenticação, o servidor deve explicitamente aceitar credenciais, o que exige configurar 'Access-Control-Allow-Credentials': 'true' e não usar o "*". O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. 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.
1. Identifique todas as origens necessárias no seu ambiente de desenvolvimento.
2. Configure o servidor para responder com os cabeçalhos corretos, preferencialmente usando um middleware.
3. Teste requisições usando ferramentas de inspeção de rede para garantir que os cabeçalhos estejam corretos.
4. Para ambientes de produção, restrinja as origens às necessárias e evite usar "*".
Ao fazer isso, a comunicação entre diferentes servidores locais fica mais fluida e segura, evitando bloqueios de navegador e facilitando o desenvolvimento. Essa abordagem também prepara o terreno para uma migração mais segura para ambientes de produção, onde regras de CORS mais estritas são necessárias. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. 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. 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.
Configurar CORS de forma consciente evita dores de cabeça posteriores com problemas de autenticação e segurança, além de manter a experiência de desenvolvimento mais suave e previsível. 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. 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. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
No meu caso, a dica de não usar '*' se precisar de credenciais foi ouro. Sempre esqueço disso na hora de configurar o servidor, aí dá ruim na hora da autenticação.
Boa explicação, Rafael. Aqui no meu time, a maior dor é justamente entender que a configuração de CORS precisa ser feita na API e que não adianta só alterar o frontend. Já passei por isso e achei que usar o middleware do próprio framework foi a melhor solução.
E pra quem quer evitar problemas na fase de testes acho que usar uma configuracao de CORS mais permissiva ajuda ate evitar aquele erro chato na console. Depois e so restringir pra producao mesmo.