Codea Seguro Codea Seguro
Desarrollo Seguro Dificultad: basica

Cabeceras de seguridad HTTP

Las cabeceras y atributos de cookie que endurecen una app web con poco esfuerzo.

Las cabeceras de respuesta HTTP son una de las defensas de mayor retorno por esfuerzo: unas pocas líneas de configuración mitigan XSS, clickjacking y fugas de información.

1. Content-Security-Policy (CSP)

La defensa más potente contra XSS: declara de dónde puede cargar recursos la página.

Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'none'

Empieza en modo reporte (Content-Security-Policy-Report-Only) para no romper nada, revisa los informes y luego aplícala. Evita unsafe-inline y unsafe-eval.

2. Strict-Transport-Security (HSTS)

Fuerza HTTPS en el navegador y previene downgrade a HTTP:

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

3. Otras cabeceras clave

X-Content-Type-Options: nosniff        # no adivinar el tipo MIME
X-Frame-Options: DENY                   # anti-clickjacking (o usa frame-ancestors en CSP)
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()

Las cookies de sesión necesitan los tres atributos:

res.cookie('session', token, {
  httpOnly: true,   // inaccesible desde JS → mitiga robo por XSS
  secure: true,     // solo por HTTPS
  sameSite: 'lax',  // mitiga CSRF ('strict' si no necesitas navegación cruzada)
});

5. No reinventes: usa una librería

// Express
import helmet from 'helmet';
app.use(helmet());

Frameworks como Next.js, Astro o Django permiten configurar estas cabeceras de forma declarativa.

Checklist rápida

  • CSP definida, sin unsafe-inline/unsafe-eval, probada en modo reporte.
  • HSTS con max-age alto e includeSubDomains.
  • nosniff, anti-clickjacking y Referrer-Policy presentes.
  • Cookies de sesión con HttpOnly, Secure y SameSite.
  • Cabeceras gestionadas con una librería (p. ej. Helmet) o config del framework.