Solicita el aislamiento de rendimiento con el encabezado Origin-Agent-Cluster

Un encabezado de respuesta HTTP nuevo para limitar la secuencia de comandos en todo el dominio y solicitar recursos exclusivos del navegador.

Doménico Denícola
Domenic Denicola

Origin-Agent-Cluster es un nuevo encabezado de respuesta HTTP que le indica al navegador que evite el acceso de secuencias de comandos síncronas entre páginas de origen cruzado del mismo sitio. Los navegadores también pueden usar Origin-Agent-Cluster como una sugerencia de que tu origen debe tener sus propios recursos independientes, por ejemplo, un proceso dedicado.

Compatibilidad del navegador

Actualmente, el encabezado Origin-Agent-Cluster solo se implementa a partir de Chrome 88. Se diseñó en colaboración con representantes de Mozilla Firefox que lo marcaron como prototipado y cuenta con una recepción positiva preliminar de representantes de WebKit, el motor del navegador que usa Safari.

Mientras tanto, no hay problema con la implementación del encabezado Origin-Agent-Cluster para todos tus usuarios. Los navegadores que no lo comprendan simplemente la ignorarán. Además, como las páginas en los clústeres de agentes con clave de origen en realidad pueden hacer menos cosas que las con clave de sitio (opción predeterminada), no hay que preocuparse por este problema de interoperabilidad.

Por qué los navegadores no pueden segregar automáticamente los orígenes del mismo sitio

La Web se basa en la política del mismo origen, que es una función de seguridad que restringe la forma en que los documentos y las secuencias de comandos pueden interactuar con recursos de otro origen. Por ejemplo, una página alojada en https://a.example tiene un origen diferente de uno en https://b.example o uno en https://sub.a.example.

En segundo plano, los navegadores usan la separación que proporcionan los orígenes de diferentes maneras. En el pasado, aunque diferentes orígenes no podían acceder a los datos del otro, aún compartían recursos como subprocesos del sistema operativo, procesos y asignación de memoria. Por lo tanto, si una pestaña estaba lenta, se ralentizarían todas las demás. O, si una pestaña usaba demasiada memoria, se bloqueaba todo el navegador.

Hoy en día, los navegadores son más sofisticados y tratan de separar distintos orígenes en procesos distintos. La manera exacta en que funciona esto varía según el navegador: la mayoría de los navegadores tienen algún nivel de separación entre las pestañas, pero los diferentes iframes dentro de una sola pestaña pueden compartir un proceso. Además, debido a que los procesos tienen cierta sobrecarga de memoria, usan heurísticas para evitar la generación de demasiados: por ejemplo, Firefox tiene un límite de procesos configurables por el usuario, y Chrome varía su comportamiento entre computadoras (donde la memoria es más abundante) y dispositivos móviles (donde es escasa).

Estas heurísticas no son perfectas. Además, tienen una limitación importante: debido a que existen excepciones a la política del mismo origen que permiten que los subdominios como https://sub.a.example y https://a.example se comuniquen entre sí, los navegadores no pueden segregar los subdominios automáticamente.

Este comportamiento predeterminado se denomina “clústeres de agentes con clave de sitio”: el navegador agrupa páginas según su sitio. El nuevo encabezado Origin-Agent-Cluster le solicita al navegador que cambie este comportamiento predeterminado para una página determinada y lo coloque en un clúster de agentes con clave de origen, de modo que se agrupe solo con otras páginas que tengan exactamente el mismo origen. En particular, las páginas de origen cruzado en el mismo sitio se excluirán del clúster de agente.

Esta separación de aceptación permite que los navegadores otorguen a estos nuevos clústeres de agentes con clave de origen sus propios recursos dedicados, que no se combinan con los de otros orígenes. Por ejemplo, esas páginas podrían tener su propio proceso o programarse en subprocesos separados. Si agregas el encabezado Origin-Agent-Cluster a tu página, le indicas al navegador que esta se beneficiaría de esos recursos dedicados.

Sin embargo, para realizar la separación y obtener estos beneficios, el navegador debe inhabilitar algunas funciones heredadas.

Qué no pueden hacer las páginas con clave de origen

Cuando tu página está en un clúster de agentes con clave de origen, renuncias a algunas capacidades para comunicarte con las páginas de origen cruzado del mismo sitio que antes estaban disponibles. En particular:

  • Ya no puedes configurar document.domain. Esta es una función heredada que, por lo general, permite que las páginas de origen cruzado en el mismo sitio accedan de forma síncrona a cada DOM del otro, pero está inhabilitada en los clústeres de agentes con clave de origen.

  • Ya no puedes enviar objetos WebAssembly.Module a otras páginas de origen cruzado del mismo sitio a través de postMessage().

  • (Solo para Chrome) Ya no puedes enviar objetos SharedArrayBuffer ni WebAssembly.Memory a otras páginas de origen cruzado del mismo sitio.

