Comprendere "same-site" e "same-origin"

"same-site" e "same-origin" sono termini citati spesso ma spesso fraintesi. Ad esempio, sono menzionati nel contesto di transizioni di pagina, richieste fetch(), cookie, apertura di popup, risorse incorporate e iframe.

Origin

Origin

"Origin" è una combinazione di uno schema (noto anche come protocollo, ad esempio HTTP o HTTPS), nome host e porta (se specificato). Ad esempio, dato un URL di https://www.example.com:443/foo, l'"origine" è https://www.example.com:443.

"same-origin" e "cross-origin"

I siti web che hanno la combinazione dello stesso schema, nome host e porta sono considerati "stessa origine". Tutto il resto è considerato "interorigine".

Origine A Origine B Spiegazione se le origini A e B sono "stessa origine" o "cross-origin"
https://www.example.com:443 https://www.evil.com:443 multiorigine: domini diversi
https://example.com:443 cross-origin: sottodomini diversi
https://login.example.com:443 cross-origin: sottodomini diversi
http://www.example.com:443 cross-origin: schemi diversi
https://www.example.com:80 cross-origin: porte diverse
https://www.example.com:443 same-origin: corrispondenza esatta
https://www.example.com same-origin: il numero di porta implicito (443) corrisponde a

Sito

Sito (TLD+1)

I domini di primo livello (TLD) come .com e .org sono elencati nel database della zona radice. Nell'esempio precedente, "sito" è la combinazione dello schema, del TLD e della parte del dominio immediatamente precedente (lo chiamiamo TLD+1). Ad esempio, dato un URL di https://www.example.com:443/foo , il "sito" è https://example.com.

Elenco di suffissi pubblici ed eTLD

Per i domini che includono elementi come .co.jp o .github.io, il semplice utilizzo di .jp o .io non è sufficientemente granulare da identificare il "sito". Non è possibile determinare in modo algoritmico il livello dei domini registrabili per un determinato dominio di primo livello. Ecco perché è stato creato un elenco di suffissi pubblici definiti nell'elenco di suffissi pubblici. Questi suffissi pubblici sono chiamati anche TLD effettivi (eTLD). L'elenco di eTLD è disponibile all'indirizzo publicsuffix.org/list.

Per identificare la parte "sito" di un dominio che include un eTLD, applica la stessa pratica dell'esempio con .com. Prendendo come esempio https://www.project.github.io:443/foo, lo schema è https, l'eTLD è .github.io e l'eTLD+1 è project.github.io, quindi https://project.github.io è considerato il "sito" di questo URL.

Sito (eTLD+1)

"stesso sito" e "cross-site"

I siti web che hanno lo stesso schema e lo stesso eTLD+1 sono considerati "stesso sito". I siti web che hanno uno schema diverso o un eTLD+1 diverso sono "cross-site".

Origine A Origine B Spiegazione se le origini A e B sono "stesso sito" o "cross-site"
https://www.example.com:443 https://www.evil.com:443 cross-site: domini diversi
https://login.example.com:443 same-site: sottodomini diversi non contano
http://www.example.com:443 cross-site: schemi diversi
https://www.example.com:80 same-site: porte diverse non contano
https://www.example.com:443 same-site: corrispondenza esatta
https://www.example.com same-site: le porte non contano

"stesso sito senza schema"

stesso sito senza schema

La definizione di "same-site" si è evoluta per considerare lo schema URL come parte del sito al fine di evitare che HTTP venga utilizzato come un canale debole. Il precedente concetto di "stesso sito" senza confronto tra schemi ora si chiama "stesso sito senza schema". Ad esempio, http://www.example.com e https://www.example.com sono considerati senza schema same-site ma non same-site, perché solo la parte eTLD+1 è importante e lo schema non viene preso in considerazione.

Origine A Origine B Spiegazione se le origini A e B sono "stesso sito senza schema"
https://www.example.com:443 https://www.evil.com:443 cross-site: domini diversi
https://login.example.com:443 schemeless same-site: sottodomini diversi non contano
http://www.example.com:443 senza schema sullo stesso sito: schemi diversi non contano
https://www.example.com:80 stesso sito senza schema: porte diverse non contano
https://www.example.com:443 schemeless same-site: corrispondenza esatta
https://www.example.com schemeless same-site: le porte non contano

Come controllare se una richiesta è "same-site", "same-origin" o "cross-site"

Tutti i browser moderni (supportano Safari a breve) inviano le richieste insieme a un'intestazione HTTP Sec-Fetch-Site. L'intestazione ha uno dei seguenti valori:

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

Esaminando il valore di Sec-Fetch-Site, puoi determinare se la richiesta è "same-site", "same-origin" o "cross-site".