Los términos "Mismo sitio" y "mismo origen" se citan con frecuencia, pero a menudo se malinterpretan. Por ejemplo, se usan en el contexto de transiciones de páginas, solicitudes fetch()
, cookies, apertura de ventanas emergentes, iframes y recursos incorporados. En esta página, se explica qué son y en qué se diferencian.
Origen
“Origen” es una combinación de un esquema (también conocido como protocolo, por ejemplo, HTTP o HTTPS), un nombre de host y un puerto (si se especifica). Por ejemplo, con una URL https://www.example.com:443/foo
, el "origen" es https://www.example.com:443
.
"Mismo origen" y "multiorigen"
Los sitios web que tienen la misma combinación de esquema, nombre de host y puerto se consideran "mismo origen". Todo lo demás se considera "origen cruzado".
Origen A | Origen B | ¿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. | Mismo origen: concordancia exacta | |
https://www.example.com | Mismo origen: coincide el número de puerto implícito (443) |
Sitio
Los dominios de nivel superior (TLD), como .com
y .org
, se enumeran en Root Zone Database. En el ejemplo
anterior, “sitio” es una 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 con elementos como .co.jp
o .github.io
, el uso de .jp
o .io
no es lo suficientemente específico para identificar el "sitio". No hay forma de determinar algorítmicamente el nivel de los dominios registrables para un TLD en particular.
Para ayudarte con eso, la lista de sufijos públicos define una lista de sufijos públicos, también llamados 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 | ¿"Mismo sitio" o "entre sitios"? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | Varios sitios: diferentes dominios |
https://login.example.com:443. | Mismo sitio: los diferentes subdominios no son importantes | |
http://www.example.com:443. | Entre sitios: diferentes esquemas | |
https://www.example.com:80 | Mismo sitio: Los diferentes puertos no son importantes | |
https://www.example.com:443. | Mismo sitio: concordancia exacta | |
https://www.example.com | Mismo sitio: Los puertos no son importantes |
"Mismo sitio sin esquemas"
Se cambió la definición de "same-site" para incluir 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 sin esquema en el mismo sitio, pero no en el mismo sitio, porque solo importa la parte eTLD+1 y no se considera el esquema.
Origen A | Origen B | ¿"Un mismo sitio sin esquema" o "entre sitios"? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | Varios sitios: diferentes dominios |
https://login.example.com:443. | Mismo sitio sin esquema: Los diferentes subdominios no son importantes | |
http://www.example.com:443. | Mismo sitio sin esquemas: Los esquemas diferentes no son importantes | |
https://www.example.com:80 | 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 | Mismo sitio sin esquema: Los puertos no son importantes |
Cómo verificar si una solicitud es del tipo "same-site", "same-origin" o "cross-site"
Todos los navegadores modernos envían solicitudes con un encabezado HTTP Sec-Fetch-Site
.
El encabezado tiene uno de los siguientes valores:
cross-site
same-site
(hace referencia al mismo sitio que es esquematizado)same-origin
none
Puedes examinar el valor de Sec-Fetch-Site
para determinar si la solicitud es del mismo sitio, del mismo origen o entre sitios.
Puedes confiar de manera razonable en el valor del encabezado Sec-Fetch-Site
por los siguientes motivos:
- JavaScript no puede modificar los encabezados HTTP que comienzan con
Sec-
- El navegador siempre establece estos encabezados.