Cuándo usar clústeres de agentes con clave de origen

Los orígenes que más se benefician del encabezado Origin-Agent-Cluster son los que se indican a continuación:

  • Se desempeñan mejor con sus propios recursos dedicados cuando es posible. Algunos ejemplos incluyen juegos de alto rendimiento, sitios de videoconferencias o apps de creación multimedia.

  • Contiene iframes que consumen muchos recursos y tienen un origen diferente, pero el mismo sitio. Por ejemplo, si https://mail.example.com incorpora iframes https://chat.example.com, la clave de origen https://mail.example.com/ garantiza que el código que escribe el equipo de chat no interfiera accidentalmente con el código que escribe el equipo de correo y puede sugerirle al navegador procesos separados para programarlos de manera independiente y disminuir su impacto en el rendimiento entre sí.

  • Si bien se espera que estén incorporados en páginas de origen diferente y del mismo sitio, deben estar seguros de que requieren un uso intensivo de los recursos. Por ejemplo, si https://customerservicewidget.example.com espera usar muchos recursos para el videochat y se incorporará en varios orígenes a lo largo de https://*.example.com, el equipo que mantiene ese widget podría usar el encabezado Origin-Agent-Cluster para intentar disminuir su impacto en el rendimiento en las incorporaciones.

Además, también deberás asegurarte de que aceptas inhabilitar las funciones de comunicación de origen cruzado que se mencionaron anteriormente y de que tu sitio usa HTTPS.

Pero, en definitiva, estas son solo pautas. En última instancia, lo mejor es mediante mediciones si los clústeres de agentes con clave de origen ayudarán o no a tu sitio. En particular, te recomendamos que midas tus Métricas web y, potencialmente, el uso de memoria para ver qué impacto tiene la clave de origen. (En particular, el uso de memoria es una preocupación potencial, ya que aumentar la cantidad de procesos en juego puede generar más sobrecarga de memoria por proceso). No deberías solo implementar la clave de origen y esperar lo mejor.

¿Cómo se relaciona esto con el aislamiento de origen cruzado?

La clave de origen de los clústeres de agentes a través del encabezado Origin-Agent-Cluster está relacionada con el aislamiento de origen cruzado, aunque es independiente de él, mediante los encabezados Cross-Origin-Opener-Policy y Cross-Origin-Embedder-Policy.

Cualquier sitio que esté aislado de origen cruzado también inhabilitará las mismas funciones de comunicación de origen cruzado en el mismo sitio que cuando se use el encabezado Origin-Agent-Cluster. Sin embargo, el encabezado Origin-Agent-Cluster puede ser útil además del aislamiento de origen cruzado, como una sugerencia adicional para que el navegador modifique su heurística de asignación de recursos. Por lo tanto, debes considerar aplicar el encabezado Origin-Agent-Cluster y medir los resultados, incluso en páginas que ya están aisladas entre orígenes cruzados.

Cómo usar el encabezado Origin-Agent-Cluster

Para usar el encabezado Origin-Agent-Cluster, configura tu servidor web para que envíe el siguiente encabezado de respuesta HTTP:

Origin-Agent-Cluster: ?1

El valor de ?1 es la sintaxis del encabezado estructurado para un valor true booleano.

Es importante enviar este encabezado en todas las respuestas del origen, no solo en algunas páginas. De lo contrario, puedes obtener resultados incoherentes, en los que el navegador "recuerda" haber visto una solicitud de clave de origen y, por lo tanto, crea claves de origen incluso en páginas que no la solicitan. O viceversa: si la primera página que visita un usuario no tiene el encabezado, el navegador recordará que tu origen no desea usar una clave de origen y, por lo tanto, ignorará el encabezado en las páginas posteriores.

¿Por qué el navegador no siempre puede respetar el encabezado?

El motivo de esta "memoria" es garantizar la coherencia de la clave para un origen. Si algunas páginas de un origen tuvieran clave de origen, mientras que otras no, podrías tener dos páginas del mismo origen que se ubicaran en diferentes clústeres de agentes y, por lo tanto, no se les permitiera comunicarse entre sí. Esto sería muy extraño para los desarrolladores web y para los componentes internos del navegador. Por lo tanto, la especificación de Origin-Agent-Cluster ignora el encabezado si no es coherente con lo que se vio anteriormente para un origen determinado. En Chrome, se mostrará una advertencia en la consola.

