Compartilhamento de recursos entre origens (CORS)

Acessar os exemplos

A política de mesma origem é uma política de segurança aplicada em aplicativos da Web do lado do cliente (como navegadores da Web) para evitar interações entre recursos de origens diferentes. Além de ser útil para impedir comportamentos maliciosos, essa medida de segurança também impede interações legítimas entre origens conhecidas. Por exemplo, um script em uma página hospedada no App Engine em example.appspot.com talvez precise usar recursos armazenados em um bucket do Cloud Storage em example.storage.googleapis.com. No entanto, por serem duas origens diferentes na perspectiva do navegador, ele não permitirá que um script de example.appspot.com busque recursos de example.storage.googleapis.com.

A especificação Compartilhamento de recursos entre origens (CORS) (em inglês) foi desenvolvida pelo World Wide Web Consortium (W3C) (em inglês) para contornar essa limitação. O Cloud Storage é compatível com essa especificação, permitindo configurar os buckets para serem compatíveis com CORS. Continuando com o exemplo acima, é possível configurar o bucket example.storage.googleapis.com para que um navegador compartilhe os recursos dele com scripts de example.appspot.com.

Para mais informações sobre os elementos de configuração do CORS, consulte Definir o CORS de buckets.

Como funciona o CORS

Há dois tipos de solicitações de CORS, simples e de confirmação. Uma solicitação simples pode ser iniciada diretamente. Uma solicitação de confirmação precisa enviar uma solicitação preliminar de "comprovação" ao servidor para conseguir permissão antes que a solicitação principal possa continuar. Uma solicitação é simulada se alguma das circunstâncias a seguir for verdadeira:

  • Ela usa métodos diferentes de GET, HEAD ou POST.
  • Ela usa o método POST com um Content-Type diferente de text/plain, application/x-www-form-urlencoded ou multipart/form-data.
  • Ela define cabeçalhos personalizados.

O processo a seguir ocorre quando um navegador faz uma solicitação simples ao Cloud Storage:

  1. O navegador adiciona o cabeçalho Origin à solicitação. O cabeçalho Origin contém a origem do recurso que procura compartilhar os recursos do outro domínio, como Origin:http://www.example.appspot.com, por exemplo.

  2. O Cloud Storage compara o método HTTP da solicitação e o valor do cabeçalho Origin com as informações de Métodos e Origens na configuração do CORS do bucket de destino para ver se há correspondências. Se houver, o Cloud Storage incluirá o cabeçalho Access-Control-Allow-Origin na resposta. O cabeçalho Access-Control-Allow-Origin contém o valor do cabeçalho Origin da solicitação inicial.

  3. O navegador recebe a resposta e verifica se o valor Access-Control-Allow-Origin corresponde ao domínio especificado na solicitação original. Se corresponderem, a solicitação será bem-sucedida. Do contrário ou se o cabeçalho Access-Control-Allow-Origin não estiver presente na resposta, a solicitação falhará.

Uma solicitação simulada executa primeiro as etapas a seguir. Se for bem-sucedida, ela segue o mesmo processo que uma solicitação simples:

  1. O navegador envia uma solicitação OPTIONS que contém o Requested Method e os Requested Headers da solicitação principal.

  2. O servidor responde com os valores dos métodos HTTP e os cabeçalhos permitidos pelo recurso de destino. Se algum dos valores do método ou do cabeçalho na solicitação simulada não estiver no conjunto de métodos e cabeçalhos permitidos pelo recurso de destino, a solicitação falhará, e a solicitação principal não será enviada.

Esta é uma descrição bastante simplificada do CORS. Para uma mais completa, leia as especificações de Compartilhamento de recursos entre origens.

Compatibilidade do CORS com o Cloud Storage

O Cloud Storage permite definir a configuração do CORS apenas no nível do bucket. Para definir a configuração do CORS de um bucket, use a ferramenta de linha de comando gsutil, a API XML ou a API JSON.

Diferentes endpoints do Cloud Storage lidam com solicitações de CORS das seguintes maneiras:

  • Os endpoints da API JSON permitem solicitações de CORS, independentemente da configuração do CORS no bucket de destino.
  • Os endpoints da API XML aceitam solicitações de CORS com base na configuração do CORS no bucket de destino.
  • O endpoint de download do navegador autenticado storage.cloud.google.com não permite solicitações de CORS. O Console do Cloud fornece esse endpoint para o link de URL público de cada objeto.

É possível usar um dos URLs de solicitação da API XML a seguir para obter uma resposta do Cloud Storage que contenha os cabeçalhos do CORS:

storage.googleapis.com/[BUCKET_NAME]
[BUCKET_NAME].storage.googleapis.com

Para informações sobre URLs de solicitação da API XML, consulte Solicitar endpoints.

Compatibilidade do CORS do lado do cliente

A maioria dos navegadores usa o objeto XMLHttpRequest para fazer uma solicitação entre domínios. O XMLHttpRequest cuida de todo o trabalho de inserir os cabeçalhos certos e lidar com a interação do CORS com o servidor. Não é necessário adicionar nenhum código novo para aproveitar a compatibilidade com o CORS em buckets do Cloud Storage.

A seguir