Devido a problemas estranhos de cookies de domínio / subdomínio que estou recebendo, gostaria de saber como os navegadores lidam com cookies. Se eles fizerem isso de maneiras diferentes, também seria bom conhecer as diferenças.
Em outras palavras - quando um navegador recebe um cookie, esse cookie PODE ter um domínio e um caminho anexado a ele. Ou não, nesse caso, o navegador provavelmente substitui alguns padrões por eles. Pergunta 1: o que são?
Mais tarde, quando o navegador está prestes a fazer uma solicitação, ele verifica seus cookies e filtra os que deve enviar para essa solicitação. Faz isso combinando-os com o caminho e o domínio das solicitações. Pergunta 2: quais são as regras de correspondência?
Adicionado:
A razão pela qual estou perguntando isso é porque estou interessado em alguns casos extremos. Gostar:
- Um cookie
.example.com
estará disponível parawww.example.com
? - Um cookie
.example.com
estará disponível paraexample.com
? - Um cookie
example.com
estará disponível parawww.example.com
? - Um cookie
example.com
estará disponível paraanotherexample.com
? - Será
www.example.com
capaz de definir o cookieexample.com
? - Será
www.example.com
capaz de definir o cookiewww2.example.com
? - Será
www.example.com
capaz de definir o cookie.com
? - Etc.
Adicionado 2:
Além disso, alguém poderia sugerir como devo definir um cookie para que:
- Pode ser definido por um
www.example.com
ouexample.com
; - É acessível por ambos
www.example.com
eexample.com
.
As respostas anteriores estão um pouco desatualizadas.
O RFC 6265 foi publicado em 2011, com base no consenso do navegador na época. Desde então, houve algumas complicações com domínios públicos com sufixos. Escrevi um artigo explicando a situação atual - http://bayou.io/draft/cookie.domain.html
Para resumir, regras a seguir em relação ao domínio dos cookies:
O domínio de origem de um cookie é o domínio da solicitação de origem.
Se o domínio de origem for um IP, o atributo de domínio do cookie não deve ser definido.
Se o atributo de domínio de um cookie não estiver definido, o cookie será aplicável apenas ao seu domínio de origem.
Se o atributo de domínio de um cookie estiver definido,
Pode-se derivar que um cookie é sempre aplicável ao seu domínio de origem.
O domínio do cookie não deve ter um ponto inicial, como em
.foo.com
- basta usarfoo.com
Como um exemplo,
x.y.z.com
pode definir um domínio de cookie para si ou pais -x.y.z.com
,y.z.com
,z.com
. Mas nãocom
, que é um sufixo público.y.z.com
é aplicável ay.z.com
,x.y.z.com
,a.x.y.z.com
etc.Exemplos de sufixos públicos -
com
,edu
,uk
,co.uk
,blogspot.com
,compute.amazonaws.com
fonte
x.y.z.com
definir um cookiez.com
?Para uma cobertura abrangente, revise o conteúdo do RFC2965 . Claro que isso não significa necessariamente que todos os navegadores se comportam exatamente da mesma maneira.
No entanto, em geral, a regra para o caminho padrão, se nenhum especificado no cookie, é o caminho na URL da qual o cabeçalho Set-Cookie chegou. Da mesma forma, o padrão para o domínio é o nome completo do host na URL da qual o Set-Cookie chegou.
As regras de correspondência para o domínio exigem que o cookie Domain corresponda ao host ao qual a solicitação está sendo feita. O cookie pode especificar uma correspondência de domínio mais ampla ao incluir *. no atributo de domínio de Set-Cookie (essa área em que os navegadores podem variar). A correspondência do caminho (supondo que o domínio corresponda) é uma questão simples de que o caminho solicitado deve estar dentro do caminho especificado no cookie. Normalmente, os cookies de sessão são configurados com path = / ou path = / applicationName / para que o cookie esteja disponível para todas as solicitações no aplicativo.
Resposta adicionada:
*
Não consigo testar isso agora, mas tenho a impressão de que pelo menos o IE7 / 6 trataria o caminhoexample.com
como se fosse.example.com
.fonte
A última (terceira a ser exata) RFC para esse problema é a RFC-6265 (obsoleta a RFC-2965, que por sua vez obsoleta a RFC-2109).
De acordo com isso, se o servidor omitir o atributo Domínio, o agente do usuário retornará o cookie apenas ao servidor de origem (o servidor no qual um determinado recurso reside). Mas também é um aviso de que alguns agentes de usuário existentes tratam um atributo de domínio ausente como se o atributo de domínio estivesse presente e contivesse o nome do host atual (por exemplo, se example.com retornar um cabeçalho Set-Cookie sem um atributo de domínio, esses agentes de usuário irão envie o cookie erroneamente para www.example.com).
Quando o atributo Domain for especificado, ele será tratado como um nome de domínio completo (se houver o ponto inicial no atributo, ele será ignorado). O servidor deve corresponder ao domínio especificado no atributo (tem exatamente o mesmo nome de domínio ou deve ser um subdomínio dele) para obter esse cookie. Mais precisamente, aqui especificado .
Então, por exemplo:
Domain=.example.com
é equivalente aDomain=example.com
Domain=www.example.com
fechará o caminho para www4.example.comPS: vírgula à direita no atributo Domain fará com que o agente do usuário ignore o atributo = (
fonte
Testei todos os casos no mais recente Chrome, Firefox, Safari em 2019.
Resposta adicionada:
fonte
Os RFCs são conhecidos por não refletir a realidade.
Melhor verificar draft-ietf-httpstate-cookie , trabalho em andamento.
fonte
Existem regras que determinam se um navegador aceitará o cabeçalho de resposta do cabeçalho Set (gravação de cookies no servidor), regras / interpretações ligeiramente diferentes para o conjunto de cookies usando Javascript (não testei o VBScript).
Depois, existem regras que determinam se o navegador enviará um cookie junto com a solicitação da página.
Existem diferenças entre os principais mecanismos do navegador, como as correspondências de domínio são tratadas e como os parâmetros nos valores dos caminhos são interpretados. Você pode encontrar alguma evidência empírica no artigo Como navegadores diferentes lidam com os cookies de maneira diferente
fonte
Fiquei surpreso ao ler a seção 3.3.2 sobre a rejeição de cookies:
http://tools.ietf.org/html/rfc2965
Isso indica que um navegador deve rejeitar um cookie do xyzcom com o domínio .z.com, porque 'xy' contém um ponto. Portanto, a menos que eu interprete mal a RFC e / ou as perguntas acima, podem ser adicionadas perguntas:
Um cookie para .example.com estará disponível para www.yyy.example.com? Não.
Um cookie definido pelo servidor de origem www.yyy.example.com, com o domínio .example.com, terá seu valor enviado pelo agente para xxx.example.com? Não.
fonte
z.com
a aplicar paraz.com
e todos os subdomínios.Não, mas
example.com.fr
pode definir um cookie paraexample2.com.fr
. O Firefox protege contra isso mantendo uma lista de TLDs: http://securitylabs.websense.com/content/Blogs/3108.aspxAparentemente, o Internet Explorer não permite que domínios de duas letras definam cookies, o que, suponho, explica por que
o2.ie
simplesmente redirecionao2online.ie
. Eu sempre me perguntava isso.fonte