Esta coherencia se limita a un grupo de contexto de navegación, que es un grupo de pestañas, ventanas o iframes que pueden comunicarse entre sí a través de mecanismos como window.opener, frames[0] o window.parent. Esto significa que, una vez que se establece el origen o la clave de sitio (cuando el navegador ve o no ve el encabezado), para cambiarlo, se debe abrir una pestaña completamente nueva, que no esté conectada a la anterior de ninguna manera.

Estos detalles pueden ser importantes para probar el encabezado Origin-Agent-Cluster. Cuando la agregues por primera vez a tu sitio, no podrás volver a cargar la página. Deberás cerrar la pestaña y abrir una nueva.

Para verificar si se aplica el encabezado Origin-Agent-Cluster, usa la propiedad window.originAgentCluster de JavaScript. Este será true en los casos en que el encabezado (o algún otro mecanismo, como el aislamiento de origen cruzado) causó la clave de origen; false cuando no lo hizo, y undefined en navegadores que no implementan el encabezado Origin-Agent-Cluster. El registro de estos datos en tu plataforma de estadísticas puede proporcionar una verificación valiosa de que configuraste tu servidor de forma correcta.

Por último, ten en cuenta que el encabezado Origin-Agent-Cluster solo funcionará en contextos seguros, es decir, en páginas HTTPS o en http://localhost. Las páginas HTTP que no son de host local no admiten clústeres de agentes con clave de origen.

La clave de origen no es una función de seguridad

Si bien el uso de un clúster de agentes con clave de origen aísla el origen del acceso síncrono de páginas de origen cruzado en el mismo sitio, no otorga la protección de los encabezados relacionados con la seguridad, como Cross-Origin-Resource-Policy y Cross-Origin-Opener-Policy. En particular, no es una protección confiable contra ataques de canal lateral como Spectre.

Esto puede resultar sorprendente, ya que a veces la clave de origen puede hacer que el origen tenga su propio proceso, y los procesos independientes son una defensa importante contra los ataques de canal lateral. Sin embargo, recuerda que el encabezado Origin-Agent-Cluster es solo una sugerencia en ese sentido. El navegador no tiene ninguna obligación de otorgarle a tu origen un proceso independiente, y es posible que no lo haga por varios motivos:

  • Es posible que un navegador no implemente la tecnología para hacerlo. Por ejemplo, actualmente Safari y Firefox pueden colocar pestañas separadas en sus propios procesos, pero aún no pueden hacerlo en el caso de los iframes.

  • El navegador podría decidir que no vale la pena la sobrecarga de un proceso independiente. Por ejemplo, en dispositivos Android con poca memoria o en WebView de Android, Chrome usa la menor cantidad de procesos posible.

  • Es posible que el navegador quiera respetar la solicitud que indica el encabezado Origin-Agent-Cluster, pero podría hacerlo con una tecnología de aislamiento diferente de la de los procesos. Por ejemplo, para este tipo de aislamiento de rendimiento, Chrome explora subprocesos en lugar de procesos.

  • Es posible que el usuario (o el código que se ejecuta en otro sitio) ya haya navegado a una página con clave de sitio en tu origen, lo que provoca que se active la garantía de coherencia y que se ignore por completo el encabezado Origin-Agent-Cluster.

Por estos motivos, es importante no considerar los clústeres de agentes con clave de origen como una función de seguridad. En cambio, es una forma de ayudar al navegador a priorizar la asignación de recursos, ya que sugiere que tu origen se beneficiaría de recursos dedicados (y que estás dispuesto a renunciar a ciertas funciones a cambio).

Comentarios

Al equipo de Chrome le encantaría saber tu opinión si usas o consideras usar el encabezado Origin-Agent-Cluster. Tu interés público y tu apoyo nos ayudan a priorizar funciones y mostrar a otros proveedores de navegadores lo importantes que son. Twittea a @ChromiumDev y permite que Chrome DevRel conozca tus pensamientos y experiencias.

Si tienes más preguntas sobre la especificación o los detalles de cómo funciona la función, puedes informar un problema en el repositorio de GitHub de HTML estándar. Si tienes algún problema con la implementación de Chrome, puedes informar un error en new.crbug.com, en el campo Componentes, el valor Internals>Sandbox>SiteIsolation.

Más información

Para obtener más información sobre los clústeres de agentes con clave de origen, puedes profundizar en los detalles en estos vínculos: