Compartilhar cookie entre subdomínio e domínio

Eu tenho duas perguntas. Entendo que, se eu especificar o domínio como .mydomain.com (com o ponto inicial) no cookie, todos os subdomínios poderão compartilhar um cookie.

O subdomain.mydomain.com pode acessar um cookie criado em mydomain.com (sem o subdomínio www )?

O mydomain.com (sem o subdomínio www ) pode acessar o cookie se criado em subdomain.mydomain.com ?

Os dois domínios mydomain.com e subdomain.mydomain.com só podem compartilhar cookies se o domínio for explicitamente nomeado no header Set-Cookie . Caso contrário, o escopo do cookie é restrito ao host da solicitação. (Isso é chamado de “cookie somente host”. Consulte O que é um cookie somente host? )

Por exemplo, se você enviou o seguinte header de subdomain.mydomain.com :

 Set-Cookie: name=value 

Em seguida, o cookie não será enviado para solicitações para mydomain.com . No entanto, se você usar o seguinte, será utilizável em ambos os domínios:

 Set-Cookie: name=value; domain=mydomain.com 

No RFC 2109 , um domínio sem um ponto principal significava que ele não poderia ser usado em subdomínios, e apenas um ponto inicial ( .mydomain.com ) permitiria que ele fosse usado em vários subdomínios (mas não no domínio de nível superior, portanto o que você pergunta não foi possível na especificação mais antiga).

No entanto, todos os navegadores modernos respeitam a especificação mais recente RFC 6265 e ignoram qualquer ponto inicial, o que significa que você pode usar o cookie em subdomínios, bem como no domínio de nível superior.

Em resumo, se você definir um cookie como o segundo exemplo acima de mydomain.com , ele será acessível por subdomain.mydomain.com e vice-versa.

Veja também:

  • www vs não-www e cookies
  • script de teste de cookies para experimentá-lo

Não tenho certeza se a resposta do @cmbuckley está mostrando a imagem completa. O que eu li é:

A menos que os atributos do cookie indiquem o contrário, o cookie é retornado apenas ao servidor de origem (e não, por exemplo, a nenhum subdomínio), e expira no final da session atual (conforme definido pelo agente do usuário). Agentes do usuário ignoram cookies não reconhecidos.

RFC 6265

Além disso

 8.6. Weak Integrity Cookies do not provide integrity guarantees for sibling domains (and their subdomains). For example, consider foo.example.com and bar.example.com. The foo.example.com server can set a cookie with a Domain attribute of "example.com" (possibly overwriting an existing "example.com" cookie set by bar.example.com), and the user agent will include that cookie in HTTP requests to bar.example.com. In the worst case, bar.example.com will be unable to distinguish this cookie from a cookie it set itself. The foo.example.com server might be able to leverage this ability to mount an attack against bar.example.com. 

Para mim, isso significa que você pode proteger os cookies de serem lidos por subdomínio / domínio, mas não pode impedir a gravação de cookies nos outros domínios. Então alguém pode rewrite os cookies do seu site controlando outro subdomínio visitado pelo mesmo navegador. O que pode não ser uma grande preocupação.

Incrível site de teste de cookies fornecido por @cmbuckley / para aqueles que perderam em sua resposta como eu; vale a pena rolar para cima e upvoting /:

Aqui está um exemplo usando a API do cookie DOM ( https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie ), para que possamos ver por nós mesmos o comportamento.

Se nós executarmos o seguinte JavaScript:

document.cookie = “chave = valor”

Parece ser o mesmo que executar:

document.cookie = “chave = valor; domínio = mydomain.com”

A chave do cookie se torna disponível (somente) no domínio mydomain.com .


Agora, se você executar o seguinte JavaScript em mydomain.com:

document.cookie = “key = value; domain = .mydomain.com”

A chave do cookie se torna disponível para mydomain.com e subdomínio.meudominio.com .


Finalmente, se você tivesse que tentar executar o seguinte em subdominio.meudominio.com:

document.cookie = “key = value; domain = .mydomain.com”

A chave do cookie se torna disponível para subdominio.meudominio.com ? Fiquei um pouco surpreso que isso seja permitido; Eu supus que seria uma violação de segurança para um subdomínio poder definir um cookie em um domínio pai.

Em ambos os casos, sim, pode, e este é o comportamento padrão para o IE e Edge.

As outras respostas adicionam informações valiosas, mas descrevem principalmente o comportamento no Chrome. É importante notar que o comportamento é completamente diferente no IE. O script de teste muito útil do CMBuckley demonstra que, no (digamos) Chrome, os cookies não são compartilhados entre raiz e subdomínios quando nenhum domínio é especificado. No entanto, o mesmo teste no IE mostra que eles são compartilhados. Este caso do IE está mais próximo da descrição do home-page do CMBuckley, www. Or-not-www. Eu sei que este é o caso, porque nós temos um sistema que usava cookies de serviços diferentes tanto na raiz quanto no subdomínio. Tudo funcionou bem até que alguém o accessu no IE e os dois sistemas lutaram pela qual o cookie da session venceria até que explodissemos o cache.

Solução simples

 setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM); 

O quinto parâmetro do Setcookie determina os (sub) domínios para os quais o cookie está disponível. Configurá-lo para (EXAMPLE.COM) torna disponível para qualquer subdomínio (por exemplo: SUBDOMAIN.EXAMPLE.COM)

Referência: http://php.net/manual/en/function.setcookie.php