Os cookies HTTP são portuários específicos?

Eu tenho dois serviços HTTP em execução em uma máquina. Eu só quero saber se eles compartilham seus cookies ou se o navegador distingue entre os dois sockets do servidor.

A especificação atual do cookie é a RFC 6265 , que substitui a RFC 2109 e a RFC 2965 (ambas as RFCs agora estão marcadas como “Histórico”) e formaliza a syntax para o uso de cookies no mundo real. Ele afirma claramente:

  1. Introdução

Por razões históricas, os cookies contêm várias infelicidades de segurança e privacidade. Por exemplo, um servidor pode indicar que determinado cookie é destinado a conexões “seguras”, mas o atributo Seguro não fornece integridade na presença de um invasor de rede ativo. Da mesma forma, os cookies de um determinado host são compartilhados entre todas as portas desse host, embora a “política de mesma origem” usual usada pelos navegadores da Web isole o conteúdo recuperado por meio de portas diferentes.

E também:

8.5. Confidencialidade Fraca

Os cookies não fornecem isolamento por porta . Se um cookie é legível por um serviço em execução em uma porta, o cookie também pode ser lido por um serviço em execução em outra porta do mesmo servidor. Se um cookie é gravável por um serviço em uma porta, o cookie também pode ser gravado por um serviço em execução em outra porta do mesmo servidor. Por essa razão, os servidores NÃO DEVEM executar serviços mutuamente desconfiados em portas diferentes do mesmo host e usar cookies para armazenar informações confidenciais de segurança.

De acordo com o RFC2965 3.3.1 (que pode ou não ser seguido por navegadores), a menos que a porta seja explicitamente especificada através do parâmetro port do header Set-Cookie , os cookies podem ou não ser enviados para qualquer porta.

O Manual de Segurança do Navegador do Google diz: por padrão, o escopo do cookie é limitado a todos os URLs no nome do host atual – e não está vinculado a informações de porta ou protocolo. e algumas linhas depois Não há como limitar os cookies a um único nome DNS […] da mesma forma, não há como limitá-los a uma porta específica. (Além disso, lembre-se de que o IE não considera os números de porta em sua política de mesma origem).

Portanto, não parece seguro confiar em qualquer comportamento bem definido aqui.

Esta é uma pergunta muito antiga, mas eu pensei em adicionar uma solução alternativa que usei.

Eu tenho dois serviços em execução no meu laptop (um na porta 3000 e outro em 4000). Quando eu pulava entre ( http://localhost:3000 e http://localhost:4000 ), o Chrome passava o mesmo cookie, cada serviço não entenderia o cookie e geraria um novo.

Descobri que, se eu acessasse http://localhost:3000 e http://127.0.0.1:4000 , o problema desapareceu, pois o Chrome mantinha um cookie para o host local e outro para o 127.0.0.1.

Mais uma vez, ninguém pode se importar neste momento, mas foi fácil e útil para a minha situação.

Esta é uma grande área cinza no cookie SOP (Política de mesma origem).

Teoricamente, você pode especificar o número da porta no domínio e o cookie não será compartilhado. Na prática, isso não funciona com vários navegadores e você encontrará outros problemas. Portanto, isso só é viável se seus sites não forem para o público em geral e você puder controlar quais navegadores usar.

A melhor abordagem é obter dois nomes de domínio para o mesmo IP e não depender de números de porta para cookies.

Uma maneira alternativa de contornar o problema é tornar o nome do cookie de session relacionado à porta. Por exemplo:

  • mysession8080 para o servidor em execução na porta 8080
  • mysession8000 para o servidor rodando na porta 8000

Seu código pode acessar a configuração do servidor da Web para descobrir qual porta seu servidor usa e nomear o cookie de acordo.

Tenha em mente que seu aplicativo receberá os dois cookies e você precisará solicitar o que corresponde à sua porta.

Não há necessidade de ter o número exato da porta no nome do cookie, mas isso é mais conveniente.

Em geral, o nome do cookie poderia codificar qualquer outro parâmetro específico para a instância do servidor que você usa, para que ele possa ser decodificado pelo contexto correto.

No IE 8, os cookies (verificados apenas em relação ao localhost) são compartilhados entre as portas. Em FF 10, eles não são.

Eu publiquei esta resposta para que os leitores tenham pelo menos uma opção concreta para testar cada cenário.

Eu estava experimentando um problema semelhante executando (e tentando depurar) dois aplicativos diferentes do Django na mesma máquina.

Eu estava correndo com estes comandos:

 ./manage.py runserver 8000 ./manage.py runserver 8001 

Quando eu fiz o login no primeiro e depois no segundo eu sempre fui desconectado do primeiro e vice-versa.

Eu adicionei isso no meu / etc / hosts

 127.0.0.1 app1 127.0.0.1 app2 

Então eu comecei os dois aplicativos com estes comandos:

 ./manage.py runserver app1:8000 ./manage.py runserver app2:8001 

Problema resolvido 🙂

É opcional.

A porta pode ser especificada para que os cookies possam ser específicos da porta. Não é necessário, o servidor web / aplicativo deve se preocupar com isso.

Fonte: Artigo da Wikipédia em alemão , RFC2109 , Capítulo 4.3.1.