condivisione delle risorse tra origini (CORS)

Configurazione Esempi di configurazione

Il criterio della stessa origine è un criterio di sicurezza applicato in modo forzato applicazioni web lato client (come i browser web) per impedire interazioni tra da origini diverse. Sebbene sia utile per prevenire comportamenti dannosi, questa misura di sicurezza impedisce anche le interazioni legittime tra origini conosciute. Ad esempio, uno script su una pagina ospitata example.appspot.com potrebbe dover utilizzare risorse archiviate in Bucket Cloud Storage in example.storage.googleapis.com. Tuttavia, poiché si tratta di due origini diverse dal punto di vista del browser, il browser non consentirà a uno script di example.appspot.com di recuperare risorse da example.storage.googleapis.com.

La specifica Condivisione delle risorse tra origini (CORS) è stata sviluppata da il World Wide Web Consortium (W3C) per aggirare questa limitazione. Cloud Storage supporta questa specifica consentendo di configurare i bucket per supportare CORS. Continuando con l'esempio precedente, puoi configurare il bucket example.storage.googleapis.com in modo che un browser possa condividere le sue risorse con gli script di example.appspot.com.

Per ulteriori informazioni sui componenti di configurazione CORS, consulta Impostare CORS per il bucket.

Come funziona CORS

Esistono due tipi di richieste CORS: semplici e con preflight. È possibile avviare direttamente una richiesta semplice. Una richiesta con controllo preliminare deve inviare una richiesta preliminare "preflight" al server per ottenere l'autorizzazione prima che la richiesta principale possa procedere. Una richiesta viene sottoposta a preflight se si verifica una delle seguenti circostanze:

  • Utilizza metodi diversi da GET, HEAD o POST.
  • Utilizza il metodo POST con un Content-Type diverso da text/plain, application/x-www-form-urlencoded o multipart/form-data.
  • Imposta intestazioni personalizzate. Ad esempio, X-PINGOTHER.

Quando un browser effettua una semplice richiesta a Cloud Storage, viene eseguita la seguente procedura:

  1. Il browser aggiunge l'intestazione Origin alla richiesta. Intestazione Origin contiene l'origine della risorsa che cerca di condividere di risorse del bucket Cloud Storage, ad esempio Origin:https://www.example.appspot.com.

  2. Cloud Storage confronta il metodo HTTP della richiesta con il valore dell'intestazione Origin alle informazioni Methods e Origins nella configurazione CORS del bucket di destinazione per vedere se ci sono corrispondenze. In caso affermativo, Cloud Storage include l'intestazione Access-Control-Allow-Origin in la sua risposta. L'intestazione Access-Control-Allow-Origin contiene il valore dell'intestazione Origin della richiesta iniziale.

  3. Il browser riceve la risposta e verifica se Il valore Access-Control-Allow-Origin corrisponde al dominio specificato in richiesta originale. Se corrispondono, la richiesta va a buon fine. Se non c'è corrispondenza o se l'intestazione Access-Control-Allow-Origin non è presente nella risposta, la richiesta non va a buon fine.

Una richiesta di preflight esegue prima i seguenti passaggi. Se l'operazione riesce, segue lo stesso processo di una semplice richiesta:

  1. Il browser invia una richiesta OPTIONS contenente i Requested Method e Requested Headers della richiesta principale.

  2. Cloud Storage risponde con i valori dei metodi e delle intestazioni HTTP consentito dalla risorsa target. Se uno dei valori del metodo o dell'intestazione nella richiesta di preflight non fa parte dell'insieme di metodi e intestazioni consentiti dalla risorsa di destinazione, la richiesta non va a buon fine e la richiesta principale non viene inviata.

Questa è una descrizione semplificata di CORS. Per una descrizione più completa, leggi le specifiche di Recupero.

Supporto CORS per Cloud Storage

