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
| Atributo | Propósito | Impacto en seguridad |
|---|---|---|
| Name=Value | Los datos almacenados | No debería contener datos sensibles en texto plano |
| Domain | Qué dominio puede acceder | Cookie para .example.com es accesible por sub.example.com |
| Path | Qué ruta URL puede acceder | Cookie de /admin no se envía para /public |
| Expires/Max-Age | Cuándo expira | Cookies de sesión expiran al cerrar el navegador |
| Secure | Solo se envía por HTTPS | Previene transmisión sin cifrar |
| HttpOnly | No accesible vía JavaScript | Protege contra robo por XSS |
| SameSite | Controla envío cross-site | Strict, Lax o None — previene CSRF |
Probando atributos de cookies
Abre DevTools > Application > Cookies e inspecciona cada cookie:
- Cookies de autenticación deben tener flags Secure, HttpOnly y SameSite
- Cookies de sesión no deberían tener Expires/Max-Age largo
- Domain debería ser lo más restrictivo posible
- 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:
- Datos almacenados correctamente después de acciones del usuario
- Datos recuperados correctamente al cargar la página
- La aplicación maneja datos faltantes o corruptos
- Límites de almacenamiento manejados adecuadamente
- Limpiar datos del navegador elimina los items esperados
- 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
- Creación: Después del login, verificar cookie con atributos correctos
- Mantenimiento: La sesión debe renovarse con actividad
- Advertencia: Antes de expirar, mostrar advertencia con opción de extender
- Expiración: Después del timeout, redirigir al login
- Re-autenticación: Después de re-login, restaurar contexto
- 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
- Llena localStorage a capacidad desde la consola
- Intenta agregar más datos — ¿se maneja QuotaExceededError?
- ¿La aplicación muestra mensaje útil?
Ejercicio: Auditoría de seguridad de almacenamiento
- Cookies: Lista todas, verifica flags de seguridad
- Local Storage: Busca datos sensibles
- Session Storage: Verifica scope apropiado
- Elimina items manualmente y verifica recuperación
- Prueba en modo incógnito
| Almacenamiento | Key | Contiene | ¿Problema? |
|---|---|---|---|
| Cookie | session_id | Token sesión | Falta HttpOnly |
| localStorage | auth_token | JWT | Debería ser cookie HttpOnly |
Prevención de session fixation
- Anota el valor de la cookie antes del login
- Inicia sesión
- Verifica que el valor cambió
- 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