Richiesta di isolamento delle prestazioni con l'intestazione Origin-Agent-Cluster

Una nuova intestazione della risposta HTTP per limitare lo scripting a livello di dominio e richiedere risorse dedicate al browser.

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster è una nuova intestazione della risposta HTTP che indica al browser di impedire l'accesso a script sincrono tra pagine multiorigine dello stesso sito. I browser possono anche utilizzare Origin-Agent-Cluster come suggerimento per indicare che la tua origine dovrebbe ricevere risorse proprie separate, ad esempio un processo dedicato.

Compatibilità del browser

Al momento l'intestazione Origin-Agent-Cluster è implementata solo in Chrome 88 e versioni successive. È stato progettato in stretta collaborazione con i rappresentanti di Mozilla Firefox che lo hanno contrassegnato come meglio la prototipazione e ha una ricezione preliminare positiva da parte dei rappresentanti di WebKit, il motore del browser utilizzato da Safari.

Nel frattempo, però, oggi non ci sono problemi con il deployment dell'intestazione Origin-Agent-Cluster per tutti gli utenti. I browser che non lo comprendono, lo ignorano. Inoltre, poiché le pagine nei cluster di agenti in base all'origine possono effettivamente fare meno cose di quelle con chiave di sito (impostazione predefinita), non c'è alcun problema di interoperabilità di cui preoccuparsi.

Perché i browser non riescono a segregare automaticamente le origini dello stesso sito

Il web si basa sul criterio della stessa origine, una funzionalità di sicurezza che limita il modo in cui documenti e script possono interagire con le risorse da un'altra origine. Ad esempio, una pagina ospitata su https://a.example ha un'origine diversa da quella all'indirizzo https://b.example o a quella all'indirizzo https://sub.a.example.

In background, i browser usano la separazione offerta dalle origini in modi diversi. In passato, anche se origini diverse non sarebbero in grado di accedere ai dati delle altre, condividevano comunque risorse come i thread del sistema operativo, i processi e l'allocazione della memoria. In questo modo, se una scheda era lenta, lo stesso succedeva a tutte le altre. Se una scheda usa troppa memoria, si verifica l'arresto anomalo dell'intero browser.

Al giorno d'oggi i browser sono più sofisticati e cercano di separare origini diverse in processi diversi. Il funzionamento esatto di questa operazione varia in base al browser: la maggior parte dei browser presenta un certo livello di separazione tra le schede, ma iframe diversi all'interno di una singola scheda potrebbero condividere un processo. Inoltre, poiché i processi hanno un sovraccarico di memoria, utilizzano euristiche per evitare di generarne troppi: ad esempio, Firefox ha un limite di processo configurabile dall'utente e Chrome varia il proprio comportamento da desktop (dove è più sufficiente memoria) a dispositivi mobili (dove è scarsa).

Queste euristiche non sono perfette. Inoltre, soffrono di una limitazione importante: poiché esistono eccezioni al criterio della stessa origine che consentono ai sottodomini come https://sub.a.example e https://a.example di comunicare tra loro, i browser non possono separare automaticamente i sottodomini l'uno dall'altro.

Questo comportamento predefinito è chiamato "cluster di agenti in base al sito", ovvero il browser raggruppa le pagine in base al sito. La nuova intestazione Origin-Agent-Cluster chiede al browser di modificare questo comportamento predefinito per una determinata pagina, inserendola in un cluster di agenti in base all'origine, in modo che venga raggruppata solo con altre pagine che hanno esattamente la stessa origine. In particolare, le pagine multiorigine dello stesso sito verranno escluse dal cluster di agenti.

Questa separazione di attivazione consente ai browser di assegnare a questi nuovi cluster di agenti in base all'origine le proprie risorse dedicate, che non sono combinate con quelle di altre origini. Ad esempio, queste pagine potrebbero sviluppare un proprio processo o essere programmate in thread separati. Se aggiungi l'intestazione Origin-Agent-Cluster alla tua pagina, indichi al browser che la pagina potrebbe usufruire di queste risorse dedicate.

Tuttavia, per poter eseguire la separazione e ottenere i vantaggi, il browser deve disattivare alcune funzionalità legacy.

Cosa non è possibile fare con le pagine in base all'origine

Quando la pagina si trova in un cluster di agenti in base all'origine, rinuncia ad alcune capacità di comunicare con le pagine multiorigine dello stesso sito che erano disponibili in precedenza. In particolare:

  • Non puoi più impostare document.domain. Si tratta di una funzionalità legacy che normalmente consente alle pagine multiorigine dello stesso sito di accedere in modo sincrono al DOM delle altre, ma nei cluster di agenti in base all'origine viene disabilitata.

  • Non puoi più inviare oggetti WebAssembly.Module ad altre pagine multiorigine dello stesso sito tramite postMessage().

  • (Solo Chrome) Non puoi più inviare oggetti SharedArrayBuffer o WebAssembly.Memory ad altre pagine multiorigine dello stesso sito.