Cloud Storage ti consente di impostare una configurazione CORS solo a livello di bucket. Puoi configurare una configurazione CORS per un bucket utilizzando una serie di strumenti. Tuttavia, i diversi endpoint Cloud Storage gestiscono le richieste CORS in modi diversi:

  • Gli endpoint API JSON consentono sempre le richieste CORS e restituiscono valori predefiniti nei Intestazioni delle risposte CORS, indipendentemente dalla configurazione impostata sul bucket.

  • Gli endpoint API XML consentono solo richieste CORS in base alla configurazione sul del bucket e restituiscono valori di intestazione CORS specifici in risposta a tale configurazione.

  • L'endpoint di download del browser autenticato storage.cloud.google.com non consente le richieste CORS. Tieni presente che la console Google Cloud fornisce questo endpoint per il link dell'URL pubblico di ogni oggetto.

Per ottenere una risposta, puoi utilizzare uno dei seguenti URL di richiesta API XML da Cloud Storage che contiene le intestazioni CORS:

storage.googleapis.com/BUCKET_NAME
BUCKET_NAME.storage.googleapis.com

Per informazioni sugli URL di richiesta dell'API XML, consulta Endpoint di richiesta.

Componenti di una configurazione CORS

Quando utilizzi l'API XML, i valori impostati nella configurazione CORS del bucket determinare le intestazioni CORS restituite da Cloud Storage in una risposta HTTP. Quando utilizzi l'API JSON, Cloud Storage non valuta la configurazione del bucket e restituisce i valori predefiniti dell'intestazione.

Nella tabella seguente sono descritti i campi di una configurazione CORS e il comportamento della risposta delle API XML e JSON. Per scoprire come vengono utilizzati questi campi, consulta Esempi di configurazione CORS.

Campo1 Descrizione Comportamento della risposta dell'API XML Comportamento della risposta dell'API JSON
origin Specifica le origini per cui vuoi consentire la condivisione delle risorse tra origini con questo bucket Cloud Storage. Ad esempio, https://origin1.example.com. Se l'origine nella richiesta di un browser corrisponde a un'origine nel tuo sistema CORS configurazione, Cloud Storage restituisce Access-Control-Allow-Origin al del browser. Se non c'è corrispondenza, Cloud Storage non include Access-Control-Allow-Origin nella risposta. Puoi fornire un valore del carattere jolly che concede l'accesso a tutte le origini: <Origin>*</Origin>. Cloud Storage restituisce Access-Control-Allow-Origin impostata sull'origine della richiesta.
method

Specifica i metodi HTTP che vuoi consentire per la risorsa multiorigine condivisione con questo bucket Cloud Storage. Il valore viene restituito nel Intestazione Access-Control-Allow-Methods in risposta a un preflight riuscito richieste.

Poiché OPTIONS è un metodo standard utilizzato dai browser per avviare le richieste di preflight, non devi specificare OPTIONS nella configurazione CORS.

Cloud Storage supporta i seguenti metodi: DELETE, GET, HEAD, POST PUT.

Cloud Storage controlla i metodi inviati dal browser nell'intestazione Access-Control-Request-Methods rispetto a configurazione CORS del bucket. Se non viene trovata alcuna corrispondenza, Cloud Storage restituisce un codice di risposta 200 senza intestazioni di risposta CORS.

Cloud Storage restituisce Access-Control-Allow-Methods intestazione impostata sui seguenti metodi: DELETE, GET, HEAD, PATCH, POST, PUT.
responseHeader Specifica le intestazioni da consentire per la condivisione delle risorse tra origini con questo bucket Cloud Storage. La viene restituito nell'intestazione Access-Control-Allow-Headers in risposta alle richieste preflight riuscite. Per le richieste preflight, Cloud Storage controlla le intestazioni inviate dal browser nell'intestazione Access-Control-Request-Headers rispetto alla configurazione CORS del bucket. In caso contrario, Cloud Storage non restituisce intestazioni delle risposte CORS. Cloud Storage restituisce l'intestazione Access-Control-Allow-Headers impostato uguale ai valori specificati dall'intestazione Access-Control-Request-Headers.
maxAgeSeconds (facoltativo) Specifica il numero di secondi in cui browser sia autorizzato a effettuare richieste prima che ripeta il preflight richiesta. È anche noto come data e ora di scadenza della cache. Questo valore viene restituito nell'intestazione Access-Control-Max-Age nelle risposte al preflight richieste. Ad esempio, 3600 imposta la data e l'ora di scadenza della cache su 1 ora. Cloud Storage restituisce l'intestazione Access-Control-Max-Age con la data e l'ora di scadenza della cache specificata. Se ometti questo campo, Cloud Storage restituisce il valore predefinito 3600. Cloud Storage restituisce l'intestazione Access-Control-Max-Age con il valore predefinito 3600.

