CORS e Segurança: Configurando Políticas para Aplicações Web

Neste tutorial, vamos explorar o que é o CORS (Cross-Origin Resource Sharing) e por que ele é fundamental para a segurança de aplicações JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente. que consomem dados de diferentes origens. Também veremos como o navegador lida com requisições cross-origin e quais cabeçalhosFormatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Formatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Aprenda a formatar textos em HTML com tags de parágrafo, títulos e destaques, organizando seu conteúdo e garantindo semântica. devem ser configurados para garantir que tudo funcione corretamente, sem comprometer a segurança da aplicação ou do usuário.

Entendendo a Política de Mesma Origem (Same-Origin Policy)🔗

Para começar, é importante!important e Boas Práticas!important e Boas PráticasDescubra como o !important afeta a cascata do CSS e aprenda boas práticas para evitar conflitos, facilitando a manutenção e depuração do código. compreender o conceito de Same-Origin Policy (SOP). Em termos simples, a Same-Origin Policy é uma regra de segurança implementada pelos navegadores que restringe como um documento ou script carregado de uma determinada origem (domínioComo Hospedar seu Site na InternetComo Hospedar seu Site na InternetAprenda a publicar seu site com nosso guia detalhado sobre registro de domínio, hospedagem, FTP e segurança. Mantenha seu website acessível e protegido 24h., protocolo e porta) pode interagir com recursos de outra origem.

Essa regra existe para proteger usuários e aplicações contra ataques que possam comprometer dados sensíveis, como sessões ativas ou informações confidenciais compartilhadas entre o cliente e o servidor. Porém, em muitos casos é necessário permitir que partes da sua aplicação façam requisições para domíniosComo Hospedar seu Site na InternetComo Hospedar seu Site na InternetAprenda a publicar seu site com nosso guia detalhado sobre registro de domínio, hospedagem, FTP e segurança. Mantenha seu website acessível e protegido 24h. distintos. É aí que entra o CORS.

O que é o CORS (Cross-Origin Resource Sharing)?🔗

O Cross-Origin Resource Sharing (CORS) é um mecanismo que permite que recursos de uma origem sejam acessados por outra origem de forma segura. Em outras palavras, é um conjunto de regras (geralmente configuradas no servidor) que define se uma aplicação hospedada em um domínio X pode acessar recursos hospedados em um domínioComo Hospedar seu Site na InternetComo Hospedar seu Site na InternetAprenda a publicar seu site com nosso guia detalhado sobre registro de domínio, hospedagem, FTP e segurança. Mantenha seu website acessível e protegido 24h. Y.

Se não existisse o CORS, ao tentar buscar dados de outra origem, o navegador bloquearia a requisição, exibindo erros do tipo:

Access to fetch at 'https://api.terceiro.com/dados'
from origin 'https://meuapp.com' has been blocked by CORS policy.

Como o Navegador Lida com Requisições Cross-Origin🔗

Quando um navegador tenta acessar recursos de um domínioComo Hospedar seu Site na InternetComo Hospedar seu Site na InternetAprenda a publicar seu site com nosso guia detalhado sobre registro de domínio, hospedagem, FTP e segurança. Mantenha seu website acessível e protegido 24h. diferente, ele utiliza as diretrizes do CORS para decidir se a requisição é permitida ou não. Esse processo ocorre em etapas:

1. A aplicação web no cliente (JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente.) inicia a requisição.

2. O navegador identifica que se trata de uma requisição cross-origin e então verifica se é necessário efetuar uma “requisição prévia” ou preflight.

3. Caso seja necessário o preflight, o navegador envia um métodoClasses e Herança em ES6+Classes e Herança em ES6+Aprenda a dominar classes e herança em ES6+: escreva códigos JavaScript claros e eficientes com métodos, getters e setters. OPTIONS ao servidor de destino para verificar que tipos de requisição são permitidos.

4. O servidor responde com os cabeçalhosFormatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Formatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Aprenda a formatar textos em HTML com tags de parágrafo, títulos e destaques, organizando seu conteúdo e garantindo semântica. de permissão adequados (os CORS headers).

5. Se o navegador validarValidação de Código: W3C Validator e DebuggingValidação de Código: W3C Validator e DebuggingAprenda a validar e corrigir erros de HTML com o W3C Validator. Descubra técnicas de debugging para melhorar a compatibilidade e a manutenção do seu site. que as permissões retornadas são compatíveis com a requisição original, a chamada prossegue. Caso contrário, a requisição é bloqueada.

Cabeçalhos Importantes para CORS🔗

