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

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

Domenica Denicola
Domenica Denicola

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

Compatibilità del browser

Attualmente l'intestazione Origin-Agent-Cluster è implementata solo a partire da Chrome 88. È stato progettato in stretta collaborazione con i rappresentanti di Mozilla Firefox che l'hanno contrassegnato come valido per la prototipazione e ha un'opinione positiva preliminare da parte dei rappresentanti di WebKit, il motore dei browser utilizzato da Safari.

Nel frattempo, non c'è problema con il deployment dell'intestazione Origin-Agent-Cluster a tutti i tuoi utenti oggi. I browser che non la capiscono e lo ignorano. Inoltre, poiché le pagine nei cluster di agenti in base all'origine possono effettivamente svolgere meno operazioni rispetto a quelle in base al sito (l'impostazione predefinita), non c'è alcun problema di interoperabilità di cui preoccuparsi.

Perché i browser non possono separare automaticamente le origini dello stesso sito

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

Dietro le quinte, i browser utilizzano la separazione fornita in diversi modi dalle origini. In passato, anche se origini diverse non potevano accedere ai dati dell'altra, condividevano comunque risorse come i thread del sistema operativo, i processi e l'allocazione della memoria. Ciò significa che, se una scheda era lenta, rallentava tutte le altre. Oppure, se una scheda usava troppa memoria, il browser si arrestava in modo anomalo.

Al giorno d'oggi i browser sono più sofisticati e provano a separare origini diverse in processi differenti. Il funzionamento di questa procedura varia a seconda del 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. Poiché i processi comportano un certo sovraccarico di memoria, utilizzano le euristiche per evitare di generare troppe informazioni. Ad esempio, Firefox ha un limite di processi configurabile dall'utente e Chrome varia il suo comportamento a seconda che si tratti di computer desktop (dove la memoria è più elevata) e di dispositivi mobili (dove è scarsa).

Queste euristiche non sono perfette. Inoltre, soffrono di un'importante limitazione: perché esistono eccezioni al criterio della stessa origine che consente 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 con chiave del sito", ovvero le pagine dei gruppi del browser in base al relativo 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 la stessa origine. In particolare, le pagine multiorigine dello stesso sito verranno escluse dal cluster di agenti.

Questa separazione tramite 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 avere un proprio processo o essere pianificate in thread separati. Se aggiungi l'intestazione Origin-Agent-Cluster alla pagina, indichi al browser che la pagina può trarre vantaggio da queste risorse dedicate.

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

Che cosa non possono fare le pagine con chiave di origine

Quando la tua pagina si trova in un cluster di agenti in base all'origine, rinunci ad alcune possibilità 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 in genere consente alle pagine multiorigine dello stesso sito di accedere in modo sincrono al DOM dell'altro sito, ma nei cluster di agenti con chiave di origine viene disattivata.

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

  • (Solo per 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 che maggiormente traggono vantaggio dall'intestazione Origin-Agent-Cluster sono quelle che:

  • Ottieni i migliori risultati con le loro risorse dedicate, se possibile. Alcuni esempi sono giochi che richiedono prestazioni elevate, siti di videoconferenza o app per la creazione di contenuti multimediali.

  • Contiene iframe che consumano molte risorse di origine diversa, ma dello stesso sito. Ad esempio, se https://mail.example.com incorpora iframe https://chat.example.com, la chiave 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 fornire processi separati per pianificarli in modo indipendente e ridurre l'impatto reciproco sulle prestazioni.

  • Devono essere incorporate in pagine di un'origine diversa e dello stesso sito, ma con la consapevolezza che il loro utilizzo richiede molte risorse. Ad esempio, se https://customerservicewidget.example.com prevede di utilizzare molte risorse per la videochiamata e sarà incorporato su varie origini in https://*.example.com, il team che gestisce quel widget potrebbe usare l'intestazione Origin-Agent-Cluster per cercare di ridurre l'impatto sulle prestazioni degli incorporatori.

Inoltre, dovrai assicurarti di accettare la disattivazione delle funzionalità di comunicazione multiorigine usate raramente e che il tuo sito utilizzi HTTPS.

Alla fine, però, si tratta solo di linee guida. Mediante le misurazioni, i cluster di agenti in base all'origine aiuteranno o meno il tuo sito. In particolare, ti consigliamo di misurare i tuoi Segnali web e, potenzialmente, il tuo utilizzo della memoria, per valutare l'impatto del keying delle origini. (L'utilizzo della memoria in particolare è un potenziale problema, poiché l'aumento del numero di processi in riproduzione può causare un maggiore sovraccarico di memoria per processo). Non dovresti limitarti a implementare la chiave di origine e sperare che tutto vada 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, dall'isolamento multiorigine tramite le intestazioni Cross-Origin-Opener-Policy e Cross-Origin-Embedder-Policy.

Qualsiasi sito con isolamento multiorigine disattiverà anche le stesse funzionalità di comunicazione multiorigine dello stesso sito utilizzate per l'utilizzo dell'intestazione Origin-Agent-Cluster. Tuttavia, l'intestazione Origin-Agent-Cluster può comunque essere utile oltre all'isolamento multiorigine, come suggerimento aggiuntivo al browser per modificare l'euristica di allocazione delle risorse. Ti consigliamo quindi di applicare l'intestazione Origin-Agent-Cluster e di 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 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 booleano true.

È importante inviare questa intestazione a tutte le risposte provenienti dalla tua origine, non solo ad alcune pagine. Altrimenti, puoi ottenere risultati incoerenti, in cui il browser "ricorda" di aver visto una richiesta di chiave di origine e quindi usa chiavi originari anche su pagine che non la richiedono. Oppure, il contrario: se la prima pagina visitata da un utente non ha l'intestazione, il browser ricorderà che l'origine non vuole essere associata alla chiave di origine e ignorerà l'intestazione nelle pagine successive.

Perché il browser non può sempre rispettare l'intestazione?

Questa "memoria" ha lo scopo di garantire la coerenza delle chiavi di un'origine. Se alcune pagine di un'origine avevano la chiave di origine e altre no, potresti avere due pagine della stessa origine che sono state inserite in cluster di agenti diversi e quindi non potevano comunicare tra loro. Questo sarebbe molto strano, sia per gli sviluppatori web che per l'interno del browser. Di conseguenza, la specifica di Origin-Agent-Cluster ignora l'intestazione se non è coerente con ciò che è stato visto in precedenza per una determinata origine. In Chrome verrà visualizzato un avviso della console.

Questa coerenza ha come ambito un gruppo di contesti di navigazione, ovvero un gruppo di schede, finestre o iframe che possono connettersi tra loro tramite meccanismi come window.opener, frames[0] o window.parent. Ciò significa che, una volta stabilita la chiave dell'origine o del sito di un'origine (il browser vede o non vede l'intestazione), la modifica richiede l'apertura di una scheda completamente nuova, non collegata in alcun modo alla vecchia.

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

Per verificare se viene applicata l'intestazione Origin-Agent-Cluster, utilizza la proprietà JavaScript window.originAgentCluster. Sarà true nei casi in cui l'intestazione (o altri meccanismi, come l'isolamento multiorigine) ha causato la chiave dell'origine; false quando non lo ha fatto e undefined nei browser che non implementano l'intestazione Origin-Agent-Cluster. La registrazione di questi dati sulla tua piattaforma di analisi può fornire un utile controllo della corretta configurazione del server.

Infine, tieni presente che l'intestazione Origin-Agent-Cluster funziona solo in contesti sicuri, ad esempio sulle 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

Sebbene 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 rappresenta una protezione affidabile contro gli attacchi sul canale laterale come Spectre.

Questo potrebbe sorprendere, dato che a volte la chiave dell'origine può far sì che l'origine riceva il proprio processo e processi separati siano un'importante difesa contro gli attacchi side-channel. Ricorda, però, che l'intestazione Origin-Agent-Cluster è solo un'indicazione. 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 questa tecnologia. 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 l'overhead di un processo separato. Ad esempio, sui dispositivi Android con memoria insufficiente 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, utilizzando una tecnologia di isolamento diversa rispetto ai processi. Ad esempio, Chrome esplora i thread anziché i processi per questo tipo di isolamento delle prestazioni.

  • L'utente o il codice in esecuzione su un sito diverso potrebbe aver già raggiunto una pagina con chiave del sito nella tua origine, il che significa che viene attivata la garanzia di coerenza e l'intestazione Origin-Agent-Cluster viene ignorata completamente.

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

Feedback

Se stai utilizzando o stai considerando l'utilizzo dell'intestazione Origin-Agent-Cluster, il team di Chrome vorrebbe ricevere la tua opinione. Il tuo interesse pubblico e il tuo supporto ci aiutano a definire la priorità delle funzionalità e a mostrare ad altri fornitori di browser la loro importanza. Scrivi un tweet all'indirizzo @ChromiumDev e fai conoscere a Chrome DevRel le tue opinioni ed esperienze.

Se hai altre domande sulle specifiche o sui dettagli del funzionamento della funzionalità, puoi segnalare un problema nel repository HTML Standard GitHub. Inoltre, 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 scoprire di più sui cluster di agenti in base all'origine, puoi consultare i dettagli a questi link: