Fundamentos

Cookies y Sesiones

Principiante⏱️ 15 minutos de lectura

¿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

1

El servidor envía una cookie

Set-Cookie: session_id=abc123; HttpOnly; Secure
2

El navegador guarda la cookie

La cookie se almacena localmente en el navegador del usuario

3

El navegador envía la cookie en cada petición

Cookie: session_id=abc123
4

El servidor identifica al usuario

El servidor usa el session_id para recuperar los datos del usuario

Atributos Importantes de Cookies

HttpOnly

Previene que JavaScript acceda a la cookie. Protege contra ataques XSS.

Secure

La cookie solo se envía por HTTPS. Previene interceptación en tráfico no cifrado.

SameSite

Controla 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 / Expires

Define 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=Strict

JWT: 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)eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
PAYLOAD (datos del usuario)eyJ1c2VySWQiOjQyLCJ1c2VybmFtZSI6ImFsaWNlIn0
.
SIGNATURE (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

Siguiente Paso

SQL Injection (Vulnerabilidad)