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

Una nuova intestazione di risposta HTTP per limitare gli script a livello di dominio e richiedere risorse dedicate dal browser.

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster è una nuova intestazione di risposta HTTP che indica al browser di impedire l'accesso allo scripting sincrono tra pagine dello stesso sito multiorigine. I browser possono anche utilizzare Origin-Agent-Cluster come suggerimento che l'origine deve avere risorse proprie e separate, ad esempio un procedura dedicata.

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 meritevole di essere prototipato, e ha ricevuto una risposta preliminare positiva da parte dei rappresentanti di WebKit, il motore del browser utilizzato da Safari.

Nel frattempo, non c'è alcun problema con il deployment dell'intestazione Origin-Agent-Cluster per tutti i tuoi utenti oggi. I browser che non lo comprendono lo ignoreranno. Inoltre, poiché le pagine dei cluster di agenti basati su origini possono fare meno rispetto a quelle basate su siti (impostazione predefinita), non ci sono problemi di interoperabilità.

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 all'indirizzo https://a.example ha un'origine diversa da una all'indirizzo https://b.example o https://sub.a.example.

Dietro le quinte, i browser utilizzano la separazione fornita dalle origini in modi diversi. In passato, anche se le origini separate non potevano accedere ai dati l'una dell'altra, condividevano comunque risorse come thread, processi e allocazione della memoria del sistema operativo. Ciò significava che se una scheda era lenta, rallentava tutte le altre schede. In alternativa, se una scheda utilizza troppa memoria, l'intero browser potrebbe bloccarsi.

Oggi i browser sono più sofisticati e cercano di separare le diverse origini in diversi procedimenti. Il funzionamento esatto varia in base al browser: la maggior parte dei browser ha un certo livello di separazione tra le schede, ma diversi iframe 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 la memoria è più sufficiente) a dispositivi mobili (dove è scarsa).

Queste heurismi non sono perfette. Inoltre, presentano una limitazione importante: poiché esistono eccezioni al criterio di origine che consentono a sottodomini come https://sub.a.example e https://a.example di comunicare tra loro, i browser non possono separare automaticamente i sottodomini tra loro.

Questo comportamento predefinito è chiamato "cluster di agenti basati sul sito": in altre parole, 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 con chiave di origine, in modo che venga raggruppata solo con altre pagine che hanno esattamente la stessa origine. In particolare, le pagine cross-origin dello stesso sito verranno escluse dal cluster di agenti.

Questa separazione che richiede l'attivazione consente ai browser di assegnare a questi nuovi cluster di agenti con chiave di origine le proprie risorse dedicate, che non vengono combinate con quelle di altre origini. Ad esempio, queste pagine potrebbero avere un proprio processo o essere pianificate su thread separati. Aggiungendo l'intestazione Origin-Agent-Cluster alla pagina, indichi al browser che la pagina trarrebbe vantaggio da queste risorse dedicate.

Tuttavia, per eseguire la separazione e ottenere questi vantaggi, il browser deve disattivare alcune funzionalità precedenti.

Cosa non possono fare le pagine con chiave di 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à precedente che in genere consente alle pagine multiorigine dello stesso sito di accedere in modo sincrono al DOM l'una dell'altra, ma nei cluster di agenti con chiave di origine è disattivata.

  • Non puoi più inviare oggetti WebAssembly.Module ad altre pagine cross-origin nello stesso sito tramite postMessage().

  • (Solo Chrome) Non puoi più inviare oggetti SharedArrayBuffer o WebAssembly.Memory ad altre pagine cross-origin nello stesso sito.

Quando utilizzare i cluster di agenti in base all'origine

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

  • Ottenere il massimo rendimento con le proprie risorse dedicate, se possibile. Alcuni esempi sono giochi ad alte prestazioni, siti di videoconferenze o app di creazione di contenuti multimediali.

  • Contiene iframe che richiedono molte risorse e che hanno origini diverse, ma nello stesso sito. Ad esempio, se https://mail.example.com incorpora iframe di https://chat.example.com, la funzionalità di assegnazione di chiavi di 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 loro processi distinti per pianificarli in modo indipendente e ridurre il loro impatto sulle prestazioni reciproche.

  • Devono essere incorporati in pagine dello stesso sito con origini diverse, ma sono consapevoli di essere molto dispendioso in termini di risorse. Ad esempio, se https://customerservicewidget.example.com prevede di utilizzare molte risorse per la videochat e verrà incorporato in varie origini in https://*.example.com, il team che gestisce il widget potrebbe utilizzare l'intestazione Origin-Agent-Cluster per cercare di ridurre l'impatto sulle prestazioni degli inserzionisti.

Inoltre, dovrai accertarti di avere l'autorizzazione a disattivare le funzionalità di comunicazione multiorigine raramente utilizzate sopra e che il tuo sito utilizzi l'HTTPS.

Ma alla fine, si tratta solo di linee guida. In definitiva, è meglio determinare se i cluster di agenti in base all'origine sono utili o meno per il tuo sito tramite le misurazioni. In particolare, ti consigliamo di misurare i tuoi Web Vitals e, potenzialmente, il tuo utilizzo della memoria per capire l'impatto dell'assegnazione della chiave di origine. L'utilizzo della memoria in particolare è un potenziale problema, poiché l'aumento del numero di processi in esecuzione può causare un maggiore overhead di memoria per processo. Non dovresti limitarti a implementare le chiavi dell'origine e sperare per il meglio.

