O que é o compartilhamento de recursos entre origens?

O compartilhamento de recursos entre origens (CORS) é um mecanismo para integrar aplicações. O CORS define uma maneira de os aplicativos web clientes carregados em um domínio interagirem com recursos em outro domínio. Isso é útil porque aplicações complexas geralmente fazem referência a APIs e recursos de terceiros em seu código no lado do cliente. Por exemplo, sua aplicação pode usar o navegador para extrair vídeos de uma API de plataforma de vídeo, usar fontes de uma biblioteca pública de fontes ou exibir dados meteorológicos de um banco de dados meteorológico nacional. O CORS permite que o navegador do cliente verifique com os servidores de terceiros se a solicitação foi autorizada antes de qualquer transferência de dados.

Por que o compartilhamento de recursos entre origens é importante?

No passado, quando as tecnologias da Internet ainda eram novas, aconteciam problemas de falsificação de solicitações entre sites (CSRF). Esses problemas enviaram solicitações de cliente falsas do navegador da vítima para outra aplicação.

Por exemplo, a vítima fazia login na aplicação de um banco. Em seguida, ela era induzida a carregar um site externo em uma nova guia do navegador. O site externo então usava as credenciais de cookie da vítima e retransmitia os dados para a aplicação bancário enquanto fingia ser a vítima. Usuários não autorizados então tinham acesso não intencional à aplicação bancária.

Para evitar esses problemas de CSRF, todos os navegadores agora implementam a política de mesma origem.

Política de mesma origem

Atualmente, os navegadores exigem que os clientes só possam enviar solicitações para um recurso com a mesma origem que o URL do cliente. O protocolo, a porta e o nome do host do URL do cliente devem corresponder ao servidor solicitado.

Por exemplo, considere a comparação da origem dos URLs abaixo com o URL do cliente http://store.aws.com/dir/page.html.

URL

Resultados

Motivo

http://store.aws.com/dir2/new.html

Mesma origem

Somente o caminho é diferente

http://store.aws.com/dir/inner/other.html        

Mesma origem

Somente o caminho é diferente

https://store.aws.com/page.html

Origem diferente      

Protocolo diferente

http://store.aws.com:81/dir/page.html

Origem diferente

