Entendiendo las cookies

Las cookies son pequeños archivos de texto almacenados por el navegador en nombre de un sitio web. Son el mecanismo principal para mantener estado en el protocolo HTTP sin estado.

Atributos de cookies

AtributoPropósitoImpacto en seguridad
Name=ValueLos datos almacenadosNo debería contener datos sensibles en texto plano
DomainQué dominio puede accederCookie para .example.com es accesible por sub.example.com
PathQué ruta URL puede accederCookie de /admin no se envía para /public
Expires/Max-AgeCuándo expiraCookies de sesión expiran al cerrar el navegador
SecureSolo se envía por HTTPSPreviene transmisión sin cifrar
HttpOnlyNo accesible vía JavaScriptProtege contra robo por XSS
SameSiteControla envío cross-siteStrict, Lax o None — previene CSRF

Probando atributos de cookies

Abre DevTools > Application > Cookies e inspecciona cada cookie:

  1. Cookies de autenticación deben tener flags Secure, HttpOnly y SameSite
  2. Cookies de sesión no deberían tener Expires/Max-Age largo
  3. Domain debería ser lo más restrictivo posible
  4. Path debería limitarse a la sección relevante

Tipos de cookies

Cookies de sesión: Sin fecha de expiración. Se eliminan al cerrar el navegador. Para autenticación temporal.

Cookies persistentes: Con fecha de expiración. Sobreviven reinicios del navegador. Para “Recordarme” y preferencias.

Cookies de terceros: De dominios diferentes al visitado. Para tracking y publicidad. Cada vez más bloqueadas.

Mecanismos de almacenamiento del lado del cliente

localStorage

  • Pares clave-valor como strings
  • Persiste hasta borrado explícito
  • Aproximadamente 5-10 MB por origen
  • Accesible por cualquier JavaScript del mismo origen
  • NO protegido contra XSS

sessionStorage

  • Misma API que localStorage
  • Limitado a la pestaña — no se comparte entre pestañas
  • Se borra al cerrar la pestaña

IndexedDB

  • Base de datos completa en el navegador
  • Datos estructurados, archivos y blobs
  • Mayor capacidad (cientos de MB)
  • API asíncrona
  • Usado por PWAs para almacenamiento offline

Probando mecanismos de almacenamiento

Para cada mecanismo, verificar:

  1. Datos almacenados correctamente después de acciones del usuario
  2. Datos recuperados correctamente al cargar la página
  3. La aplicación maneja datos faltantes o corruptos
  4. Límites de almacenamiento manejados adecuadamente
  5. Limpiar datos del navegador elimina los items esperados
  6. Comportamiento correcto en modo incógnito

Ciclo de vida de la sesión

Login → Sesión creada → Uso activo → Advertencia de timeout →
Sesión expirada → Re-autenticación → Sesión restaurada/nueva

Probando el ciclo de vida

  1. Creación: Después del login, verificar cookie con atributos correctos
  2. Mantenimiento: La sesión debe renovarse con actividad
  3. Advertencia: Antes de expirar, mostrar advertencia con opción de extender
  4. Expiración: Después del timeout, redirigir al login
  5. Re-autenticación: Después de re-login, restaurar contexto
  6. Destrucción: Después del logout, sesión invalidada en el servidor

Testing avanzado de cookies y sesiones

Testing de cookies cross-domain

Cuando una aplicación abarca múltiples subdominios:

  • ¿Las cookies se comparten correctamente entre subdominios?
  • ¿La cookie de un subdominio puede interferir con otro?
  • ¿Las restricciones SameSite funcionan para llamadas API cross-origin?

Límites de tamaño de cookies

Los navegadores limitan cookies a ~4 KB por cookie y 20-50 por dominio:

  • ¿Qué pasa al alcanzar el límite?
  • ¿Agregar una nueva cookie falla silenciosamente?

Testing de cuota de almacenamiento

  1. Llena localStorage a capacidad desde la consola
  2. Intenta agregar más datos — ¿se maneja QuotaExceededError?
  3. ¿La aplicación muestra mensaje útil?

Ejercicio: Auditoría de seguridad de almacenamiento

  1. Cookies: Lista todas, verifica flags de seguridad
  2. Local Storage: Busca datos sensibles
  3. Session Storage: Verifica scope apropiado
  4. Elimina items manualmente y verifica recuperación
  5. Prueba en modo incógnito
AlmacenamientoKeyContiene¿Problema?
Cookiesession_idToken sesiónFalta HttpOnly
localStorageauth_tokenJWTDebería ser cookie HttpOnly

Prevención de session fixation

  1. Anota el valor de la cookie antes del login
  2. Inicia sesión
  3. Verifica que el valor cambió
  4. Si es el mismo — vulnerabilidad de session fixation

Puntos clave

  • Las cookies son el mecanismo principal de estado — audita siempre los flags de seguridad
  • HttpOnly previene robo por XSS; Secure previene transmisión en texto plano; SameSite previene CSRF
  • localStorage es vulnerable a XSS — nunca almacenes tokens de auth ahí
  • Prueba el ciclo de vida completo de la sesión
  • Verifica límites y manejo de cuotas de almacenamiento
  • Los IDs de sesión deben cambiar después del login