Tema 10

10. Manejo seguro de sesiones, cookies, tokens y cierre de sesión

Autenticar al usuario es solo el primer paso. Luego la aplicación necesita recordar quién es en cada solicitud posterior. Esa continuidad se construye con sesiones, cookies o tokens, y si se gestiona mal puede abrir la puerta a secuestro de cuenta, fijación de sesión o abuso de sesiones olvidadas.

Objetivo Proteger la continuidad de la identidad autenticada
Enfoque Estado, transporte y control de sesión
Resultado Evitar secuestro, reutilización y cierre defectuoso

10.1 Introducción

HTTP es un protocolo sin estado. Eso significa que cada solicitud es independiente y, por sí sola, no recuerda quién hizo la anterior. Para que una aplicación web pueda mantener a un usuario autenticado entre una página y otra, necesita construir un mecanismo adicional de continuidad.

Esa continuidad suele apoyarse en sesiones, cookies o tokens. Son elementos fundamentales para la experiencia del usuario, pero también uno de los puntos más sensibles de la seguridad web. Si un atacante logra robar, fijar, reutilizar o abusar de ese estado, puede actuar como el usuario sin necesidad de volver a autenticarse.

Por eso el problema de seguridad ya no es solo proteger la contraseña, sino proteger la identidad una vez que la sesión está activa.

10.2 Qué es una sesión

Una sesión es el mecanismo por el cual la aplicación mantiene contexto entre solicitudes separadas. Luego del login, el sistema necesita reconocer que la próxima petición también pertenece al mismo usuario autenticado.

En términos prácticos, la sesión representa la continuidad del estado de autenticación. Sin ella, el usuario tendría que volver a identificarse en cada interacción.

La contraseña prueba identidad en el login. La sesión sostiene esa identidad durante el resto del uso de la aplicación.

10.3 Cookies, sesiones del lado servidor y tokens

Existen varias formas de implementar esa continuidad:

  • Sesión del lado servidor: el estado real vive en el backend y el cliente solo conserva un identificador.
  • Cookie de sesión: el navegador reenvía automáticamente el identificador o contexto necesario.
  • Tokens: el cliente transporta un valor firmado o verificable, muchas veces en cabeceras o cookies.

Cada modelo tiene ventajas y riesgos, pero todos comparten una exigencia común: proteger el valor que representa la identidad activa.

10.4 Cookies: pieza crítica del navegador

Las cookies son pequeños datos que el servidor envía al navegador para que este los reenvíe en solicitudes futuras al mismo dominio o contexto permitido. Su uso en autenticación es extremadamente común.

Cuando una cookie contiene o referencia una sesión autenticada, pasa a ser un objetivo muy valioso. Si se filtra o es reutilizada por un atacante, la cuenta puede quedar comprometida sin tocar la contraseña.

10.5 Atributos importantes de una cookie

La seguridad de la cookie depende en gran medida de cómo se configura.

Atributo Función Impacto en seguridad
HttpOnly Impide acceso desde JavaScript Reduce robo directo por ciertos escenarios de XSS
Secure Restringe envío a HTTPS Evita exposición en tráfico no cifrado
SameSite Controla envío cross-site Ayuda a mitigar CSRF
Domain y Path Definen alcance Reducen exposición innecesaria dentro del sitio
Expires o Max-Age Determinan duración Influyen en cuánto tiempo puede reutilizarse

10.6 Identificador de sesión: debe ser impredecible

Si el sistema usa un identificador de sesión, este debe ser suficientemente aleatorio e impredecible. Si puede adivinarse o generarse con un patrón débil, un atacante podría intentar anticiparlo y reutilizarlo.

La sesión no debe basarse en valores triviales, secuenciales o derivados de información pública del usuario.

10.7 Session fixation

La fijación de sesión ocurre cuando el atacante logra que la víctima use un identificador de sesión conocido o controlado por él. Luego, si la víctima se autentica sobre esa misma sesión, el atacante ya conoce el valor válido y puede intentar reutilizarlo.

Una defensa clásica consiste en regenerar el identificador de sesión después del login y también al cambiar de privilegio o contexto sensible. Así se evita que una sesión previa o inducida siga siendo válida tras la autenticación.

10.8 Session hijacking o secuestro de sesión

El secuestro de sesión ocurre cuando un atacante obtiene un valor de sesión válido y lo reutiliza para actuar como la víctima. Esto puede pasar por diferentes caminos:

  • Tráfico inseguro sin HTTPS.
  • XSS que expone contexto sensible.
  • Malware o compromiso del dispositivo.
  • Sesiones no invalidadas correctamente.
  • Exposición en logs, URLs o almacenamiento inseguro.

Una vez secuestrada, la sesión puede permitir acceso inmediato sin necesidad de contraseña o MFA.

10.9 Tiempo de vida e inactividad

La duración de una sesión es un punto delicado. Si dura demasiado, un valor robado o una sesión olvidada sigue siendo útil durante más tiempo. Si dura demasiado poco, la usabilidad se vuelve mala. Por eso se suele trabajar con dos ideas:

  • Expiración absoluta: tiempo máximo total de vida.
  • Expiración por inactividad: cierre automático si el usuario no interactúa durante cierto período.

El equilibrio depende del riesgo de la aplicación y del tipo de acción que protege.

10.10 Reautenticación en acciones sensibles

