Pourquoi les sockets ne peuvent-ils pas être utilisés pour identifier des individus au lieu de cookies?

17

Une autre question a été posée concernant l'utilisation des adresses IP pour identifier les clients individuels. Je pense que je comprends pourquoi une adresse IP est insuffisante. Mais qu'en est-il de la socket, qui contient plus d'informations et, d'après ce que je comprends, est avec état? Cela ne pourrait-il pas être potentiellement utilisé à la place d'un cookie?

Communauté
la source
18
Le socket est complet, mais http ne garde pas la connexion ouverte après avoir téléchargé la page Web. Il se ferme environ 15 secondes après le téléchargement de la page Web entière. c'est la raison pour laquelle vous avez besoin de cookies pour garder l'état
MTilsted
41
Un socket n'est pas une donnée. Vous ne pouvez pas l'envoyer. Votre question n'a pas de sens.
user207421
8
C'est comme demander pourquoi vous ne pouvez pas utiliser les verbes au lieu des noms ...
user541686
2
@EJP: J'ai répondu en supposant que l'OP signifie le quadruple (source_ip, source_port, target_ip, target_port) au lieu de l'objet socket. Mais votre interprétation est également logique.
Jörg W Mittag
Vous pouvez essayer d'imiter le fonctionnement de Firebase pour gérer l'état ou l'identité de l'utilisateur sans cookies ni session.
JeffO

Réponses:

64

Une prise identifie une connexion . Les cookies sont généralement utilisés pour identifier un utilisateur . Si j'ouvre deux onglets de navigateur à SE.SE, j'aurai deux connexions et donc deux sockets. Mais je veux que mes paramètres persistent sur les deux. (En fait, généralement, un navigateur ouvre plusieurs sockets pour une page afin d'accélérer le temps de chargement des pages; je pense que la plupart des navigateurs ont une valeur maximale par défaut comprise entre 4 et 10 sockets par page.)

Et l'inverse peut également se produire: si je ferme l'onglet de mon navigateur, un autre utilisateur de la machine peut ouvrir un onglet de navigateur vers SE.SE et obtenir le même quadruple de (source_ip, source_port, target_ip, target_port), auquel cas , il obtiendra tous mes paramètres.

Jörg W Mittag
la source
Il convient de noter qu'avec http2 (et le pipelining http), vous n'aurez probablement pas deux sockets ouverts pour SE. Votre navigateur réutilisera la même socket. Vous devez avoir différents navigateurs en cours d'exécution.
Matthew Steeples
3
Une vérification locale trivial indique que Chrome ne garder un socket ouvert par onglet - probablement parce qu'ils sont sandbox et il ne veut pas état de partage entre eux - mais la prise de chaque onglet semble être persistant et les demandes sont probablement pipeliné au sein de cet onglet.
inutile
1
Il convient également de noter que vous ne savez pas non plus ce qui se passe à l'arrière. De nombreux équilibreurs de charge mettent fin à la connexion d'un utilisateur, puis ouvrent le leur aux serveurs principaux, ce qui signifie que plusieurs utilisateurs peuvent partager un même socket.
Dan
@Useless IIRC SE utilise soit des WebSockets ou des sondages longs (repli) pour récupérer les mises à jour (nouvelles questions, modifications, etc.) au cas où vous testeriez ici. D'autres sites peuvent se comporter différemment - il est inutile de garder un socket ouvert indéfiniment sur un site statique.
Bob
Certes, il m'a fallu quelques essais pour trouver un site véritablement statique à vérifier. Pour cela, Chrome ouvre plusieurs prises par onglet, et encore ne les réutilise pas entre les onglets, mais ne les près une fois que l'onglet a terminé le chargement. Ils sont cependant facilement visibles car ils passent trop de temps dans TIME_WAIT.
inutile
20

Les sockets TCP sont conçus pour être avec état, ils sont donc généralement utilisés pour identifier les sessions. Les protocoles comme SSH et ftp font exactement cela.

HTTP est conçu pour être sans état et chaque connexion n'est associée qu'à une ressource à télécharger. Une fois qu'une ressource est téléchargée, le socket TCP sur lequel la requête HTTP se déplace est fermé. La raison d'origine de cela était la simplicité. Mais l'effet secondaire est que les serveurs HTTP exécutant des sites Web modernes peuvent gérer beaucoup plus d'utilisateurs que les serveurs basés sur des sockets comme SSH ou ftp.

Les sockets ne peuvent donc pas être utilisés car HTTP fermera le socket après avoir téléchargé la page Web.

Bien sûr, dire que HTTP fermera le socket par ressource revient à simplifier les choses car HTTP a des fonctionnalités comme le pipelining et les connexions persistantes qui peuvent télécharger plusieurs ressources par socket. Mais ce n'est qu'une optimisation. Une fois tout téléchargé, votre navigateur fermera le socket après un certain délai.

HTTP a été initialement conçu comme un protocole simple pour télécharger des fichiers HTML. Les anciens navigateurs peuvent également télécharger des fichiers HTML à partir d'autres protocoles comme Gopher et ftp. En tant que tel, il n'y avait aucune raison de rendre HTTP avec état car les fichiers HTML ne sont que de simples fichiers texte.

Une fois que les formulaires Web ont été introduits et que les pages HTML peuvent renvoyer des données aux pages Web du serveur qui ont commencé à nécessiter des sessions. Ainsi, les cookies ont été créés pour réintroduire l'état dans un protocole sans état qui est transmis via une couche de transfert avec état qui est transmise sur une couche réseau sans état. Les couches d'application complètes sont donc:

  • Ethernet, Wifi etc. = sans état
  • IP = apatride
  • TCP = avec état
  • HTTP = sans état
  • HTTP + cookies = avec état

De nos jours, nous avons des websockets qui peuvent garder un seul socket ouvert de votre page Web au serveur. Ainsi, avec les websockets, vous pouvez à nouveau utiliser des sockets pour identifier un utilisateur car le websocket en lui-même est avec état. Mais dans la plupart des cas, vous aurez toujours besoin d'un cookie pour la page HTML principale qui charge le javascript qui démarre le websocket.

Slebetman
la source
4
«Les serveurs HTTP exécutant des sites Web modernes peuvent gérer beaucoup plus d'utilisateurs que les serveurs basés sur des sockets comme SSH ou ftp» [citation nécessaire]
el.pescado
6
@ el.pescado: C'est juste logique. Étant donné que les serveurs basés sur les sockets conservent une connexion active, les serveurs basés sur les sockets sont limités au nombre maximal de descripteurs de fichiers que vous pouvez ouvrir (et sur certains systèmes d'exploitation, les sockets sont en concurrence avec le disque dur pour les descripteurs de fichiers). Si vous n'avez pas besoin de maintenir la connexion en vie, votre limite est simplement la bande passante. Notez que la limite de bande passante est la même que vous maintenez une connexion en vie ou non. Les serveurs HTTP modernes peuvent gérer des millions de demandes par seconde. S'ils doivent conserver ces millions de sockets pendant que vous lisez une page Web, le serveur mourra
slebetman
6
+1 pour "Ainsi, les cookies ont été créés pour réintroduire l'état dans un protocole sans état qui est transmis via une couche de transfert avec état qui est transmise sur une couche réseau sans état". C'est beau
Réinstallez Monica - dirkk
J'ai aimé cette réponse. Cela va droit au cœur du problème.
Jim W
Les serveurs HTTP @slebetman sont basés sur des sockets. Ils sont tous. Par définition. Et les cookies ne rendent pas les serveurs HTTP à l'état. En fait, par définition, ils ne le sont pas, c'est pourquoi les cookies sont transférés par le client à chaque fois.
Miles Rout