Cos'è la condivisione delle risorse di diversa origine?
La condivisione delle risorse di diversa origine (CORS) è un meccanismo per l'integrazione delle applicazioni. La funzionalità CORS definisce un metodo con cui le applicazioni Web dei clienti caricate in un dominio possono interagire con le risorse situate in un dominio differente. Ciò è utile, perché le applicazioni complesse spesso fanno riferimento ad API e risorse di terze parti nel loro codice lato client. Ad esempio, l'applicazione può utilizzare il browser per estrarre video dall'API di una piattaforma video, utilizzare caratteri da una libreria di caratteri pubblica o visualizzare dati meteorologici da un database meteorologico nazionale. CORS consente al browser client di verificare con i server di terze parti se la richiesta è autorizzata prima di qualsiasi trasferimento di dati.
Perché è importante la condivisione delle risorse di diversa origine?
In passato, quando le tecnologie Internet erano ancora nuove, si verificavano problemi di falsificazione delle richieste tra siti (CSRF). Questi problemi inviavano false richieste dei client dal browser della vittima a un'altra applicazione.
Ad esempio, la vittima si collegava all'applicazione della propria banca. Quindi veniva indotta a caricare un sito Web esterno in una nuova scheda del browser. Il sito Web esterno utilizzava le credenziali dei cookie della vittima e inoltrava i dati alla richiesta bancaria fingendo di essere la vittima. Gli utenti non autorizzati effettuavano quindi un accesso involontario all'applicazione bancaria.
Per evitare questi problemi CSRF, tutti i browser ora implementano la policy della stessa origine.
Policy della stessa origine
Oggi, i browser impongono che i client possano inviare richieste solo a una risorsa con la stessa origine dell'URL del client. Il protocollo, la porta e il nome host dell'URL del client devono corrispondere tutti al server richiesto.
Ad esempio, si consideri il confronto dell'origine degli URL seguenti con l'URL del client http://store.aws.com/dir/page.html.
URL |
Risultato |
Motivo |
http://store.aws.com/dir2/new.html |
Stessa origine |
Solo il percorso è diverso |
http://store.aws.com/dir/inner/other.html |
Stessa origine |
Solo il percorso è diverso |
https://store.aws.com/page.html |
Origine diversa |
Protocollo diverso |
http://store.aws.com:81/dir/page.html |
Origine diversa |
Porta diversa (http:// è la porta 80 per impostazione predefinita) |
http://news.aws.com/dir/page.html |
Origine diversa |
Host diverso |
Pertanto, la policy della stessa origine è altamente sicura ma poco flessibile per casi d'uso reali.
La condivisione delle risorse di diversa origine (CORS) è un'estensione della policy della stessa origine. Ne hai bisogno per la condivisione autorizzata delle risorse con terze parti esterne. Ad esempio, la CORS è necessaria quando si desidera estrarre dati da API esterne pubbliche o autorizzate. È inoltre necessaria se si desidera consentire l'accesso autorizzato di terze parti alle risorse del proprio server.
Come funziona la condivisione delle risorse di diversa origine?
Nelle comunicazioni Internet standard, il browser invia una richiesta HTTP al server dell'applicazione, riceve i dati come risposta HTTP e li visualizza. Nella terminologia dei browser, l'URL corrente del browser è detto origine corrente e l'URL di terze parti è di diversa origine.
Quando effettui una richiesta di diversa origine, il processo di richiesta-risposta è il seguente:
- Il browser aggiunge un'intestazione di origine alla richiesta con informazioni su protocollo, host e porta dell'origine corrente
- Il server controlla l'intestazione di origine corrente e risponde con i dati richiesti e un'intestazione Access-Control-Allow-Origin
- Il browser vede le intestazioni della richiesta di controllo degli accessi e condivide i dati restituiti con l'applicazione client
In alternativa, se il server non desidera consentire l'accesso da più origini, risponde con un messaggio di errore.
Esempio di condivisione delle risorse di diversa origine
Si consideri come esempio un sito chiamato https://news.example.com. Questo sito desidera accedere alle risorse di un'API all'indirizzo partner-api.com.
Gli sviluppatori su https://partner-api.com configurano innanzitutto le intestazioni CORS (cross-origin resource sharing) sul proprio server aggiungendo new.example.com all'elenco delle origini consentite. Lo fanno aggiungendo la riga seguente al file di configurazione del server.
Access-Control-Allow-Origin: https://news.example.com
Una volta configurato l'accesso CORS, news.example.com potrà richiedere le risorse da partner-api.com. Per ogni richiesta, partner-api.com risponderà con Access-Control-Allow-Credentials : "true." Il browser sa quindi che la comunicazione è autorizzata e consente l'accesso da un'origine diversa.
Se vuoi concedere l'accesso a più origini, usa un elenco separato da virgole o caratteri jolly come * che consentano l'accesso a tutti.
Cos'è una richiesta preflight CORS?
In HTTP, i metodi di richiesta sono le operazioni sui dati che il client desidera che il server esegua. I metodi HTTP più comuni includono GET, POST, PUT e DELETE.
In una normale interazione CORS (cross-origin resource sharing), il browser invia contemporaneamente le intestazioni di richiesta e di controllo degli accessi. Di solito si tratta di richieste di dati GET e sono considerate a basso rischio.
Tuttavia, alcune richieste HTTP sono considerate complesse e richiedono la conferma del server prima dell'invio della richiesta effettiva. Il processo di pre-approvazione si chiama richiesta preflight.
Richieste complesse di diversa origine
Le richieste di diversa origine sono complesse se utilizzano uno dei seguenti elementi:
- Metodi diversi da GET, POST o HEAD
- Intestazioni diverse da Accept-Language, Accept o Content-Language
- Intestazioni Content-Type diverse da multipart/form-data, application/x-www-form-urlencoded o text/plain
Quindi, ad esempio, le richieste di eliminazione o modifica dei dati esistenti sono considerate complesse.
Come funzionano le richieste preflight
I browser creano richieste preflight se sono necessarie. È una richiesta OPTIONS come la seguente.
OPTIONS /data HTTP/1.1 Origine: https://example.com Access-Control-Request-Method: DELETE |
Il browser invia la richiesta preflight prima del messaggio di richiesta effettivo. Il server deve rispondere alla richiesta preflight con informazioni sulle richieste di diversa origine che il server è disposto ad accettare dall'URL del client. Le intestazioni delle risposte del server devono includere quanto segue:
- Access-Control-Allow-Methods
- Access-Control-Allow-Headers
- Access-Control-Allow-Origin
Di seguito viene fornito un esempio di risposta del server.
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 |
La risposta preflight a volte include un'intestazione Access-Control-Max-Age aggiuntiva. Questo parametro specifica la durata (in secondi) della memorizzazione dei risultati di preflight nel browser da parte del browser. La memorizzazione nella cache consente al browser di inviare diverse richieste complesse tra richieste preflight. Non è necessario inviare un'altra richiesta preflight fino alla scadenza del tempo specificato dalla durata massima.
Qual è la differenza tra CORS e JSONP?
JSON with Padding (JSONP) è una tecnica storica che consente la comunicazione tra applicazioni Web in esecuzione su domini diversi.
Con JSONP, si utilizzano i tag degli script HTML nella pagina del client. Il tag dello script carica file JavaScript esterni o incorpora il codice JavaScript direttamente all'interno di una pagina HTML. Poiché gli script non sono soggetti alla policy di stessa origine, puoi recuperare dati di un'origine diversa tramite il codice JavaScript.
Tuttavia, i dati devono essere in formato JSON. Inoltre, JSONP è meno sicuro della condivisione di risorse di diversa origine (CORS) perché si basa sull'affidabilità del dominio esterno per fornire dati sicuri.
I browser moderni hanno aggiunto alcune funzionalità di sicurezza, quindi il codice precedente contenente JSONP non funzionerà più su di essi. CORS è l'attuale standard Web globale per il controllo degli accessi da più origini.
Quali sono le best practice CORS?
Quando configuri la condivisione delle risorse di diversa origine (CORS) sul tuo server, tieni presente quanto riportato di seguito.
Definisci gli elenchi di accesso appropriati
È sempre meglio concedere l'accesso a singoli domini utilizzando elenchi separati da virgole. Evita di usare caratteri jolly a meno che tu non voglia rendere pubblica l'API. Altrimenti, l'uso di caratteri jolly ed espressioni regolari può creare vulnerabilità.
Ad esempio, supponiamo di scrivere un'espressione regolare che conceda l'accesso a tutti i siti con il suffisso permitted-website.com. Con una sola espressione, concedi l'accesso a api.permitted-website.com e news.permitted-website.com. Ma concedi anche inavvertitamente l'accesso a siti non autorizzati che potrebbero utilizzare domini come maliciouspermitted-website.com.
Evita di utilizzare un'origine nulla nella tua lista
Alcuni browser inviano il valore null nell'intestazione della richiesta per determinati scenari come richieste di file o richieste dall'host locale.
Tuttavia, non dovresti includere il valore null nell'elenco di accesso. Vengono inoltre introdotti rischi per la sicurezza in quanto possono accedere richieste non autorizzate contenenti intestazioni null.
In che modo AWS può supportare i requisiti di CORS?
Molti dei nostri servizi dispongono del supporto CORS (cross-origin resource sharing) integrato. Quindi, puoi controllare l'accesso da più origini alle tue API e alle tue risorse ospitate su Amazon Web Services (AWS).
Ecco alcuni servizi AWS con supporto CORS:
- Amazon Simple Storage Service (Amazon S3) è un servizio di archiviazione di oggetti con classi di archiviazione convenienti per tutti i casi d'uso dell'archiviazione di dati. Amazon S3 ti consente di creare un documento di configurazione CORS con regole che identificano le origini a cui consentirai l'accesso per i tuoi dati S3, le operazioni (metodi HTTP) che supporterai per ciascuna origine e altre informazioni specifiche sull'operazione. Puoi aggiungere alla configurazione fino a 100 regole.
- Gateway Amazon API è un servizio completamente gestito che semplifica la creazione, la pubblicazione, la manutenzione, il monitoraggio e la protezione delle API su qualsiasi scala. Puoi abilitare CORS per le tue REST API con un clic direttamente nella console Gateway Amazon API.
Inizia oggi stesso a utilizzare le API con AWS creando un account.
Passaggi successivi su AWS
Ottieni accesso istantaneo al Piano gratuito di AWS.