olá Felipe Alves Patricio, muito obrigado pela leitura e pela pergunta!

vou agrupar seu comentário em “perguntas semelhantes” e compartilhar a minha experiência:

> 1.Q:: Só fazia aplicações em PHP e nunca tinha tido esses problemas.

Mesmo com PHP, se você dividir seus recursos em domínios diferentes, você estará sujeito a CORS. Eu acredito/assumindo que nessas aplicações PHP você também renderizava sua aplicação. Você tem API e UI no mesmo domínio, por isso CORS não é um problema! A partir do momento que você coloca sua API em um domínio, api.produto.com.br e sua aplicação em outro, produto.com.br, suas requisições de recursos/assets (e.g. AJAX/FETCH/Font-Face/CSS/JS etc) estão sujeitas ao protocolo CORS.

> 2.Q:: Qual seria a melhor maneira de ... “evitar” o CORS?

Para “evitar” o CORS, você pode colocar tudo no mesmo domínio (como no item 1.A), servindo seu produto (SPA) a partir do “/” e API em “/api”. Existem diversas técnicas para isso, podenso usar seu framework back-end ou até mesmo Nginx/Apache/Infra para criar o roteamento.

> 3.Q: Qual seria a melhor maneira de trabalhar … CORS?

> 3.Q: Tentei varias coisas, hoje a API, está liberada. Mas qual a forma correta e segura?

> 3.Q: Só liberar na API, vai possibilitar acessos maliciosos?

> 3.Q: Como é utilizado normalmente em produção ?

Temos que levar em consideração que CORS é uma opção bem poderosa e, com grandes poderes temos grandes responsabilidades! Com isso, temos que ter atenção em dobro em um servidor/API com CORS.

Quem deve ter acesso a esses recursos? — Em 99.9% dos casos, é apenas UM domínio que precisa ter acesso aos recursos do seu api.produto.com.br, no nosso exemplo, seria produto.com.br. É importante permitir/listar APENAS os domínios que devem ter acesso a essa API e recursos como parte da sua configuração CORS

Posso usar "Access-Control-Allow-Origin":"*" em meus endpoints?APENAS se for conteúdo público, caso contrário, não, limite o acesso o máximo possível (lista de domínios, capturando IPs, etc)

Mas eu tenho GET, POST, PUT, DELETE, como identificar qual endpoint precisa ou não precisa?GET pode ser a única excessão aqui, pois esse tipo de requisição NÃO altera estados no servidor (sessão de usuário ou mudanças banco de dados) o restante, passe a régua da proteção. O seu bom senso que entra em ação aqui, podemos pensar da seguinte maneira: "TODOS os domínios (internet em geral) devem ter acesso para executar os recursos de resposta (CORS) dessa requisição GET?". 99.9% dos casos, é um não.

Liberando a API permite acesso malicioso? — Aqui é uma soma de fatores para se ter um acesso malicioso. Se você não estiver monitorando o acesso a sua API e ela estiver liberada, você está aumentando seu risco. Seu código back-end também deve estar tratando os parâmetros passado (escapando caracteres, validando inputs, etc), se não, também é outra facilidade que você coloca na mão de exploiters. Ninguém está 100% seguro online, mas nem por isso devemos facilitar, o peso é grande no ombro do desenvolvedor, se seus dados/empresa trabalham com dados sensíveis, invista tempo e dinheiro nessas validações de segurança.

Forma correta/utilizado em produção? — Tudo depende da aplicação, mas via de regra, sempre limite o acesso e monitore quem acessa sua API. Se você precisa liberar o acesso para terceiros, crie uma validação via tokens. Se apenas 3 domínios podem ter acesso a esses recursos, permita que APENAS esses 3 domínios possam ter acesso e ignore todo o resto. A partir do momento que você coloca algo no Heroku, AWS, DigitalOcean, o mundo inteiro tem acesso. E mesmo com aquela URL/IP maluco da AWS, você ficaria surpreso, ao monitorar sua API, a frequência que requisições da China/Russia/Pais que você nem conhece, aparecem nos seus logs.

Não sei qual linguagem você utiliza, mas abaixo listo 2 pacotes express que sempre estão em APIs públicas que trabalho:

A partir daí, você pode ter uma idéia do que procurar e como implementar para sua linguagem de servidor. Golang/Ruby tem ótimas soluções também!

Muitas vezes, identificar o IP que requisitou e limitar o acesso, já resolve bastante coisa.

TL;DR; — SEMPRE limite o acesso em CORS!

🤗👋

Written by

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store