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

Un nuevo encabezado de respuesta HTTP para limitar las secuencias de comandos en todo el dominio y solicitar recursos dedicados del navegador.

Domenic Denicola
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 en el mismo sitio. Los navegadores también pueden usar Origin-Agent-Cluster como una sugerencia de que tu origen debe obtener sus propios recursos separados, como un proceso dedicado.

Compatibilidad del navegador

Actualmente, el encabezado Origin-Agent-Cluster solo se implementa en Chrome 88 y versiones posteriores. Se diseñó en estrecha colaboración con representantes de Mozilla Firefox, quienes lo marcaron como vale la pena crear un prototipo, y tiene una recepción preliminar positiva por parte de representantes de WebKit, el motor de navegador que usa Safari.

Mientras tanto, no hay problema en implementar el encabezado Origin-Agent-Cluster para todos tus usuarios hoy mismo. Los navegadores que no la comprendan la ignorarán. Además, como las páginas en clústeres de agentes con clave de origen pueden hacer menos tareas que las que tienen clave de sitio (la opción predeterminada), no hay problemas de interoperabilidad por los que debas preocuparte.

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

La Web se basa en la política de mismo origen, que es una función de seguridad que limita 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 una que se encuentra en https://b.example o 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 distintos orígenes no podían acceder a los datos de los demás, aun así compartían recursos como subprocesos del sistema operativo, procesos y asignación de memoria. Esto significaba que si una pestaña era lenta, ralentizaría todas las demás. O si una pestaña usara demasiada memoria, se bloquearía todo el navegador.

En la actualidad, los navegadores son más sofisticados y tratan de separar los diferentes orígenes en diferentes procesos. La forma exacta en que funciona esto varía según el navegador: la mayoría de los navegadores tienen cierto nivel de separación entre las pestañas, pero los diferentes iframes dentro de una sola pestaña pueden compartir un proceso. Y como los procesos incluyen una sobrecarga de memoria, usan heurísticas para evitar generar demasiados: por ejemplo, Firefox tiene un límite de procesos configurable por el usuario, y Chrome varía su comportamiento entre computadoras de escritorio (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: como hay excepciones a la política de origen que permiten que subdominios como https://sub.a.example y https://a.example se comuniquen entre sí, los navegadores no pueden separar automáticamente los subdominios entre sí.

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

Esta separación con solicitud de aceptación permite que los navegadores les proporcionen 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. Cuando agregas el encabezado Origin-Agent-Cluster a tu página, le indicas al navegador que la página 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 se encuentra en un clúster de agentes con clave de origen, renuncias a algunas capacidades para comunicarte con páginas de origen cruzado del mismo sitio que estaban disponibles anteriormente. 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 del mismo sitio accedan de forma síncrona al 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 en el 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 cumplen con las siguientes características:

  • Rendimiento óptimo con sus propios recursos dedicados cuando sea posible Algunos ejemplos son juegos que requieren un alto rendimiento, sitios de videoconferencia o apps de creación de contenido multimedia.

  • Contiene iframes de muchos recursos que tienen orígenes diferentes, pero el mismo sitio. Por ejemplo, si https://mail.example.com incorpora iframes https://chat.example.com, la codificación de origen https://mail.example.com/ garantiza que el código escrito por el equipo de chat no pueda interferir accidentalmente con el código escrito por el equipo de correo electrónico y puede sugerirle al navegador que les proporcione procesos separados para programarlos de forma independiente y disminuir su impacto en el rendimiento entre sí.

  • Se espera que se incorporen en páginas del mismo sitio con diferentes orígenes, pero se sabe que requieren muchos recursos. Por ejemplo, si https://customerservicewidget.example.com espera usar muchos recursos para 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 los incorporaciones.

Además, también deberás asegurarte de que estás de acuerdo con inhabilitar las funciones de comunicación de origen cruzado que se usan con poca frecuencia y que tu sitio usa HTTPS.

Pero, al final, estos son solo lineamientos. La mejor forma de determinar si los clústeres de agentes con clave de origen ayudarán a tu sitio o no es mediante las mediciones. En particular, te recomendamos medir tus Métricas web y posiblemente tu uso de memoria para ver qué impacto tiene la clave de origen. (El uso de memoria en particular es una posible preocupación, ya que aumentar la cantidad de procesos en juego puede causar más sobrecarga de memoria por proceso). No debes implementar la codificación de origen y esperar lo mejor.

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

La asignación de claves de origen de los clústeres de agentes a través del encabezado Origin-Agent-Cluster está relacionada con el aislamiento entre orígenes, pero es independiente de él, a través de los encabezados Cross-Origin-Opener-Policy y Cross-Origin-Embedder-Policy.

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

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 booleano true.

Es importante enviar este encabezado en todas las respuestas de tu 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 codificación de origen y, por lo tanto, aplica la codificación 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 el origen no desea tener clave de origen y ignorará el encabezado en las páginas siguientes.

El motivo de esta "memoria" es garantizar la coherencia de la asignación de claves para un origen. Si algunas páginas de un origen tenían una clave de origen, mientras que otras no, podrías tener dos páginas del mismo origen que se colocaron en diferentes clústeres de agentes y, por lo tanto, no podían comunicarse entre sí. Esto sería muy extraño, tanto para los desarrolladores web como para la parte interna del navegador. Por lo tanto, la especificación para Origin-Agent-Cluster ignorará el encabezado si no es coherente con lo que se vio antes para un origen determinado. En Chrome, esto generará una advertencia de 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í con mecanismos como window.opener, frames[0] o window.parent. Esto significa que, una vez que se establece la clave de origen o de sitio de un origen (el navegador puede ver o no ver el encabezado), es necesario 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 a tu sitio por primera vez, no será suficiente con 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. Será true en los casos en que el encabezado (o algún otro mecanismo, como el aislamiento de origen cruzado) haya causado la codificación de origen, false cuando no lo haya hecho y undefined en los navegadores que no implementen 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 correctamente tu servidor.

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 localhost no admiten clústeres de agentes con clave de origen.

La codificación 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 tu origen del acceso síncrono desde páginas del mismo sitio entre dominios, no proporciona la protección de 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 ser un poco sorprendente, ya que la clave de origen a veces puede hacer que tu origen tenga su propio proceso, y los procesos separados 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 asignarle un proceso independiente a tu origen 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 para los iframes.

  • El navegador puede 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 posible de procesos.

  • 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 distinta de la de los procesos. Por ejemplo, Chrome explora subprocesos en lugar de procesos para este tipo de aislamiento de rendimiento.

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

Por estos motivos, es importante no considerar a 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 exclusivos (y que estás dispuesto a renunciar a determinadas funciones a cambio).

Comentarios

Al equipo de Chrome le encantaría saber si usas o estás considerando usar el encabezado Origin-Agent-Cluster. Tu interés y apoyo público nos ayudan a priorizar las funciones y mostrar a otros proveedores de navegadores lo importantes que son. Twittea a @ChromiumDev y comparte tus pensamientos y experiencias con el equipo de Chrome DevRel.

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

Más información

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