Cómo hacen las apps para recordarte
Inicias sesión. Haces clic en algo. El servidor no tiene idea de quién eres.
HTTP no guarda estado: cada solicitud llega desde cero, sin memoria de la anterior y sin ninguna forma incorporada de conectar una con otra. El login que funcionó hace un segundo no dejó ningún rastro.
Por eso, una app que necesita reconocerte entre solicitudes tiene que guardar tu identidad en algún lado y recuperarla en cada solicitud que llegue después.
Todo este capítulo gira en torno a una sola pregunta: ¿dónde vive la identidad?
Casi todos los flujos de login en la web responden esto de una de tres formas.
El servidor recuerda
En la identidad con estado, el servidor es quien guarda la información.
Cuando inicias sesión, el servidor crea una sesión, un pequeño paquete de datos que te representa: un id de usuario, un nombre, tal vez un rol. Esa sesión vive en el servidor. El navegador recibe una cookie con un id de sesión, nada más, y la envía automáticamente en cada solicitud a ese dominio. El servidor toma el id, busca la sesión, y así vuelve a saber quién eres.
Este es el patrón tradicional de las apps web, y el predeterminado en muchos frameworks. Si alguna vez usaste express-session, esto es exactamente lo que hacía.
Todo lo que importa sobre ti se queda en el servidor, y el id solo le sirve a alguien que también pueda llegar hasta ese servidor.
El cliente lleva la prueba
En la identidad sin estado, el servidor no guarda nada sobre ti.
El cliente tiene un token y lo envía en cada solicitud. El servidor verifica el token y responde, sin tener que consultar nada sobre quién eres entre una solicitud y otra.
Esto funciona bien para APIs, apps móviles y sistemas distribuidos, donde compartir memoria entre servidores resulta incómodo o simplemente no es posible. Si alguna vez llamaste a una API y recibiste 401 Unauthorized: missing authorization header, ese es este modelo diciéndote que traigas tu prueba.
Hay dos versiones de esto, y la diferencia es tan importante que cada una tiene su propio capítulo. Un token opaco de portador es una cadena aleatoria sin significado que el servidor tiene que consultar. Un JSON Web Token lleva la identidad dentro de sí mismo, firmada, así que no hace falta ninguna consulta.
Igual tiene una base de datos llena de usuarios. Lo que deja de mantener es un registro del hecho de que en este momento tienes la sesión iniciada.
Alguien más responde por ti
En la identidad delegada, un tercero en el que confías confirma quién es el usuario en tu nombre.
Tu app le pregunta a Google si reconoce a esta persona. Google se encarga del login y le entrega a tu app un token que prueba la respuesta. Cada botón de "Iniciar sesión con Google", "Iniciar sesión con GitHub" o "Iniciar sesión con Apple" es exactamente esto.
Lo atractivo es que dejas de operar un sistema de contraseñas. Sin almacenamiento de contraseñas, sin flujo de recuperación, sin filtración de credenciales que nunca tuviste. OAuth e identidad delegada explica cómo funciona realmente esta transferencia.
Por eso te redirige a una página de Google y luego te trae de vuelta. La verificación pasó allá.
Uno al lado del otro
| Con estado | Sin estado | Delegado | |
|---|---|---|---|
| Dónde vive la identidad | En el servidor | En el token que tiene el cliente | Con el proveedor |
| Costo por solicitud | Una consulta | Una verificación de firma, o una consulta | Depende del token que termines usando |
| Revocar el acceso | Inmediato | Difícil, normalmente hay que esperar a que expire | En parte, depende del proveedor |
| Escala horizontalmente | Necesita un almacén compartido | Libremente | Libremente |
| Lo principal que sacrificas | Coordinación entre servidores | La capacidad de cambiar de opinión | Control e independencia |
Ninguno de los tres es la respuesta correcta. Cada uno optimiza para cosas distintas, por eso los sistemas reales suelen combinar más de uno: un login delegado para establecer quién eres, una sesión para el sitio web, tokens para la API.
La idea principal que vale la pena llevarte al siguiente capítulo: con estado es para tener control, sin estado es para escalar, delegado es para pasarle el problema a alguien más.
Ponlo a prueba
Para cada sistema, nombra el modelo que esperarías encontrar y la propiedad que lo determina.
- Un panel de administración interno donde revocar el acceso de alguien tiene que surtir efecto de inmediato.
- Una API pública que atiende a una app móvil con unos cientos de miles de usuarios.
- Una app de fotos cuyo registro completo es un botón de "Continuar con Google".
- Una arquitectura de microservicios donde una docena de servicios necesitan saber quién los está llamando.
Compara tus respuestas
| # | Modelo | La propiedad que lo determina |
|---|---|---|
| 1 | Con estado | Revocación inmediata. Eliminas la sesión y la siguiente solicitud queda anónima. Nada más ofrece eso. |
| 2 | Sin estado | No hay un almacén de sesiones compartido que coordinar a medida que crece el tráfico, y los clientes móviles pueden llevar un token sin problema. |
| 3 | Delegado | No hay que construir, almacenar ni exponer a filtraciones un sistema de contraseñas, y el registro es lo más rápido posible. |
| 4 | Sin estado, específicamente JWTs | Cada servicio puede verificar el token por sí mismo sin tener que consultar a un servidor central en cada llamada. |
El número 1 es el más interesante. Es el sistema más pequeño de la lista y el que menos presión de escalamiento tiene, y aun así usa el modelo que peor escala, porque acá el control importa más que el crecimiento.
Hacia dónde vamos ahora
Tres familias, cada una resuelve el problema de una forma distinta.
Sesiones y cookies desarma la primera en detalle: qué guarda el servidor, qué lleva el navegador, y los errores que convierten un modelo sólido en uno con fugas.