Quando utilizzare cluster di agenti in base all'origine

Le origini più vantaggiose dell'intestazione Origin-Agent-Cluster sono quelle che:

  • Ove possibile, ottieni il massimo rendimento con le proprie risorse dedicate. Alcuni esempi sono i giochi che richiedono molte prestazioni, i siti di videoconferenze o le app per la creazione di contenuti multimediali.

  • Contiene iframe che usano molte risorse e hanno origini diverse, ma sono dello stesso sito. Ad esempio, se https://mail.example.com incorpora iframe https://chat.example.com, la codifica dell'origine https://mail.example.com/ garantisce che il codice scritto dal team di chat non possa interferire accidentalmente con il codice scritto dal team di posta e può suggerire al browser di assegnare processi separati per pianificarli in modo indipendente e ridurre l'impatto sulle prestazioni gli uni dagli altri.

  • Pensano di essere incorporati in pagine dello stesso sito di origini diverse, ma sanno di dover utilizzare molte risorse. Ad esempio, se https://customerservicewidget.example.com prevede di utilizzare molte risorse per la videochiamata e sarà incorporato in varie origini durante https://*.example.com, il team che gestisce il widget potrebbe usare l'intestazione Origin-Agent-Cluster per provare a ridurre l'impatto delle prestazioni sugli incorporatori.

Inoltre, dovrai accertarti di avere l'autorizzazione a disattivare le funzionalità di comunicazione cross-origin sopra descritte e che il tuo sito utilizza HTTPS.

In fin dei conti, queste sono solo linee guida. L'utilità o meno dei cluster di agenti in base all'origine per il sito è determinata mediante le misurazioni. In particolare, ti consigliamo di misurare Web Vitals e, potenzialmente, dell'utilizzo della memoria per verificare l'impatto della chiave di origine. (L'utilizzo della memoria in particolare è un potenziale problema, perché l'aumento del numero di processi in riproduzione può causare un maggiore sovraccarico della memoria per processo). Non dovresti limitarti a implementare le chiavi dell'origine e sperare per il meglio.

Qual è la relazione con l'isolamento multiorigine?

La chiave di origine dei cluster di agenti tramite l'intestazione Origin-Agent-Cluster è correlata, ma separata, all'isolamento multiorigine tramite le intestazioni Cross-Origin-Opener-Policy e Cross-Origin-Embedder-Policy.

Qualsiasi sito che si rende isolato multiorigine disattiverà anche le stesse funzionalità di comunicazione multiorigine per lo stesso sito utilizzate quando si utilizza l'intestazione Origin-Agent-Cluster. Tuttavia, l'intestazione Origin-Agent-Cluster può comunque essere utile in aggiunta all'isolamento multiorigine, come suggerimento aggiuntivo al browser per modificare le sue euristiche di allocazione delle risorse. Pertanto, ti consigliamo comunque di applicare l'intestazione Origin-Agent-Cluster e misurare i risultati, anche sulle pagine già isolate multiorigine.

Come utilizzare l'intestazione Origin-Agent-Cluster

Per utilizzare l'intestazione Origin-Agent-Cluster, configura il tuo server web in modo che invii la seguente intestazione della risposta HTTP:

Origin-Agent-Cluster: ?1

Il valore di ?1 è la sintassi dell'intestazione strutturata per un valore true booleano.

È importante inviare questa intestazione su tutte le risposte dalla tua origine, non solo su alcune pagine. Altrimenti, potresti ottenere risultati incoerenti, in cui il browser "ricorda" di aver visto una richiesta di chiave dell'origine e quindi le chiavi di origine anche sulle pagine che non la richiedono. Oppure, al contrario: se la prima pagina visitata da un utente non include l'intestazione, il browser ricorderà che la tua origine non vuole avere una chiave di origine e ignorerà l'intestazione nelle pagine successive.

Perché il browser non è sempre in grado di rispettare l'intestazione?

Il motivo di questa "memoria" è garantire la coerenza della codifica per un'origine. Se alcune pagine su un'origine fossero in base all'origine e altre no, potresti avere due pagine della stessa origine che sono state inserite in cluster di agenti diversi e quindi non possono comunicare tra loro. Questo sarebbe molto strano, sia per gli sviluppatori web sia per l'interno del browser. Pertanto, la specifica per Origin-Agent-Cluster ignora invece l'intestazione se non è coerente con ciò che viene visualizzato in precedenza per una determinata origine. In Chrome, verrà visualizzato un avviso della console.

L'ambito di questa coerenza è un gruppo di contesto di navigazione, ovvero un gruppo di schede, finestre o iframe che possono raggiungersi l'un l'altro tramite meccanismi come window.opener, frames[0] o window.parent. Ciò significa che, una volta stabilita l'origine o le chiavi di sito di un'origine (dal browser che vede o non vede l'intestazione), la modifica richiede l'apertura di una scheda completamente nuova, non collegata in alcun modo alla precedente.

Questi dettagli possono essere importanti per testare l'intestazione Origin-Agent-Cluster. Quando la aggiungi per la prima volta al tuo sito, il semplice ricaricamento della pagina non funzionerà; dovrai chiudere la scheda e aprirne una nuova.

Per verificare se l'intestazione Origin-Agent-Cluster è applicata, utilizza la proprietà window.originAgentClusterJavaScript. Si tratta di true nei casi in cui l'intestazione (o altri meccanismi, come l'isolamento multiorigine) hanno causato la chiave dell'origine, false in caso contrario e undefined nei browser che non implementano l'intestazione Origin-Agent-Cluster. La registrazione di questi dati nella tua piattaforma di analisi può essere utile per verificare la corretta configurazione del server.

Infine, tieni presente che l'intestazione Origin-Agent-Cluster funziona solo su contesti sicuri, ad esempio su pagine HTTPS o su http://localhost. Le pagine HTTP non localhost non supportano i cluster di agenti in base all'origine.

La chiave di origine non è una funzionalità di sicurezza

Anche se l'utilizzo di un cluster di agenti in base all'origine isola l'origine dall'accesso sincrono dalle pagine multiorigine dello stesso sito, non offre la protezione delle intestazioni relative alla sicurezza come Cross-Origin-Resource-Policy e Cross-Origin-Opener-Policy. In particolare, non è una protezione affidabile contro gli attacchi a canale laterale come Spectre.

Questo potrebbe sorprenderti, perché a volte la chiave dell'origine può portare la tua origine ad avere un proprio processo e processi separati sono una difesa importante contro gli attacchi side-channel. Ricorda, però, che l'intestazione Origin-Agent-Cluster è solo un suggerimento al riguardo. Il browser non ha alcun obbligo di assegnare all'origine un processo separato e potrebbe non farlo per una serie di motivi:

  • Un browser potrebbe non implementare la tecnologia necessaria per farlo. Ad esempio, al momento Safari e Firefox possono inserire schede separate nei propri processi, ma non possono ancora farlo per gli iframe.

  • Il browser potrebbe decidere che non vale il carico di lavoro di un processo separato. Ad esempio, sui dispositivi Android con memoria scarsa o in Android WebView, Chrome utilizza il minor numero di processi possibile.

  • Il browser potrebbe voler rispettare la richiesta indicata dall'intestazione Origin-Agent-Cluster, ma potrebbe farlo utilizzando una tecnologia di isolamento diversa rispetto ai processi. Ad esempio, per questo tipo di isolamento delle prestazioni, Chrome sta esplorando utilizzando i thread anziché i processi.

  • L'utente o il codice in esecuzione su un altro sito potrebbe aver già raggiunto una pagina con chiave di sito nella tua origine, causando l'attivazione della garanzia di coerenza e l'ignoramento dell'intestazione Origin-Agent-Cluster.

Per questi motivi, è importante non considerare i cluster di agenti in base all'origine come funzionalità di sicurezza. Si tratta invece di un modo per aiutare il browser a dare priorità all'allocazione delle risorse, suggerendo che la tua origine trarrebbe vantaggio da risorse dedicate (e che vuoi rinunciare a determinate funzionalità in cambio).

Feedback

Il team di Chrome vorrebbe conoscere la tua opinione se utilizzi o stai considerando l'uso dell'intestazione Origin-Agent-Cluster. Il tuo interesse pubblico e il tuo supporto ci consentono di dare priorità alle funzionalità e di mostrare agli altri fornitori di browser la loro importanza. Scrivi un tweet all'indirizzo @ChromiumDev e fai sapere a Chrome DevRel le tue opinioni ed esperienze.

Se hai altre domande sulla specifica o sui dettagli sul funzionamento della funzionalità, puoi segnalare un problema nel repository GitHub standard per HTML. In caso di problemi con l'implementazione di Chrome, puoi segnalare un bug all'indirizzo new.crbug.com impostando il campo Componenti su Internals>Sandbox>SiteIsolation.

Scopri di più

Per saperne di più sui cluster di agenti in base all'origine, puoi approfondire i dettagli a questi link: