"Mesmo site" e "mesma origem" são termos citados com frequência, mas frequentemente mal interpretados. Por exemplo, eles são usados no contexto de transições de páginas,
solicitações fetch()
, cookies, pop-ups de abertura, recursos incorporados e
iframes. Esta página explica o que são e como eles são diferentes
entre si.
Origem
![Origem](https://web.dev/static/articles/same-site-same-origin/image/origin-scheme.png?authuser=6&hl=pt)
"Origin" é uma combinação de um
esquema
(também conhecido como
protocolo, como
HTTP ou
HTTPS), um
nome de host e uma
porta
(se especificada). Por exemplo, considerando um URL https://www.example.com:443/foo
, a "origem" é https://www.example.com:443
.
"Mesma origem" e "origem cruzada"
Sites que têm a mesma combinação de esquema, nome do host e porta são considerados de "mesma origem". Todo o restante é considerado de "origem cruzada".
Origem A | Origem B | "Mesma origem" ou "origem cruzada"? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | Origem cruzada: domínios diferentes |
https://example.com:443 | Origem cruzada: subdomínios diferentes | |
https://login.exemplo.com:443 | Origem cruzada: subdomínios diferentes | |
http://www.exemplo.com:443 | Origem cruzada: esquemas diferentes | |
https://www.example.com:80 | Origem cruzada: portas diferentes | |
https://www.exemplo.com:443 | Mesma origem: correspondência exata | |
https://www.example.com | Mesma origem: número de porta implícito (443) correspondente |
Site
![Site (TLD+1)](https://web.dev/static/articles/same-site-same-origin/image/site-tld1-ae5ebbc587fbe.png?authuser=6&hl=pt)
Domínios de nível superior (TLDs), como .com
e .org
, estão listados no banco de dados de zonas raiz. No exemplo
anterior, "site" é uma combinação do
esquema,
do TLD e da parte do
domínio logo antes dele (chamado de TLD+1). Por exemplo, considerando um URL de
https://www.example.com:443/foo
, o "site" é https://example.com
.
Lista de sufixos públicos e eTLD
Para domínios com elementos como .co.jp
ou .github.io
, usar apenas .jp
ou
.io
não é específico o suficiente para identificar o "site". Não há como
determinar, algoritmicamente, o nível de domínios registráveis de um TLD específico.
Para ajudar com isso, a lista de sufixos públicos
define uma lista de sufixos públicos, também chamados de TLDs efetivos (eTLDs). A lista de eTLDs é mantida em publicsuffix.org/list.
Para identificar a parte do "site" de um domínio que inclui um eTLD, aplique a mesma
prática do exemplo com .com
. Considerando
https://www.project.github.io:443/foo
como exemplo, o esquema é https
,
o eTLD é .github.io
e o eTLD+1 é project.github.io
. Portanto, https://project.github.io
é considerado o "site" para esse URL.
![Site (eTLD+1)](https://web.dev/static/articles/same-site-same-origin/image/site-etld1-2ffebe0e355bd.png?authuser=6&hl=pt)
"mesmo site" e "entre sites"
Sites que têm o mesmo esquema e o mesmo eTLD+1 são considerados do "mesmo site". Sites que têm um esquema diferente ou um eTLD+1 diferente são "entre sites".
Origem A | Origem B | "Mesmo site" ou "entre sites"? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | Entre sites: domínios diferentes |
https://login.exemplo.com:443 | Mesmo site: subdomínios diferentes não importam | |
http://www.exemplo.com:443 | Entre sites: esquemas diferentes | |
https://www.example.com:80 | Mesmo site: portas diferentes não importam | |
https://www.exemplo.com:443 | Mesmo site: correspondência exata | |
https://www.example.com | Mesmo site: as portas são irrelevantes |
"Mesmo site sem esquema"
![site sem esquema](https://web.dev/static/articles/same-site-same-origin/image/schemeless-same-site-3ba215c9666cd.png?authuser=6&hl=pt)
A definição de "mesmo site" mudou para incluir o esquema de URL como parte do
site, a fim de evitar que o HTTP seja usado como um
canal fraco.
O conceito mais antigo de "mesmo site" sem comparação de esquemas agora é chamado de
"mesmo site sem esquema". Por exemplo, http://www.example.com
e
https://www.example.com
são considerados sem esquema no mesmo site, mas não no mesmo site,
porque somente a parte eTLD+1 é importante, e o esquema não é considerado.
Origem A | Origem B | "Sem esquema no mesmo site" ou "entre sites"? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | Entre sites: domínios diferentes |
https://login.exemplo.com:443 | Mesmo site sem esquemas: subdomínios diferentes não importam | |
http://www.exemplo.com:443 | Mesmo site sem esquemas: esquemas diferentes não importam | |
https://www.example.com:80 | Mesmo site sem esquema: portas diferentes não importam | |
https://www.exemplo.com:443 | Mesmo site sem esquemas: correspondência exata | |
https://www.example.com | Mesmo site sem esquema: as portas não importam |
Como verificar se uma solicitação é do "mesmo site", da "mesma origem" ou "entre sites"
Todos os navegadores modernos enviam solicitações com um
cabeçalho HTTP Sec-Fetch-Site
.
O cabeçalho tem um dos seguintes valores:
cross-site
same-site
(refere-se ao mesmo site com esquema)same-origin
none
Você pode examinar o valor de Sec-Fetch-Site
para determinar se a solicitação
é do mesmo site, da mesma origem ou entre sites.
É possível confiar razoavelmente no valor do cabeçalho Sec-Fetch-Site
, porque:
- Os cabeçalhos HTTP que começam com
Sec-
não podem ser modificados pelo JavaScript - O navegador sempre define esses títulos.