Los términos "same-site" y "same-origin" se citan con frecuencia, pero a menudo se malinterpretan. Por ejemplo, se mencionan en el contexto de las transiciones de página, las solicitudes fetch()
, las cookies, la apertura de ventanas emergentes, los recursos incorporados y los iframes.
Origen
“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, con una URL 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, el mismo nombre de host y el mismo puerto se consideran "mismo origen". Todo lo demás se considera "origen cruzado".
Origen A | Origen B | Explicación de si los orígenes A y B son "mismo origen" o "origen cruzado" |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | origen cruzado: dominios diferentes |
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: puertos diferentes | |
https://www.example.com:443. | same-origin: concordancia exacta | |
https://www.example.com | same-origin: Implícito coincide el número de puerto (443) |
Sitio
Los dominios de nivel superior (TLD), como .com
y .org
, se enumeran en la base de datos de la zona raíz. En el ejemplo anterior, "sitio" es la combinación del esquema, el TLD y la parte del dominio justo antes de él (lo llamamos TLD+1). Por ejemplo, con una URL https://www.example.com:443/foo
, el "sitio" es https://example.com
.
Lista de sufijos públicos y eTLD
En el caso de los dominios que incluyen elementos como .co.jp
o .github.io
, el uso de .jp
o .io
no es lo suficientemente detallado como para identificar el "sitio". No hay forma de determinar algorítmicamente el nivel de los dominios registrables para un TLD en particular.
Por eso se creó una lista de sufijos públicos definidos en la Lista de sufijos públicos. Estos sufijos públicos también se denominan TLD efectivos (eTLD). La lista de eTLD se mantiene en publicsuffix.org/list.
Para identificar la parte del "sitio" de un dominio que incluye un eTLD, aplica la misma práctica que el ejemplo con .com
. Tomando https://www.project.github.io:443/foo
como ejemplo, el esquema es https
, el eTLD es .github.io
y el eTLD+1 es project.github.io
, por lo que https://project.github.io
se considera el "sitio" para esta URL.
"mismo sitio" y "entre sitios"
Los sitios web que tienen el mismo esquema y el mismo eTLD+1 se consideran "mismo sitio". Los sitios web que tienen un esquema o un eTLD+1 diferente se consideran "entre sitios".
Origen A | Origen B | Explicación de si los orígenes A y B son "mismo sitio" o "entre sitios" |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | entre sitios: diferentes dominios |
https://login.example.com:443. | same-site: No importan los diferentes subdominios | |
http://www.example.com:443. | entre sitios: diferentes esquemas | |
https://www.example.com:80 | same-site: Los diferentes puertos no importan | |
https://www.example.com:443. | same-site: concordancia exacta | |
https://www.example.com | same-site: Los puertos no son importantes |
"mismo sitio sin esquemas"
La definición de "mismo sitio" evolucionó para considerar el esquema de URL como parte del sitio a fin de evitar que HTTP se use como un canal débil.
El concepto anterior de "mismo sitio" sin comparación de esquemas ahora se llama "mismo sitio sin esquemas". Por ejemplo, http://www.example.com
y https://www.example.com
se consideran en el mismo sitio sin esquema, pero no en el mismo sitio, porque solo importa la parte eTLD+1 y no se tiene en cuenta el esquema.
Origen A | Origen B | Explicación de si los orígenes A y B son "un mismo sitio sin esquema" |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | entre sitios: diferentes dominios |
https://login.example.com:443. | Un mismo sitio sin esquema: los diferentes subdominios no son importantes | |
http://www.example.com:443. | Un mismo sitio sin esquema: los esquemas diferentes no importan | |
https://www.example.com:80 | Un mismo sitio sin esquema: los diferentes puertos no son importantes | |
https://www.example.com:443. | mismo sitio sin esquema: concordancia exacta | |
https://www.example.com | un mismo sitio sin esquema: los puertos no importan |
Cómo verificar si una solicitud es del tipo "same-site", "same-origin" o "cross-site"
Todos los navegadores modernos (Safari admite próximamente) envían solicitudes junto con un encabezado HTTP Sec-Fetch-Site
. El encabezado tiene uno de los siguientes valores:
cross-site
same-site
same-origin
none
Si examinas el valor de Sec-Fetch-Site
, podrás determinar si la solicitud es "same-site", "same-origin" o "cross-site".