No todas las acciones deberían confiar igual en una sesión antigua. Para operaciones críticas como cambio de contraseña, modificación de datos de recuperación, transferencias o acceso administrativo, conviene reautenticar o pedir una prueba adicional reciente.

Esto reduce impacto de sesiones abiertas en equipos compartidos, robo de sesión y ataques donde la sesión sigue viva, pero ya no representa una intención suficientemente fresca del usuario.

10.11 JWT y otros tokens

En muchas arquitecturas modernas se usan tokens firmados, como JWT, para transportar identidad y contexto. Su uso puede ser adecuado, pero implica responsabilidades claras:

  • Firmarlos correctamente.
  • Limitar su duración.
  • Evitar guardar información excesiva o sensible dentro de ellos.
  • Definir cómo se revocan cuando es necesario.

Un error frecuente es pensar que porque un token está firmado ya no hace falta gestionarlo con cuidado. En realidad, sigue siendo una credencial de acceso.

10.12 Almacenamiento de tokens en el cliente

El lugar donde se guarda el token importa mucho. Distintos mecanismos exponen riesgos distintos. Por ejemplo, almacenamiento accesible desde JavaScript puede verse más afectado por XSS, mientras que cookies automáticas reintroducen preocupaciones de CSRF si no se configuran correctamente.

No existe una respuesta única universal. La decisión debe evaluarse junto con el modelo de amenaza, la arquitectura del frontend y las capas defensivas disponibles.

10.13 Revocación y cierre de sesión

Un cierre de sesión seguro no debería limitarse a ocultar la interfaz o borrar elementos visuales. Debe invalidar realmente el contexto autenticado o el token asociado, de modo que no pueda seguir reutilizándose.

Esto es importante cuando:

  • El usuario cierra sesión voluntariamente.
  • Cambia su contraseña.
  • Se detecta actividad sospechosa.
  • Se revocan permisos.
  • Se pierde o compromete un dispositivo.

10.14 Cierre de sesión local vs invalidación real

En algunos sistemas, especialmente con tokens del lado cliente, puede existir la tentación de considerar suficiente “olvidar” el token en la interfaz. Eso puede ser insuficiente si el token sigue siendo aceptado por el backend hasta su expiración.

Cuando el riesgo lo requiere, la aplicación debe contar con mecanismos reales de invalidación, revocación o rotación, y no depender solo de que el cliente deje de mostrar el valor.

10.15 Sesiones concurrentes y gestión de dispositivos

Muchas aplicaciones permiten múltiples sesiones abiertas en distintos dispositivos o navegadores. Esto es útil para el usuario, pero también amplía la superficie de riesgo. Un diseño maduro suele considerar:

  • Visualización de sesiones activas.
  • Capacidad de cerrar sesiones remotas.
  • Notificaciones ante nuevo dispositivo o ubicación inusual.
  • Políticas específicas para cuentas sensibles.

10.16 Errores frecuentes en manejo de sesión

  • No regenerar la sesión tras autenticación.
  • Usar cookies sin `HttpOnly`, `Secure` o `SameSite` cuando corresponda.
  • Permitir sesiones excesivamente largas sin controles.
  • No invalidar correctamente al cerrar sesión o cambiar credenciales.
  • Exponer tokens en lugares inseguros como URLs o logs.
  • Confiar en que la sesión del frontend representa por sí sola el estado real del backend.
Muchas aplicaciones se concentran en hacer seguro el login, pero olvidan que el atacante a menudo prefiere robar o reutilizar una sesión ya iniciada.

10.17 Ejemplo conceptual

Imaginemos un portal administrativo que permite login con MFA, pero una vez dentro conserva la misma sesión durante días y no invalida otras sesiones al cambiar la contraseña. Si un atacante obtiene una cookie válida mediante equipo comprometido o sesión olvidada, puede seguir accediendo aunque la contraseña ya haya cambiado.

Este ejemplo muestra que autenticación fuerte y gestión de sesión débil pueden anularse entre sí.

10.18 Defensa en profundidad para sesiones

Una estrategia madura suele combinar:

  • Identificadores de sesión impredecibles.
  • Cookies bien configuradas.
  • Regeneración de sesión tras login o elevación de privilegios.
  • Expiración razonable por tiempo e inactividad.
  • Reautenticación en acciones críticas.
  • Invalidación real en logout, cambio de contraseña o incidente.
  • Protección complementaria frente a XSS y CSRF.

10.19 Qué debes recordar de este tema

  • La sesión sostiene la identidad autenticada entre solicitudes y por eso es un objetivo muy valioso.
  • Cookies y tokens deben tratarse como credenciales sensibles.
  • Regenerar sesión tras login y configurar correctamente atributos de cookie reduce riesgos clave.
  • El cierre de sesión debe invalidar realmente el estado autenticado, no solo ocultarlo en el cliente.
  • Una buena gestión de sesión complementa y protege a la autenticación fuerte.

10.20 Conclusión

La seguridad de sesión es la continuación natural de la autenticación. Si la aplicación autentica bien al usuario, pero luego conserva mal su estado, el valor del login seguro se pierde rápidamente. Proteger sesiones, cookies y tokens es proteger la identidad ya iniciada en el momento donde suele resultar más valiosa para un atacante.

En el próximo tema veremos protección de datos sensibles, cifrado y almacenamiento seguro, para extender la seguridad desde identidades y sesiones hacia la información que la aplicación guarda y procesa.