Para que o CORS funcione adequadamente, o servidor deve retornar alguns cabeçalhosFormatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Formatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Aprenda a formatar textos em HTML com tags de parágrafo, títulos e destaques, organizando seu conteúdo e garantindo semântica. específicos. A tabelaCriando Tabelas: `<table>`, `<tr>`, `<td>`, `<th>`Criando Tabelas: `<table>`, `<tr>`, `<td>`, `<th>`Descubra como montar tabelas HTML com tags básicas. Este tutorial prático ensina o uso de <table> <tr> <td> e <th> para organizar dados de forma eficiente. a seguir resume os principais:

CabeçalhoDescrição
Access-Control-Allow-OriginEspecifica quais origens podem acessar o recurso. Pode ser um domínio especificado ou para qualquer origem.
Access-Control-Allow-MethodsLista os métodos HTTP permitidos (GET, POST, PUT, DELETE etc.).
Access-Control-Allow-HeadersLista os cabeçalhos que podem ser usados na requisição.
Access-Control-Allow-CredentialsIndica se é permitido enviar credenciais (cookies, headers de autenticação) na requisição.
Access-Control-Max-AgeTempo em que as respostas do preflight podem ser cacheadas no navegador (em segundos).
Observação: Usar em Access-Control-Allow-Origin é simples, porém precisa ser feito com cautela, pois isso significa que qualquer site poderá acessar os seus recursos. Em contextos de produção, prefira definir domínios confiáveis de forma explícita.

Tipos de Requisição: Simples vs. Preflight🔗

Para entender melhor quando o preflight (requisição preliminar) ocorre, é útil conhecer os dois tipos de requisição cross-origin reconhecidos pelo navegador: as simple requests (requisições simples) e as non-simple requests (aquelas que exigem preflight).

Requisições Simples

São aquelas que usam métodosClasses e Herança em ES6+Classes e Herança em ES6+Aprenda a dominar classes e herança em ES6+: escreva códigos JavaScript claros e eficientes com métodos, getters e setters. como GET ou POST (com certos tipos de conteúdo), não enviam cabeçalhosFormatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Formatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Aprenda a formatar textos em HTML com tags de parágrafo, títulos e destaques, organizando seu conteúdo e garantindo semântica. personalizados e não exigem preflight. Por exemplo:

fetch('https://api.meuservidor.com/dados')
  .then(response => response.json())
  .then(data => console.log(data));

Requisições que Exigem Preflight

Quando a requisição inclui um métodoClasses e Herança em ES6+Classes e Herança em ES6+Aprenda a dominar classes e herança em ES6+: escreva códigos JavaScript claros e eficientes com métodos, getters e setters. mais “incomum” (como PUT ou DELETE), cabeçalhosFormatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Formatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Aprenda a formatar textos em HTML com tags de parágrafo, títulos e destaques, organizando seu conteúdo e garantindo semântica. personalizados ou uso de applicationDebugging e Ferramentas de Desenvolvimento do NavegadorDebugging e Ferramentas de Desenvolvimento do NavegadorAprenda a depurar código JavaScript com as Ferramentas do Navegador. Use console, breakpoints e debugger para solucionar bugs de forma prática./json no POST, o navegador envia antes uma requisição OPTIONS. Ela serve para “perguntar” ao servidor quais regras de CORS são aceitas. Se a resposta forEstruturas de Controle: if, switch e loopsEstruturas de Controle: if, switch e loopsAprenda as estruturas de controle em JavaScript, como if/else, switch e loops, com exemplos claros e didáticos para otimizar seu código e lógica de programação. compatível com a requisição original, o navegador prossegue; caso contrário, bloqueia.

Políticas de Segurança Relacionadas ao JavaScript🔗

Além do CORS, existem outras políticas que ajudam a reforçar a segurança de aplicações JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente.:

Essas diretivas complementam o uso do CORS, formando um conjunto completo de proteção. Em geral, você as configura no servidor ou no serviço que hospeda sua aplicação/APIsConsumindo APIs com Fetch e AxiosConsumindo APIs com Fetch e AxiosDescubra como integrar APIs com Fetch e Axios em JavaScript. Aprenda a fazer requisições HTTP, tratar erros e usar métodos GET e POST com exemplos práticos..

Exemplificando uma Configuração Básica de CORS🔗

Apesar de não entrarmos no detalhe de frameworks ou configurações completas de servidor, abaixo está um simples exemplo ilustrativo em JavaScript (lado do servidor) que define cabeçalhosFormatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Formatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Aprenda a formatar textos em HTML com tags de parágrafo, títulos e destaques, organizando seu conteúdo e garantindo semântica. de CORS:

// Apenas como demonstração conceitual
const http = require('http');
const server = http.createServer((req, res) => {
  // Exemplo de configuração CORS permissiva (cuidado em produção)
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
  if (req.method === 'OPTIONS') {
    // Para requisição preflight
    res.writeHead(204);
    res.end();
    return;
  }
  // Resto do tratamento da requisição
  res.end('Resposta do servidor com CORS habilitado.');
});
server.listen(3000, () => {
  console.log('Servidor rodando na porta 3000');
});

Nesse caso, qualquer domínioComo Hospedar seu Site na InternetComo Hospedar seu Site na InternetAprenda a publicar seu site com nosso guia detalhado sobre registro de domínio, hospedagem, FTP e segurança. Mantenha seu website acessível e protegido 24h. poderá fazer requisições para esse servidor. Em ambientes reais, é comum substituir o '' em Access-Control-Allow-Origin por um ou mais domíniosComo Hospedar seu Site na InternetComo Hospedar seu Site na InternetAprenda a publicar seu site com nosso guia detalhado sobre registro de domínio, hospedagem, FTP e segurança. Mantenha seu website acessível e protegido 24h. confiáveis, como https://meuapp.com.

Boas Práticas e Dicas Gerais🔗

1. Limite as origens permitidas: Em vez de usar '', defina explicitamente quais domíniosComo Hospedar seu Site na InternetComo Hospedar seu Site na InternetAprenda a publicar seu site com nosso guia detalhado sobre registro de domínio, hospedagem, FTP e segurança. Mantenha seu website acessível e protegido 24h. podem acessar seus recursos.

2. Mantenha os métodosClasses e Herança em ES6+Classes e Herança em ES6+Aprenda a dominar classes e herança em ES6+: escreva códigos JavaScript claros e eficientes com métodos, getters e setters. permitidos no mínimo necessário: Não exponha métodosClasses e Herança em ES6+Classes e Herança em ES6+Aprenda a dominar classes e herança em ES6+: escreva códigos JavaScript claros e eficientes com métodos, getters e setters. como DELETE se eles não forem usados pela aplicação.

3. Cuidado com Access-Control-Allow-Credentials: Permitir credenciais (cookies, tokens) exige atenção especial, pois pode expor informações sensíveis a origens não confiáveis.

4. Combine CORS com outras políticas de segurança: Configurar o CORS corretamente é apenas uma parte da estratégia. Utilize Content-Security-Policy, X-Frame-Options e outros cabeçalhosFormatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Formatação de Texto: `<p>`, `<h1>-<h6>`, `<strong>`, `<em>`Aprenda a formatar textos em HTML com tags de parágrafo, títulos e destaques, organizando seu conteúdo e garantindo semântica. para aumentar a proteção.

5. Monitore e teste continuamente: Ferramentas como o console do navegadorDebugging e Ferramentas de Desenvolvimento do NavegadorDebugging e Ferramentas de Desenvolvimento do NavegadorAprenda a depurar código JavaScript com as Ferramentas do Navegador. Use console, breakpoints e debugger para solucionar bugs de forma prática. ou logs do servidor ajudam a identificar problemas de bloqueio ou configurações incorretas de CORS.

Conclusão🔗

O CORS e as políticas de segurança são pilares fundamentais no desenvolvimento de aplicações web confiáveis. Com o CORS configurado corretamente, sua aplicação JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente. poderá consumir APIsConsumindo APIs com Fetch e AxiosConsumindo APIs com Fetch e AxiosDescubra como integrar APIs com Fetch e Axios em JavaScript. Aprenda a fazer requisições HTTP, tratar erros e usar métodos GET e POST com exemplos práticos. de diferentes domíniosComo Hospedar seu Site na InternetComo Hospedar seu Site na InternetAprenda a publicar seu site com nosso guia detalhado sobre registro de domínio, hospedagem, FTP e segurança. Mantenha seu website acessível e protegido 24h. sem ser bloqueada pelos navegadores, ao mesmo tempo em que mantém princípios básicos de proteção. Isso permite criar aplicações ricas em funcionalidades, assegurando aos usuários que suas informações estarão seguras contra acessos indevidos ou ataques maliciosos.

Lembre-se de manter sempre um balanço entre flexibilidade e segurança ao configurar as regras de CORS, e complemente com outras medidas de proteção para tornar sua aplicação robusta e confiável.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo