Cookies y Sesiones
¿Qué son las Cookies?
Las cookies son pequeños archivos de texto que los sitios web guardan en tu navegador. Permiten que el servidor "recuerde" información sobre el usuario entre diferentes peticiones HTTP.
HTTP es un protocolo stateless (sin estado), es decir, cada petición es independiente. Las cookies resuelven este problema permitiendo mantener estado entre peticiones.
Cómo Funcionan las Cookies
Proceso de Cookie
El servidor envía una cookie
Set-Cookie: session_id=abc123; HttpOnly; SecureEl navegador guarda la cookie
La cookie se almacena localmente en el navegador del usuario
El navegador envía la cookie en cada petición
Cookie: session_id=abc123El servidor identifica al usuario
El servidor usa el session_id para recuperar los datos del usuario
Atributos Importantes de Cookies
HttpOnlyPreviene que JavaScript acceda a la cookie. Protege contra ataques XSS.
SecureLa cookie solo se envía por HTTPS. Previene interceptación en tráfico no cifrado.
SameSiteControla si la cookie se envía en peticiones cross-site. Protege contra CSRF.
• Strict: Solo peticiones del mismo sitio
• Lax: Permite navegación normal (por defecto)
• None: Permite cross-site (requiere Secure)
Max-Age / ExpiresDefine cuándo expira la cookie. Sin estos, la cookie se borra al cerrar el navegador.
Sesiones del Lado del Servidor
Una sesión es un mecanismo para almacenar datos del usuario en el servidor, usando una cookie con un identificador de sesión (session ID) en el cliente.
✅ Ventajas
- • Datos sensibles en servidor (más seguro)
- • Solo el ID viaja en cada petición
- • Control total del servidor
- • Invalidación fácil (logout)
⚠️ Desventajas
- • Requiere almacenamiento en servidor
- • Más difícil de escalar (múltiples servidores)
- • Necesita Redis/DB para persistencia
Ejemplo de Almacenamiento de Sesión
// En el servidor (ejemplo con Redis)
sessions = {
"abc123": {
userId: 42,
username: "alice",
role: "admin",
createdAt: "2025-01-05T10:00:00Z"
}
}
// Cookie enviada al cliente
Set-Cookie: session_id=abc123; HttpOnly; Secure; SameSite=StrictJWT: Tokens Sin Estado
JWT (JSON Web Token) es una alternativa a las sesiones tradicionales. El servidor firma un token que contiene los datos del usuario, y el cliente lo envía en cada petición.
Estructura de un JWT
HEADER (algoritmo)eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9PAYLOAD (datos del usuario)eyJ1c2VySWQiOjQyLCJ1c2VybmFtZSI6ImFsaWNlIn0SIGNATURE (firma digital)SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c✅ Ventajas
- • Sin estado (stateless)
- • Fácil de escalar
- • No requiere almacenamiento en servidor
- • Funciona entre dominios
⚠️ Desventajas
- • No se puede invalidar fácilmente
- • Más datos en cada petición
- • Vulnerable si se almacena en localStorage
Vulnerabilidades Comunes
🔓 Session Hijacking
Un atacante roba el session ID (por XSS o sniffing) y se hace pasar por el usuario.
Defensa: HttpOnly, Secure, regenerar session ID después del login
🔓 Session Fixation
Atacante fuerza un session ID conocido antes del login del usuario.
Defensa: Regenerar session ID en login/logout
🔓 XSS robando cookies
JavaScript malicioso lee document.cookie y envía las cookies al atacante.
Defensa: HttpOnly flag, sanitizar inputs, CSP
🔓 JWT en localStorage
Almacenar JWT en localStorage lo hace vulnerable a XSS.
Defensa: Usar cookies HttpOnly para JWT, o memoria (no persistente)
Cookie Segura vs Insegura
❌ Cookie Insegura
Set-Cookie: session=abc123
- ⚠️Sin HttpOnly (vulnerable a XSS)
- ⚠️Sin Secure (viaja por HTTP)
- ⚠️Sin SameSite (vulnerable a CSRF)
✅ Cookie Segura
Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Strict; Max-Age=3600; Path=/
- HttpOnly protege contra XSS
- Secure requiere HTTPS
- SameSite protege contra CSRF