Por que os soquetes não podem ser usados ​​para identificar indivíduos em vez de cookies?


17

Outra pergunta foi feita sobre o uso de endereços IP para identificar clientes individuais. Acho que entendo por que um endereço IP é insuficiente. Mas e o soquete, que tem mais informações e, pelo que entendi, é stateful? Isso não poderia ser potencialmente usado no lugar de um cookie?


18
O soquete é statefull, mas http não mantém a conexão aberta após o download da página da web. Ele fecha cerca de 15 segundos após o download de toda a página da web. esta é toda a razão pela qual você precisa de cookies para manter o estado
MTilsted 26/17

41
Um soquete não é um dado. Você não pode enviar. Sua pergunta não faz sentido.
user207421

8
É como perguntar por que você não pode usar os verbos em vez de substantivos ...
Mehrdad

2
@EJP: Eu respondi sob a suposição de que o OP significa o (source_ip, source_port, target_ip, target_port) quadruplicar em vez do objeto socket. Mas sua interpretação também faz sentido.
Jörg W Mittag 27/03

Você pode tentar imitar a maneira como o firebase funciona para gerenciar a identidade do estado ou do usuário sem cookies ou sessão.
Jeffo

Respostas:


64

Um soquete identifica uma conexão . Os cookies geralmente são usados ​​para identificar um usuário . Se eu abrir duas guias do navegador no SE.SE, terei duas conexões e, portanto, dois soquetes. Mas quero que minhas configurações persistam nos dois. (De fato, normalmente, um navegador abre vários soquetes para uma página para acelerar o tempo de carregamento da página; acredito que a maioria dos navegadores tem um valor máximo padrão entre 4 e 10 soquetes por página.)

E o contrário também pode acontecer: se eu fechar a guia do navegador, outro usuário na máquina poderá abrir uma guia do navegador para o SE.SE e obter o mesmo quádruplo de (source_ip, source_port, target_ip, target_port), nesse caso , ele receberá todas as minhas configurações.


Vale a pena notar que, com o http2 (e o pipelining http), você provavelmente não terá dois soquetes abertos para o SE. Seu navegador reutilizará o mesmo soquete. Você precisaria ter diferentes navegadores em execução.
Matthew Steeples

3
Uma verificação de locais trivial indica que o Chrome faz manter uma tomada aberta por guia - provavelmente porque eles estão no modo seguro e não quiser estado share entre eles -, mas tomada de cada guia parece ser persistente e solicitações são provavelmente pipeline dentro desse guia.
inútil

1
Também é importante notar que você também não sabe o que está acontecendo no back-end. Muitos balanceadores de carga encerram a conexão de um usuário e abrem seus próprios servidores de back-end, o que significa que você pode ter vários usuários compartilhando um único soquete.
Dan

O @Useless IIRC SE usa WebSockets ou pesquisa longa (fallback) para buscar atualizações (novas perguntas, edições etc.), caso você esteja testando aqui. Outros sites podem se comportar de maneira diferente - não faz muito sentido manter um soquete aberto indefinidamente em um site estático.
27417 Bob

É verdade que me levou algumas tentativas para encontrar um site realmente estático para verificar. Para isso, o Chrome abre tomadas múltiplas por guia, e ainda não reutilizá-los entre as abas, mas não fechá-las uma vez que o guia tem carregamento acabado. Eles são facilmente visíveis porque passam muito tempo em TIME_WAIT.
inútil

20

Os soquetes TCP são projetados para serem com estado, de modo que geralmente são usados ​​para identificar sessões. Protocolos como SSH e ftp fazem exatamente isso.

O HTTP foi projetado para ser sem estado e cada conexão é associada apenas a um recurso a ser baixado. Após o download de um recurso, o soquete TCP em que a solicitação HTTP é acionada é fechado. A razão original para isso foi a simplicidade. Mas o efeito colateral é que os servidores HTTP executando sites modernos podem lidar com muito mais usuários do que servidores baseados em soquete, como SSH ou ftp.

Portanto, os soquetes não podem ser usados ​​porque o HTTP fechará o soquete após o download da página da web.

Obviamente, dizer que o HTTP fechará o soquete por recurso é muito simplificador, porque o HTTP tem recursos como pipelining e conexões persistentes que podem baixar vários recursos por soquete. Mas isso é apenas otimização. Depois que tudo tiver baixado, seu navegador fechará o soquete após algum tempo limite.

O HTTP foi originalmente projetado como um protocolo simples para baixar arquivos HTML. Navegadores antigos também podem baixar arquivos HTML de outros protocolos, como Gopher e ftp. Como tal, não havia razão para tornar o HTTP com estado, porque os arquivos HTML são apenas arquivos de texto simples.

Depois que os formulários da web foram introduzidos e as páginas HTML podem enviar dados de volta para o servidor, as páginas da web começaram a precisar de sessões. Assim, os cookies foram criados para reintroduzir o estado em um protocolo sem estado que é transmitido por meio de uma camada de transferência com estado que é transmitida por uma camada de rede sem estado. Portanto, as camadas completas do aplicativo são:

  • Ethernet, Wifi etc. = sem estado
  • IP = sem estado
  • TCP = com estado
  • HTTP = sem estado
  • HTTP + cookies = com estado

Atualmente, temos websockets que podem manter um único soquete aberto da sua página da web para o servidor. Portanto, com os websockets, você pode novamente usar sockets para identificar um usuário, porque o websocket por si só é estável. Mas na maioria dos casos, você ainda precisará de um cookie para a página html principal que carrega o javascript que inicia o websocket.


4
"Servidores HTTP executando sites modernos podem lidar com muito mais usuários do que servidores baseados em soquete, como SSH ou ftp" [citação necessário]
el.pescado 27/03/17

6
@ el.pescado: É lógico. Como os servidores baseados em soquete mantêm uma conexão ativa, os servidores baseados em soquete são limitados ao número máximo de descritores de arquivos que você pode abrir (e em alguns SOs, os soquetes competem com o disco rígido pelos descritores de arquivos). Se você não precisar manter a conexão ativa, seu limite é apenas a largura de banda. Observe que o limite da largura de banda é o mesmo clima em que você mantém uma conexão ativa ou não. Servidores HTTP modernos podem lidar com milhões de solicitações por segundo. Se eles precisam para manter os milhões de soquetes para cima enquanto você lê uma página do servidor iria morrer
slebetman

6
+1 para "Assim, os cookies foram criados para reintroduzir o estado em um protocolo sem estado que é transmitido por uma camada de transferência com estado que é transmitida por uma camada de rede sem estado". Isso é lindo
Reinstate Monica - dirkk 27/03

Gostei desta resposta. Ele vai direto ao cerne da questão.
27417 Jim

Os servidores HTTP @slebetman são baseados em soquete. Todos eles são. Por definição. E os cookies não tornam servidores HTTP com estado. De fato, por definição, eles não são, e é por isso que os cookies são transferidos pelo cliente todas as vezes.
Route de milhas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.