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

Un nuevo encabezado de respuesta HTTP para limitar la secuencia de comandos en todo el dominio y solicitar recursos exclusivos 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 síncrono de secuencias de comandos entre páginas de origen cruzado del mismo sitio. Los navegadores también pueden usar Origin-Agent-Cluster como sugerencia de que tu origen debe obtener sus propios recursos independientes, como un proceso dedicado.

Compatibilidad del navegador

Actualmente, el encabezado Origin-Agent-Cluster solo se implementa a partir de Chrome 88. Se diseñó en estrecha colaboración con representantes de Mozilla Firefox, que indicaron que vale la pena crear un prototipo, y cuenta con una recepción positiva preliminar de representantes de WebKit, el motor de navegador que usa Safari.

Sin embargo, mientras tanto, no hay problema con la implementación del encabezado Origin-Agent-Cluster para todos tus usuarios hoy mismo. Los navegadores que no lo comprendan simplemente lo ignorarán. Además, como las páginas de los clústeres de agentes con clave de origen pueden realizar menos tareas que las que tienen clave de sitio (configuración predeterminada), no debes preocuparte por ningún problema de interoperabilidad.

Por qué los navegadores no pueden segregar automáticamente los orígenes en el 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 está en 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 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 usaba demasiada memoria, provocaría que se fallara todo el navegador.

Hoy en día, los navegadores son más sofisticados y tratan de separar los distintos 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. Además, debido a que los procesos tienen cierta sobrecarga de memoria, utilizan heurísticas para evitar generar demasiados. Por ejemplo, Firefox tiene un límite de procesos que el usuario puede configurar, y Chrome varía su comportamiento entre el escritorio (donde la memoria es más abundante) y el dispositivo móvil (donde es escasa).

Estas heurísticas no son perfectas. Además, tienen una limitación importante: debido a que hay 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 automáticamente los subdominios entre sí.

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

Esta separación de aceptación permite a los navegadores dar a estos clústeres de agentes nuevos 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 obtener 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 exclusivos.

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 hablar con las páginas de origen cruzado del mismo sitio que antes estaban disponibles. En particular, considera lo siguiente:

  • 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 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 aquellos que hacen lo siguiente:

  • Funcionan mejor con sus propios recursos exclusivos siempre que sea posible. Entre los ejemplos, se incluyen juegos de alto rendimiento, sitios de videoconferencias o apps de creación multimedia.

  • Contiene iframes de muchos recursos que tienen orígenes diferentes, pero el mismo sitio. Por ejemplo, si https://mail.example.com incorpora iframes de https://chat.example.com, la clave de origen https://mail.example.com/ garantiza que el código que escribe el equipo de chat no pueda interferir por accidente en el código que escribe el equipo de correo y puede indicarle al navegador que realice procesos independientes para programarlos de forma independiente y disminuir su impacto en el rendimiento entre sí.

  • Se espera que esté incorporado en páginas de origen diferente y del mismo sitio, pero se sabe que consumen 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, a fin de cuentas, estas son solo algunas pautas. 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 generar una mayor sobrecarga de memoria por proceso). No deberías implementar las claves 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, pero independiente, del aislamiento de origen cruzado 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 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, 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

Si deseas usar el encabezado Origin-Agent-Cluster, configura el servidor web para enviar 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 clave de origen y, por lo tanto, agrega 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 el origen no desea tener clave de origen y ignorará el encabezado en las páginas siguientes.

¿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 claves de origen, mientras que otras no, podrías tener dos páginas del mismo origen que se colocaran en clústeres de agente diferentes y, por lo tanto, no se les permitiera 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, 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í 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 por primera vez a tu sitio, no podrás volver a cargar la página; tendrás que 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 los que el encabezado (o algún otro mecanismo, como el aislamiento de origen cruzado) haya causado la clave de origen; false cuando no lo hizo, y undefined en navegadores que no implementen el encabezado Origin-Agent-Cluster. Registrar estos datos en tu plataforma de estadísticas puede proporcionar una verificación valiosa de que configuraste el 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 las páginas de origen cruzado del mismo sitio, no proporciona 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 sorprenderte un poco, ya que las claves de origen a veces pueden hacer que tu origen obtenga 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 pista en ese sentido. El navegador no tiene la obligación de darle un proceso separado a tu origen, y es posible que no lo haga por varias razones:

  • Es posible que un navegador no implemente la tecnología para hacerlo. Por ejemplo, en la actualidad, 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 separado. 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 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 haya navegado a una página con clave de sitio en tu origen, lo que hace 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 pensar en 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 insinúa que tu origen se beneficiaría de recursos exclusivos (y que estás dispuesto a renunciar a ciertas funciones a cambio).

Comentarios

Al equipo de Chrome le encantaría saber si usas el encabezado Origin-Agent-Cluster o si piensas usarlo. Tu interés público y apoyo nos ayudan a priorizar funciones y mostrar a otros proveedores de navegadores lo importantes que son. Twittea a @ChromiumDev y deja que Chrome DevRel conozca tus ideas y experiencias.

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. Si tienes algún problema con la implementación de Chrome, puedes informar un error en new.crbug.com con el campo Componentes establecido en 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: