Comprobador de seguridad de cookies

Tres flags deciden si se puede robar una sesión.

Escribe una URL y listamos las cookies que fija tu sitio, revisando cada una en busca de Secure, HttpOnly y SameSite. Las cookies de sesión son la credencial que tus usuarios nunca ven, y estos tres atributos son la mayor parte de su protección.

Revisa sitios que sean tuyos o que tengas autorización para probar. Pedimos la página como la pediría un navegador y leemos lo que vuelve. Consulta nuestros términos.

Qué comprueba esto, y cómo es una buena respuesta

Secure

Sin ella, el navegador enviará la cookie por http plano además de por https. Suena teórico hasta que recuerdas cómo pasa de verdad: un usuario escribe tu dominio sin el esquema, o pulsa un enlace http viejo, el navegador hace una petición sin cifrar antes de que salte tu redirección, y la cookie de sesión viaja en claro por la red en la que esa persona esté. La redirección no te salva, porque la cookie ya se envió. Cualquier cookie que identifique a un usuario necesita esto.

HttpOnly

Sin ella, document.cookie puede leer el valor, lo que significa que cualquier script de la página puede. Ese es el premio entero de un bug de cross-site scripting: el atacante no necesita hacer nada ingenioso una vez que puede leer la cookie de sesión, simplemente la coge y se convierte en ese usuario. Con HttpOnly puesta, el mismo bug sigue siendo un bug, pero la sesión sobrevive. Esta es la flag que decide cuánto te va a costar tu próximo XSS.

SameSite

Si la cookie se adjunta a peticiones que vienen de otros sitios. Sin valor puesto, un formulario en la página de otra persona puede enviar a tu endpoint y el navegador incluirá amablemente la sesión, que es cross-site request forgery. Lax es el valor sensato y es lo que los navegadores modernos asumen cuando el atributo falta, pero asumir un valor por defecto del navegador no es lo mismo que declararlo, y los clientes antiguos no lo asumen. Strict es más seguro y hará que la gente aparezca deslogueada cuando llegue desde un enlace externo. None solo es legítimo para uso cross-site real y exige Secure al lado.

Qué cookies juzgamos, y cuáles dejamos pasar

No toda cookie necesita todas las flags. Una cookie de analítica o de preferencia que no guarda identidad no merece candado, y reportarla te entrenaría para ignorar el informe. Pesamos aquellas cuyos nombres parecen de sesión y autenticación, porque son las que una flag ausente tiene consecuencia real.

Cómo corregirlo

Estas se fijan donde se crea la cookie, no en un archivo de configuración global, y por eso se escapan: no hay un único sitio donde corregirlas y cada librería las escribe distinto. Los ejemplos de abajo fijan las tres a la vez.

La cabecera en sí
Set-Cookie: session=abc123; Path=/; Max-Age=604800;
  Secure;
  HttpOnly;
  SameSite=Lax

# Secure   -> https only
# HttpOnly -> invisible to document.cookie
# SameSite -> not sent on cross-site requests

# Note: SameSite=None REQUIRES Secure, and browsers drop the cookie
# entirely if you set None without it. That silent drop is a common
# cause of "my login works locally and not in production".
Next.js
import { cookies } from "next/headers";

(await cookies()).set("session", token, {
  httpOnly: true,
  secure: process.env.NODE_ENV === "production",
  sameSite: "lax",
  path: "/",
  maxAge: 60 * 60 * 24 * 7,
});
Express
// Behind a proxy or load balancer, "secure" cookies are dropped
// unless Express is told to trust the forwarded protocol. Missing
// this is why the flag silently does nothing in production.
app.set("trust proxy", 1);

res.cookie("session", token, {
  httpOnly: true,
  secure: true,
  sameSite: "lax",
  maxAge: 1000 * 60 * 60 * 24 * 7,
});
Hono, Fastify y compañía
// Hono
import { setCookie } from "hono/cookie";

setCookie(c, "session", token, {
  httpOnly: true,
  secure: true,
  sameSite: "Lax",
  path: "/",
  maxAge: 60 * 60 * 24 * 7,
});

// Fastify (@fastify/cookie)
reply.setCookie("session", token, {
  httpOnly: true,
  secure: true,
  sameSite: "lax",
  path: "/",
});
Lo que esta herramienta no puede ver

Vemos las cookies que fija tu sitio en la única página que pedimos, antes de cualquier login. Las cookies que más importan suelen fijarse en el momento en que alguien entra, en una respuesta que nunca recibimos, así que un resultado limpio aquí no es prueba de que tu cookie de sesión esté bien. Revisa también en devtools la respuesta a tu propia petición de login. Y las flags son solo la mitad de transporte del problema: no dicen nada sobre cuánto dura la sesión, si se invalida al cerrar sesión, o si el token de dentro se puede falsificar.

Analizar también el códigoGratis para empezar. Conecta un repositorio y el primer análisis tarda unos dos minutos.