Porta diferente (http://é a porta 80 por padrão)

http://news.aws.com/dir/page.html

Origem diferente

Host diferente

Portanto, a política de mesma origem é altamente segura, mas inflexível para casos de uso genuínos.

O Compartilhamento de recursos entre origens (CORS) é uma extensão da política de mesma origem. Você precisa dele para compartilhar recursos autorizados com terceiros externos. Por exemplo, você precisa do CORS quando deseja extrair dados de APIs externas públicas ou autorizadas. Você também precisa do CORS se quiser permitir o acesso autorizado de terceiros aos seus próprios recursos de servidor.

Como funciona o compartilhamento de recursos entre origens?

Na comunicação padrão pela Internet, seu navegador envia uma solicitação HTTP ao servidor de aplicação, recebe dados como uma resposta HTTP e os exibe. Na terminologia do navegador, o URL atual do navegador é chamado de origem atual e o URL de terceiros é a origem cruzada.

Quando você faz uma solicitação de origem cruzada (entre origens), este é o processo de solicitação/resposta:

  1. O navegador adiciona um cabeçalho de origem à solicitação com informações sobre o protocolo, o host e a porta da origem atual
  2. O servidor verifica o cabeçalho da origem atual e responde com os dados solicitados e um cabeçalho Access-Control-Allow-Origin
  3. O navegador visualiza os cabeçalhos da solicitação de controle de acesso e compartilha os dados retornados com a aplicação cliente

Como alternativa, se o servidor não quiser permitir acesso entre origens, ele responderá com uma mensagem de erro.

Exemplo de compartilhamento de recursos entre origens

Por exemplo, considere um site chamado https://news.example.com. Esse site quer acessar recursos de uma API em partner-api.com.

Os desenvolvedores em https://partner-api.com primeiro configuram os cabeçalhos de compartilhamento de recursos entre origens (CORS) em seus servidores, adicionando new.example.com à lista de origens permitidas. Eles fazem isso adicionando a linha abaixo ao arquivo de configuração do servidor.

Access-Control-Allow-Origin: https://news.example.com

Depois que o acesso ao CORS estiver configurado, news.example.com poderá solicitar recursos de partner-api.com. Para cada solicitação, partner-api.com responderá com Access-Control-Allow-Credentials : "true." O navegador então sabe que a comunicação está autorizada e permite o acesso entre origens.

Se quiser conceder acesso a várias origens, use uma lista separada por vírgula ou caracteres curinga, como *, que concedem acesso a todos.

O que é uma solicitação preflight CORS?

Em HTTP, os métodos de solicitação são as operações de dados que o cliente deseja que o servidor execute. Os métodos HTTP comuns incluem GET, POST, PUT e DELETE.

Em uma interação regular de compartilhamento de recursos entre origens (CORS), o navegador envia os cabeçalhos de solicitação e controle de acesso ao mesmo tempo. Geralmente, são solicitações de dados GET e são consideradas de baixo risco.

No entanto, algumas solicitações HTTP são consideradas complexas e exigem a confirmação do servidor antes que a solicitação real seja enviada. O processo de pré-aprovação é chamado de solicitação preflight.

Solicitações complexas entre origens

Solicitações entre origens são complexas se usarem qualquer um dos seguintes:

  • Métodos diferentes de GET, POST ou HEAD
  • Cabeçalhos diferentes de Accept-Language, Accept ou Content-Language
  • Cabeçalhos Content-Type diferentes de multipart/form-data, application/x-www-form-urlencoded ou text/plain

Assim, por exemplo, solicitações para excluir ou modificar dados existentes são consideradas complexas.

Como funcionam as solicitações de preflight

Navegadores criam solicitações preflight quando estas são necessárias. É uma solicitação OPTIONS como a seguinte.

OPTIONS /data HTTP/1.1

Origem: https://example.com

Access-Control-Request-Method: DELETE

O navegador envia a solicitação preflight antes da mensagem de solicitação real. O servidor deve responder à solicitação preflight com informações sobre as solicitações entre origens que o servidor está disposto a aceitar do URL do cliente. Os cabeçalhos de resposta do servidor devem incluir o seguinte:

  • Access-Control-Allow-Methods
  • Access-Control-Allow-Headers
  • Access-Control-Allow-Origin

Um exemplo de resposta do servidor é fornecido abaixo.

HTTP/1.1 200 OK

Access-Control-Allow-Headers: Content-Type

Access-Control-Allow-Origin: https://news.example.com

Access-Control-Allow-Methods: GET, DELETE, HEAD, OPTIONS

Às vezes, a resposta preflight inclui um cabeçalho Access-Control-Max-Age adicional. Essa métrica especifica a duração (em segundos) para o navegador armazenar em cache os resultados preflight no navegador. O armazenamento em cache permite que o navegador envie várias solicitações complexas entre solicitações preflight. Ele não precisará enviar outra solicitação preflight até que o tempo especificado por max-age termine.

 

Qual é a diferença entre CORS e JSONP?

O JSON with Padding (JSONP) é uma técnica histórica que permite a comunicação entre aplicações Web executadas em domínios diferentes.

Com o JSONP, você usa tags de script HTML na página do cliente. A tag de script carrega arquivos JavaScript externos ou incorpora código JavaScript diretamente em uma página HTML. Como os scripts não estão sujeitos à política de mesma origem, você pode recuperar dados de origem cruzada por meio do código JavaScript.

No entanto, os dados devem estar no formato JSON. Além disso, o JSONP é menos seguro que o compartilhamento de recursos entre origens (CORS) porque depende da confiabilidade do domínio externo para fornecer dados seguros.

Os navegadores modernos adicionaram alguns recursos de segurança, portanto, códigos antigos contendo JSONP não funcionarão mais neles. O CORS é o padrão Web global atual para controle de acesso entre origens.

Leia sobre JavaScript »

Leia sobre JSON »

Quais são algumas práticas recomendadas do CORS?

Você deve observar o seguinte ao configurar o compartilhamento de recursos entre origens (CORS) no seu servidor.

Defina listas de acesso apropriadas

É sempre melhor conceder acesso a domínios individuais usando listas separadas por vírgula. Evite usar curingas, a menos que você queira tornar a API pública. Caso contrário, usar curingas e expressões regulares poderá criar vulnerabilidades.

Por exemplo, digamos que você escreva uma expressão regular que conceda acesso a todos os sites com o sufixo permitted-website.com. Com uma única expressão, você concede acesso a api.permitted-website.com e news.permitted-website.com. Porém, você também inadvertidamente concede acesso a sites não autorizados que podem usar domínios como maliciouspermitted-website.com.

Evite usar origem nula na sua lista

Alguns navegadores enviam o valor null no cabeçalho da solicitação para determinados cenários, como solicitações de arquivo ou solicitações do host local.

No entanto, você não deve incluir o valor nulo na sua lista de acesso. Ele também apresenta riscos de segurança, pois solicitações não autorizadas contendo cabeçalhos nulos podem obter acesso.

Como a AWS pode oferecer suporte aos seus requisitos do CORS?

Muitos dos nossos serviços têm suporte integrado ao compartilhamento de recursos entre origens (CORS). Assim, você pode controlar o acesso entre origens às suas APIs e recursos hospedados na Amazon Web Services (AWS).

Aqui estão alguns serviços da AWS com suporte ao CORS:

  • O Amazon Simple Storage Service (Amazon S3) é um serviço de armazenamento de objetos com classes de armazenamento econômicas para todos os casos de uso de armazenamento de dados. O Amazon S3 permite criar um documento de configuração do CORS com regras que identificam as origens nas quais você permitirá acessar seus dados do S3, as operações (métodos HTTP) que você aceitará para cada origem e outras informações específicas da operação. Você pode adicionar até 100 regras à configuração.
  • O Amazon API Gateway é um serviço gerenciado que permite que você crie, publique, mantenha, monitore e proteja APIs em qualquer escala com facilidade. Você pode habilitar o CORS para suas APIs REST com um clique diretamente no console do Amazon API Gateway.

Comece a usar APIs na AWS criando uma conta da AWS hoje mesmo.

Próximas etapas na AWS

Confira recursos adicionais relacionados a produtos
Confira os serviços de integração de aplicativos 
Cadastre-se para obter uma conta gratuita

Obtenha acesso instantâneo ao nível gratuito da AWS.

Cadastre-se 
Comece a criar no console

Comece a criar no Console de Gerenciamento da AWS.

Faça login