Como os domínios de cookies do navegador funcionam?

380

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.comestará disponível para www.example.com?
  • Um cookie .example.comestará disponível para example.com?
  • Um cookie example.comestará disponível para www.example.com?
  • Um cookie example.comestará disponível para anotherexample.com?
  • Será www.example.comcapaz de definir o cookie example.com?
  • Será www.example.comcapaz de definir o cookie www2.example.com?
  • Será www.example.comcapaz 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.comou example.com;
  • É acessível por ambos www.example.come example.com.
Vilx-
fonte

Respostas:

367

Embora exista o RFC 2965 ( Set-Cookie2, já havia obsoleto o RFC 2109 ) que deveria definir o cookie hoje em dia, a maioria dos navegadores não o suporta totalmente, mas apenas cumpre as especificações originais do Netscape .

Há uma distinção entre o valor do atributo Domain e o domínio efetivo: o primeiro é retirado do Set-Cookiecampo do cabeçalho e o segundo é a interpretação desse valor do atributo. De acordo com a RFC 2965, o seguinte deve ser aplicado:

  • Se o campo do cabeçalho Set-Cookie não tiver um atributo Domain , o domínio efetivo será o domínio da solicitação.
  • Se houver um atributo Domínio presente, seu valor será usado como domínio efetivo (se o valor não começar com um, .ele será adicionado pelo cliente).

Tendo o domínio efetivo, ele também deve corresponder ao domínio solicitado atualmente para ser definido; caso contrário, o cookie será revisado. A mesma regra se aplica à escolha dos cookies a serem enviados em uma solicitação.


Mapeando esse conhecimento para suas perguntas, o seguinte deve ser aplicado:

  • O cookie com Domain=.example.com estará disponível para www.example.com
  • O cookie com Domain=.example.com estará disponível por exemplo.com
  • O cookie com Domain=example.comserá convertido para .example.come, portanto , também estará disponível para www.example.com
  • Cookie com Domain=example.comvai não estar disponível para anotherexample.com
  • www.example.com vai ser capaz de definir cookies para example.com
  • www.example.com irá não ser capaz de bolinho conjunto para www2.example.com
  • www.example.com irá não ser capaz de bolinho conjunto para .com

E para definir e ler um cookie para / por www.example.com e example.com , defina-o para .www.example.come .example.comrespectivamente. Mas o primeiro ( .www.example.com) estará acessível apenas para outros domínios abaixo desse domínio (por exemplo, foo.www.example.com ou bar.www.example.com ), onde .example.comtambém pode ser acessado por qualquer outro domínio abaixo de example.com (por exemplo, foo. example.com ou bar.example.com ).

quiabo
fonte
@Gumbo Então, o abcexample.com pode acessar o cookie com o domínio c.example.com?
Pacerier 18/07/12
2
muito tarde pergunta de acompanhamento para este. Minha própria experiência e esta: webmasters.stackexchange.com/questions/55790/… sugerem que o domínio de example.com não estará disponível para www.example.com, mas este exemplo sugere o contrário. Este exemplo está errado ou estou (bem possível) mal entendido. Desculpe por necromancia discussão, mas queria ter certeza que este excelente resposta foi 100% exato para futuras confundido iniciantes como me :)
errah
7
esta resposta está um pouco desatualizada; veja minha resposta abaixo.
ZhongYu
11
por que a configuração de example.com não está disponível para www.example.com? (como é um sub "www" de example.com?
Nabeel Khan
Set-Cookie2 é obsoleto. Continue usando Set-Cookie.
precisa saber é o seguinte
122

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,

    • o cookie é aplicável a esse domínio e a todos os seus subdomínios;
    • o domínio do cookie deve ser o mesmo ou pai do domínio de origem
    • o domínio do cookie não deve ser um TLD, um sufixo público ou um pai de um sufixo público.

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.compode definir um domínio de cookie para si ou pais - x.y.z.com, y.z.com, z.com. Mas não com, que é um sufixo público.
  • um bolinho com domínio = y.z.comé aplicável a y.z.com, x.y.z.com, a.x.y.z.cometc.

Exemplos de sufixos públicos - com, edu, uk, co.uk, blogspot.com,compute.amazonaws.com

ZhongYu
fonte
5
@roelleor - é o contrário. O rfc6265 foi escrito para resumir como os cookies foram realmente tratados na prática :) sim, o rfc é um reflexo bastante preciso de como os principais navegadores se comportam. meus testes recentes em navegadores confirmaram isso. embora, eles possam diferir em casos extremos envolvendo sufixos públicos.
ZhongYu
2
Quais são as consequências de um ponto inicial?
UpTheCreek 18/11/2015
3
@UpTheCreek - de acordo com rfc6265, o ponto principal deve ser ignorado pelo cliente
ZhongYu
2
Não é estranho x.y.z.comdefinir um cookie z.com?
Royi Namir 18/03/19
11
Portanto, se o xyzcom pode definir um cookie como yzcom, e um cookie com domínio yzcom é aplicável ao wyzcom ... Isso significa que o xyzcom pode definir um cookie como wyzcom ?
Ioanna
9

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:

  • Um cookie para .example.com estará disponível para www.example.com? sim
  • Um cookie para .example.com estará disponível para example.com? Não sei
  • Um cookie para example.com estará disponível para www.example.com? Não deveria mas ... *
  • Um cookie, por exemplo.com, estará disponível para outro exemplo? Não
  • Www.example.com poderá definir o cookie para example.com? sim
  • Www.example.com poderá definir cookies para www2.example.com? Não (exceto via .example.com)
  • Www.example.com poderá definir cookies para .com? Não (não é possível definir um cookie tão alto no namespace nem definir um para algo como .co.uk) .