1 I nomi documentati nella colonna Campo sono specifici dell'API JSON. Quando utilizzi l'API XML per impostare una configurazione CORS, utilizza il formato specifico per XML.

Specificare più origini, metodi o intestazioni

Per scoprire come impostare più origini, metodi o intestazioni in una configurazione CORS, consulta il seguente elenco:

  • Quando utilizzi l'API JSON, puoi specificare più origini, metodi o intestazioni utilizzando un array separato da virgole. Ad esempio, "method": ["GET", "PUT"].

  • Quando utilizzi l'API XML, puoi specificare più origini, metodi o intestazioni utilizzando elementi separati. Ad esempio:

    <Methods>
      <Method>PUT</Method>
      <Method>GET</Method>
    </Methods>
  • Per consentire l'invio di richieste da qualsiasi origine, imposta l'origine su *. Ad esempio, "origin": ["*"] nell'API JSON o <Origin>*</Origin> nella l'API XML. Sebbene questa origine sia utile per testare le configurazioni, nella maggior parte ti consigliamo di limitare le origini delle richieste per impedire l'uso indesiderato le tue risorse.

Ulteriori considerazioni

La seguente tabella descrive le considerazioni da tenere presenti quando si effettuano richieste utilizzando le credenziali o le intestazioni di controllo dell'accesso:

Proprietà o intestazione Descrizione Comportamento della risposta dell'API XML Comportamento della risposta dell'API JSON
Credenziali Cookie, intestazioni di autorizzazione o certificati client TLS. Cloud Storage non restituisce mai l'errore Access-Control-Allow-Credentials intestazione. Le credenziali CORS non sono supportate dall'API XML.

Per le richieste semplici, se la richiesta CORS viene approvata, L'intestazione Access-Control-Allow-Credentials è impostata su true.

Per le richieste di preflight, se Access-Control-Request-Method è vuoto, Cloud Storage imposta Access-Control-Allow-Credentials su true e rifiuta la richiesta con 404 - Not Found.

Intestazioni esposte Per le richieste preflight, Access-Control-Request-Headers l'intestazione request indica quali intestazioni potrebbero includere una futura richiesta CORS. L'intestazione della risposta Access-Control-Expose-Headers è inclusa nella risposta del server e indica al client quali intestazioni possono esposte. Per le richieste semplici, Access-Control-Expose-Headers elenca i valori delle intestazioni delle risposte nella configurazione CORS. Per le richieste semplici, Access-Control-Expose-Headers restituisce i valori specificati in Access-Control-Request-Headers se fanno parte di un elenco di intestazioni HTTP comuni.

Autorizzazione ai bucket di accedere alle risorse esterne

A volte potresti voler consentire agli script ospitati in Cloud Storage di accedere a risorse statiche ospitate su un sito web esterno a Cloud Storage. In questo scenario, il sito web pubblica intestazioni CORS in modo che i contenuti su storage.googleapis.com possano essere visualizzati.

Come best practice, ti consigliamo di dedicare un bucket specifico per questo accesso ai dati. Questo approccio impedisce al tuo sito di sovraesporre inavvertitamente elementi statici risorse per tutti i seguenti elementi: storage.googleapis.com. Ad esempio, se vuoi dedicare un bucket denominato mybucket per l'accesso ai dati, devi fare in modo che il sito web invii l'intestazione CORS Access-Control-Allow-Origin: https://mybucket.storage.googleapis.com anziché Access-Control-Allow-Origin: https://storage.googleapis.com.

Supporto CORS lato client

La maggior parte dei browser utilizza l'oggetto XMLHttpRequest per effettuare una richiesta tra domini. XMLHttpRequest si occupa di inserire le intestazioni corrette e per la gestione dell'interazione CORS con il server. Non è necessario aggiungere nuovi elementi per sfruttare il supporto CORS sui bucket Cloud Storage.

Passaggi successivi