Entendiendo "same-site" y "same-origin"

"same-site" y "same-origen" se citan con frecuencia, pero a menudo son términos que se malinterpretan. Por ejemplo, se mencionan en el contexto de transiciones de página, consultas fetch(), cookies, ventanas emergentes, recursos integrados y en iframes.

Origin

Origin

"Origin (Origen)" es una combinación de un esquema (también conocido como protocolo, por ejemplo HTTP o HTTPS), nombre de host y puerto (si se especifica). Por ejemplo, dada una URL de https://www.example.com:443/foo, el "origen" es https://www.example.com:443.

"same-origin" y "cross-origin"

Los sitios web que tienen la combinación del mismo esquema, nombre de host y puerto se consideran "same-origin (mismo origen)". Todo lo demás se considera "cross-origin (origen cruzado)".

Origen A Origen B Explicación de si el Origen A y B son "same-origin" o "cross-origin"
https://www.example.com:443 https: // www.evil.com:443 origen cruzado: diferentes dominios
https://example.com:443 origen cruzado: diferentes subdominios
https://login.example.com:443 origen cruzado: diferentes subdominios
http://www.example.com:443 origen cruzado: diferentes esquemas
https://www.example.com:80 origen cruzado: diferentes puertos
https://www.example.com:443 mismo origen: coincidencia exacta
https://www.example.com mismo origen: coincidencias de número de puerto implícito (443)

Sitio

Sitio

Los dominios de nivel superior (TLD) como .com y .org se enumeran en la Root Zone Database. En el ejemplo anterior, "sitio" es la combinación del TLD y la parte del dominio inmediatamente anterior. Por ejemplo, dada una URL de https://www.example.com:443/foo, el "sitio" es example.com.

Sin embargo, para dominios como .co.jp o .github.io , el simple hecho de usar el TLD de .jp o .io no es lo suficientemente detallado para identificar el "sitio". Y no hay forma de determinar algorítmicamente el nivel de dominios registrables para un TLD en particular. Es por eso que se creó una lista de "TLD efectivos" (eTLD). Estos se definen en la Public Suffix List (lista de sufijos públicos). La lista de eTLD es mantenida en publicsuffix.org/list.

El nombre completo del sitio se conoce como eTLD 1. Por ejemplo, dada una URL de https://my-project.github.io, el eTLD es .github.io y el eTLD 1 es my-project.github.io, que se considera un "sitio". En otras palabras, el eTLD 1 es el TLD efectivo y la parte del dominio inmediatamente anterior.

eTLD 1

"same-site" y "cross-site"

Los sitios web que tienen el mismo eTLD 1 se consideran "same-site (mismo sitio)". Los sitios web que tienen un eTLD 1 diferente son "cross-site (sitio cruzado)".

Origen A Origen B Explicación de si Origin A y B son "en el mismo sitio" o "entre sitios"
https://www.example.com:443 https://www.evil.com:443 sitio cruzado: diferentes dominios
https://login.example.com:443 mismo sitio: los diferentes subdominios no importan
http://www.example.com:443 mismo sitio: diferentes esquemas no importan
https://www.example.com:80 mismo sitio: los diferentes puertos no importan
https://www.example.com:443 mismo sitio: coincidencia exacta
https://www.example.com mismo sitio: los puertos no importan

"schemeful same-site"

schemeful same-site

La definición de "same-site" está evolucionando para considerar el esquema de URL como parte del sitio para evitar que HTTP se utilice como un canal débil. A medida que los navegadores adopten esta interpretación, es posible que veas referencias a "scheme-less same-site (mismo sitio sin esquema)" cuando se refiera a la definición anterior y "schemeful same-site (mismo sitio esquemático)" refiriéndose a la definición más estricta. En ese caso, http://www.example.com y https://www.example.com se consideran cross-site porque los esquemas no coinciden.

Origen A Origen B Explicación de si el origen A y B son "un mismo sitio intrépido"
https://www.example.com:443 https://www.evil.com:443 cross-site: diferentes dominios
https://login.example.com:443 mismo sitio esquemático: los diferentes subdominios no importan
http://www.example.com:443 sitio cruzado: diferentes esquemas
https://www.example.com:80 mismo sitio esquemático: diferentes puertos no importan
https://www.example.com:443 mismo sitio esquemático: coincidencia exacta
https://www.example.com mismo sitio esquemático: los puertos no importan

Cómo comprobar si una solicitud es "same-site", "same-origin" o "cross-site"

Chrome envía solicitudes junto con una cabecera HTTP de Sec-Fetch-Site. Ningún otro navegador es compatible con Sec-Fetch-Site partir de abril de 2020. Esto es parte de una propuesta más grande de Fetch Metadata Request Headers. La cabecera tendrá uno de los siguientes valores:

  • cross-site
  • same-site
  • same-origin
  • none

Al examinar el valor de Sec-Fetch-Site, puedes determinar si la solicitud es "same-site", "same-origin" o "cross-site" (el "schemeful-same-site" no se captura en Sec-Fetch-Site).