*Não consigo testar isso agora, mas tenho a impressão de que pelo menos o IE7 / 6 trataria o caminho example.comcomo se fosse .example.com.

AnthonyWJones
fonte
Eu adicionei alguns casos interessantes na minha pergunta. Você poderia recomendar algo sobre isso?
Vilx-
8

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:

  • atributo de cookie Domain=.example.comé equivalente aDomain=example.com
  • cookies com esses atributos de domínio estarão disponíveis para example.com e www.example.com
  • cookies com esses atributos de domínio não estarão disponíveis para outro-exemplo.com
  • especificar o atributo de cookie como Domain=www.example.comfechará o caminho para www4.example.com

PS: vírgula à direita no atributo Domain fará com que o agente do usuário ignore o atributo = (

Victor Akimov
fonte
6

Testei todos os casos no mais recente Chrome, Firefox, Safari em 2019.

Resposta adicionada:

  • Um cookie para .example.com estará disponível para www.example.com? SIM
  • Um cookie para .example.com estará disponível para example.com? SIM
  • Um cookie para example.com estará disponível para www.example.com? NÃO , o domínio sem curinga corresponde apenas a si mesmo.
  • Um cookie, por exemplo.com, estará disponível para outro exemplo? NÃO
  • Www.example.com poderá definir o cookie para example.com? NÃO , ele poderá definir o cookie para '.example.com', mas não para 'example.com'.
  • Www.example.com poderá definir cookies para www2.example.com? NÃO . Mas ele pode definir o cookie para .example.com, que pode ser acessado por www2.example.com.
  • Www.example.com poderá definir cookies para .com? NÃO
xiaoke
fonte
3

Os RFCs são conhecidos por não refletir a realidade.

Melhor verificar draft-ietf-httpstate-cookie , trabalho em andamento.

Julian Reschke
fonte
3

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

Gert-Jan Strik
fonte
2

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.

user100034
fonte
2
esse rfc está desatualizado. nova RFC 6265, com base no consenso navegador, permite cookie com z.coma aplicar para z.come todos os subdomínios.
ZhongYu
1

Será www.example.comcapaz de definir o cookie .com?

Não, mas example.com.frpode definir um cookie para example2.com.fr. O Firefox protege contra isso mantendo uma lista de TLDs: http://securitylabs.websense.com/content/Blogs/3108.aspx

Aparentemente, o Internet Explorer não permite que domínios de duas letras definam cookies, o que, suponho, explica por que o2.iesimplesmente redireciona o2online.ie. Eu sempre me perguntava isso.

TRiG
fonte
"com.fr" é conhecido como "sufixo público". o domínio do cookie não pode ser sufixo público. veja rfc 6265 e publicsuffix.org
ZhongYu
Sim, há uma solução, mas é extremamente confusa. Esse tipo de rotulagem deve ser inserido no DNS, não em uma base ad hoc separadamente.
TRiG 6/06/15
Verdadeiro, e talvez você esteja se referindo a "encadernado". Mas isso pode criar mais problemas; como um desafio para implementações de clientes http.
ZhongYu 6/06/2015
Seria útil se essas informações fossem expostas de alguma forma do navegador ao javascript. Caso contrário, é impossível determinar programaticamente se você pode definir um cookie em um determinado nível de domínio. Você não pode verificar essa lista com todas as chamadas, afinal!
Dtipson