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 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çalhos
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á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ínio
Como 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.
- Por exemplo, se você tem uma aplicação hospedada em
https://meuapp.com
e quer realizar requisições parahttps://api
, o navegador entende que esses dois endereços são origens diferentes.Consumindo 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..terceiro.com
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 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 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 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 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+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>`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 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>`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 tabela
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çalho | Descrição |
---|---|
Access-Control-Allow-Origin | Especifica quais origens podem acessar o recurso. Pode ser um domínio especificado ou para qualquer origem. |
Access-Control-Allow-Methods | Lista os métodos HTTP permitidos (GET, POST, PUT, DELETE etc.). |
Access-Control-Allow-Headers | Lista os cabeçalhos que podem ser usados na requisição. |
Access-Control-Allow-Credentials | Indica se é permitido enviar credenciais (cookies, headers de autenticação) na requisição. |
Access-Control-Max-Age | Tempo em que as respostas do preflight podem ser cacheadas no navegador (em segundos). |
Observação: Usarem
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+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>`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+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>`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
application
no Debugging 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
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 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 AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente.:
- Content-Security-Policy (CSP): Permite controlar de onde o navegador pode carregar recursos, como scripts, fontes
Trabalhando com Fontes, Cores e FundosDescubra neste tutorial completo como aplicar corretamente fontes, cores e fundos em sua página web, garantindo um design moderno e funcional. e imagens. Evita ataques de XSS (Cross-Site Scripting) e inclusão indevida de conteúdo.
- X-Frame-Options: Impede que o site seja carregado em frames ou iframes
Incorporando Conteúdo Externo: `<iframe>`Este tutorial detalha o uso da tag <iframe>, demonstrando seus atributos e boas práticas para incorporar vídeos, mapas e outros conteúdos externos. de origens que não são confiáveis, reduzindo riscos de clickjacking.
- X-Content-Type-Options: Indica ao navegador para não tentar adivinhar o tipo de conteúdo (o que poderia abrir brechas de segurança) e confiar apenas no content-type declarado.
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 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>`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 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 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 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+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étodos
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>`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 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 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 APIs
Consumindo 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ínios
Como 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🔗
- Documentação oficial do MDN: developer.mozilla.org/pt-BR/docs/Web/JavaScript
- Documentação oficial do Node.js: nodejs.org/en/docs/
- Documentação oficial do React: react.dev
- ECMAScript® Language Specification: tc39.es/ecma262/