Che relazione ha con l'isolamento multiorigine?

La definizione della chiave di origine dei cluster di agenti tramite l'intestazione Origin-Agent-Cluster è correlata, ma distinta, dall'isolamento cross-origin 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ò essere comunque utile oltre all'isolamento cross-origin, come ulteriore suggerimento al browser per modificare le sue strategie di allocazione delle risorse. Pertanto, ti consigliamo di valutare comunque la possibilità di applicare l'intestazione Origin-Agent-Cluster e di misurare i risultati anche nelle pagine già isolate multiorigine.

Come utilizzare l'intestazione Origin-Agent-Cluster

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

Origin-Agent-Cluster: ?1

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

È importante inviare questa intestazione a tutte le risposte dell'origine, non solo ad alcune pagine. In caso contrario, potresti ottenere risultati incoerenti, in cui il browser "ricorda" di aver visto una richiesta di impostazione della chiave di origine e quindi imposta la chiave di origine anche nelle pagine che non la richiedono. Oppure il contrario: se la prima pagina visitata da un utente non ha l'intestazione, il browser ricorderà che la tua origine non vuole essere basata sull'origine e ignorerà l'intestazione nelle pagine successive.

Perché il browser non rispetta sempre l'intestazione?

Il motivo di questa "memoria" è garantire la coerenza della definizione delle chiavi per un'origine. Se alcune pagine di un'origine erano basate su origini, mentre altre no, potresti avere due pagine con la stessa origine inserite in cluster di agenti diversi e quindi non autorizzate a comunicare tra loro. Sarebbe molto strano, sia per gli sviluppatori web sia per le parti interne del browser. Pertanto, la specifica per Origin-Agent-Cluster ignora l'intestazione se non è coerente con quanto rilevato in precedenza per una determinata origine. In Chrome, verrà visualizzato un avviso nella console.

Questa coerenza è limitata a un gruppo di contesti di navigazione, ovvero un gruppo di schede, finestre o iframe che possono comunicare tra loro tramite meccanismi come window.opener, frames[0] o window.parent. Ciò significa che, una volta impostata la chiave di origine o del sito di un'origine (a seconda che il browser veda o meno l'intestazione), per modificarla è necessario aprire una scheda completamente nuova, non collegata in alcun modo a quella precedente.

Questi dettagli possono essere importanti per testare l'intestazione Origin-Agent-Cluster. Quando lo aggiungi per la prima volta al tuo sito, non è sufficiente ricaricare la pagina. Dovrai chiudere la scheda e aprirne una nuova.

Per verificare se l'intestazione Origin-Agent-Cluster è applicata, utilizza la proprietà window.originAgentCluster di JavaScript. Il valore sarà true nei casi in cui l'intestazione (o altri meccanismi, come l'isolamento cross-origin) ha causato l'origine della chiave; false se non è stato così; 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 basati sull'origine.

La chiave di origine non è una funzionalità di sicurezza

Sebbene l'utilizzo di un cluster di agenti in base all'origine consenta di isolare l'origine dall'accesso sincrono da pagine cross-origin dello stesso sito, non offre la protezione delle intestazioni correlate alla sicurezza come Cross-Origin-Resource-Policy e Cross-Origin-Opener-Policy. In particolare, non è una protezione affidabile contro gli attacchi lato canale come Spectre.

Questo potrebbe sorprenderti, perché a volte l'origine con chiave può causare la creazione di un processo indipendente per l'origine e i processi separati sono una difesa importante contro gli attacchi lato canale. Tuttavia, tieni presente che l'intestazione Origin-Agent-Cluster è solo un suggerimento in merito. Il browser non ha alcun obbligo di assegnare alla tua 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 la pena dell'overhead di un processo separato. Ad esempio, su dispositivi Android con poca memoria o in Android WebView, Chrome utilizza il minor numero possibile di processi.

  • Il browser potrebbe voler rispettare la richiesta indicata dall'intestazione Origin-Agent-Cluster, ma potrebbe farlo utilizzando una tecnologia di isolamento diversa da quella delle procedure. Ad esempio, Chrome esamina la possibilità di utilizzare thread anziché processi per questo tipo di isolamento delle prestazioni.

  • L'utente o il codice in esecuzione su un altro sito potrebbe aver già visitato una pagina basata su un sito nella tua origine, attivando la garanzia di coerenza e ignorando completamente l'Origin-Agent-Cluster.

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

Feedback

Il team di Chrome vorrebbe ricevere tue notizie se utilizzi o stai valutando la possibilità di utilizzare l'Origin-Agent-Cluster header. Il tuo interesse e il tuo supporto ci aiutano a dare la priorità alle funzionalità e a mostrare agli altri fornitori di browser quanto siano importanti. Invia un tweet a @ChromiumDev e comunicate a Chrome DevRel le vostre 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. Se riscontri problemi con l'implementazione di Chrome, puoi segnalare un bug all'indirizzo new.crbug.com con il campo Componenti impostato 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: