¿Por qué no se pueden usar sockets para identificar a las personas en lugar de las cookies?

17

Se hizo otra pregunta sobre el uso de direcciones IP para identificar clientes individuales. Creo que entiendo por qué una dirección IP es insuficiente. Pero, ¿qué pasa con el zócalo, que tiene más información y, por lo que entiendo, tiene estado? ¿No podría usarse potencialmente en lugar de una cookie?

Comunidad
fuente
18
El socket tiene estado, pero http no mantiene la conexión abierta después de haber descargado la página web. Se cierra unos 15 segundos después de que se descargue toda la página web. esta es la razón por la que necesita cookies para mantener el estado
MTilsted
41
Un socket no es una pieza de datos. No puedes enviarlo. Tu pregunta no tiene sentido.
user207421
8
Es como preguntar por qué no se puede usar verbos en lugar de los nombres ...
user541686
2
@EJP: respondí bajo el supuesto de que OP significa cuádruple (source_ip, source_port, target_ip, target_port) en lugar del objeto socket. Pero tu interpretación también tiene sentido.
Jörg W Mittag
Puede intentar imitar la forma en que funciona Firebase para administrar el estado o la identidad del usuario sin cookies o sesión.
JeffO

Respuestas:

64

Un zócalo identifica una conexión . Las cookies se utilizan generalmente para identificar a un usuario . Si abro dos pestañas del navegador en SE.SE, tendré dos conexiones y, por lo tanto, dos sockets. Pero quiero que mi configuración persista en ambos. (De hecho, normalmente, un navegador abre múltiples sockets para una página para acelerar el tiempo de carga de la página; creo que la mayoría de los navegadores tienen un valor máximo predeterminado entre 4 y 10 sockets por página).

Y lo contrario también puede suceder: si cierro la pestaña de mi navegador, otro usuario en la máquina puede abrir una pestaña del navegador para SE.SE, y puede obtener el mismo cuádruple de (source_ip, source_port, target_ip, target_port), en cuyo caso , obtendrá todos mis ajustes.

Jörg W Mittag
fuente
Vale la pena señalar que con http2 (y canalización de http) que probablemente no tendrá dos sockets abiertos para SE. Su navegador reutilizará el mismo socket. Necesitarías tener diferentes navegadores funcionando.
Matthew Steeples
3
Un testigo local trivial indica que Chrome lo hace mantener una toma abierta por pestaña - probablemente porque están sandboxed y que no quiere que el estado de acciones entre ellos - pero toma de cada pestaña parece ser persistente y solicitudes están probablemente pipeline dentro de esa pestaña.
Inútil
1
También vale la pena señalar que tampoco sabes lo que está sucediendo en la parte trasera. Muchos equilibradores de carga terminarán una conexión de usuarios y luego abrirán los suyos en los servidores de fondo, lo que significa que puede tener múltiples usuarios compartiendo un solo socket.
Dan
@Useless IIRC SE utiliza WebSockets o sondeos largos (respaldo) para obtener actualizaciones (nuevas preguntas, ediciones, etc.) en caso de que esté probando aquí. Otros sitios pueden comportarse de manera diferente: no tiene mucho sentido mantener un socket abierto indefinidamente en un sitio estático.
Bob
Es cierto, me tomó algunos intentos encontrar un sitio realmente estático para verificar. Para ello, Chrome abre múltiples tomas por pestaña, y todavía no reutilizarlos entre pestañas, pero hace cerca de ellos una vez que la lengüeta tiene terminado de cargar. Sin embargo, son fácilmente visibles porque pasan mucho tiempo en TIME_WAIT.
Inútil
20

Los sockets TCP están diseñados para tener estado, por lo que, en general, se utilizan para identificar sesiones. Los protocolos como SSH y ftp hacen exactamente esto.

HTTP está diseñado para no tener estado y cada conexión solo está asociada con un recurso para descargar. Después de descargar un recurso, se cierra el socket TCP en el que se basa la solicitud HTTP. La razón original de esto fue la simplicidad. Pero el efecto secundario es que los servidores HTTP que ejecutan sitios web modernos pueden manejar muchos más usuarios que los servidores basados ​​en sockets como SSH o ftp.

Por lo tanto, los sockets no se pueden usar porque HTTP cerrará el socket después de descargar la página web.

Por supuesto, decir que HTTP cerrará el socket por recurso es simplificar demasiado las cosas porque HTTP tiene características como canalización y conexiones persistentes que pueden descargar múltiples recursos por socket. Pero eso es solo optimización. Después de que todo se haya descargado, su navegador cerrará el socket después de un tiempo de espera.

HTTP fue originalmente diseñado como un protocolo simple para descargar archivos HTML. Los navegadores antiguos también pueden descargar archivos HTML de otros protocolos como Gopher y ftp. Como tal, no había razón para hacer HTTP con estado porque los archivos HTML son simples archivos de texto.

Una vez que se introdujeron los formularios web y las páginas HTML pueden enviar datos al servidor, las páginas web comenzaron a necesitar sesiones. Por lo tanto, las cookies se crearon para reintroducir el estado en un protocolo sin estado que se transmite a través de una capa de transferencia con estado que se transmite a través de una capa de red sin estado. Entonces, las capas de aplicación completas son:

  • Ethernet, Wifi, etc. = sin estado
  • IP = sin estado
  • TCP = con estado
  • HTTP = sin estado
  • HTTP + cookies = con estado

En estos días tenemos websockets que pueden mantener un solo socket abierto desde su página web al servidor. Por lo tanto, con websockets puede volver a usar sockets para identificar a un usuario porque el websocket en sí mismo tiene estado. Pero en la mayoría de los casos aún necesitará una cookie para la página html principal que carga el javascript que inicia el websocket.

slebetman
fuente
44
"Los servidores HTTP que ejecutan sitios web modernos pueden manejar muchos más usuarios que los servidores basados ​​en sockets como SSH o ftp" [cita requerida]
el.pescado
66
@ el.pescado: es lógico. Como los servidores basados ​​en sockets mantienen una conexión en vivo, los servidores basados ​​en sockets están limitados a la cantidad máxima de descriptores de archivo que puede abrir (y en algunos sistemas operativos los sockets compiten con el disco duro por los descriptores de archivo). Si no necesita mantener viva la conexión, entonces su límite es solo el ancho de banda. Tenga en cuenta que el límite de ancho de banda es el mismo tiempo que mantiene viva una conexión o no. Los servidores HTTP modernos pueden manejar millones de solicitudes por segundo. Si necesitan mantener esos millones de enchufes mientras lee una página web, el servidor moriría
slebetman
66
+1 para "Por lo tanto, las cookies se crearon para reintroducir el estado en un protocolo sin estado que se transmite a través de una capa de transferencia con estado que se transmite a través de una capa de red sin estado". Eso es hermoso
Restablece a Mónica - dirkk
Me gustó esta respuesta. Se corta directamente al núcleo del problema.
Jim W
Los servidores HTTP @slebetman están basados ​​en sockets. Todos ellos son. Por definición. Y las cookies no hacen que los servidores HTTP tengan estado. De hecho, por definición no lo son, razón por la cual el cliente transfiere las cookies cada vez.
Miles Rout