Los headers de seguridad HTTP son la primera línea de defensa de tu sitio web. Actúan como instrucciones que tu servidor envía al navegador para indicarle cómo comportarse: qué scripts ejecutar, qué recursos cargar, cómo manejar las conexiones. Sin ellos, tu sitio queda expuesto a ataques XSS, clickjacking, MIME sniffing y muchos otros.
La buena noticia: configurarlos es cuestión de minutos y el impacto en seguridad es enorme.
Los 7 headers esenciales
1. Strict-Transport-Security (HSTS)
Obliga al navegador a usar siempre HTTPS, incluso si el usuario escribe http://. Previene ataques de downgrade SSL y man-in-the-middle.
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age=31536000: un año en segundosincludeSubDomains: aplica también a subdominiospreload: permite inclusión en la lista HSTS preload de los navegadores
Importante: solo activa includeSubDomains si TODOS tus subdominios tienen HTTPS. Un subdominio sin SSL quedará inaccesible.
2. Content-Security-Policy (CSP)
Controla qué recursos puede cargar tu página. Es la defensa más potente contra XSS.
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://api.example.com; frame-ancestors 'none'
Empieza con una política restrictiva y ve añadiendo fuentes según las necesites. Usa Content-Security-Policy-Report-Only primero para detectar problemas sin bloquear.
Para una guía detallada de CSP, consulta: Content Security Policy — Guía completa.
3. X-Content-Type-Options
Previene el MIME sniffing: el navegador no intentará "adivinar" el tipo de contenido, respetando el Content-Type declarado.
X-Content-Type-Options: nosniff
Sin este header, un archivo .txt malicioso podría ejecutarse como JavaScript si el navegador interpreta su contenido como script.
4. X-Frame-Options
Previene el clickjacking: no permite que tu sitio se muestre dentro de un iframe en otro dominio.
X-Frame-Options: SAMEORIGIN
Opciones:
DENY: nunca permitir iframesSAMEORIGIN: solo iframes del mismo dominio
Nota: este header está siendo reemplazado por la directiva frame-ancestors de CSP, pero conviene mantenerlo para compatibilidad con navegadores antiguos.
5. Referrer-Policy
Controla qué información del referrer se envía cuando el usuario navega desde tu sitio a otro.
Referrer-Policy: strict-origin-when-cross-origin
Opciones recomendadas:
strict-origin-when-cross-origin: envía origen completo en mismo dominio, solo el dominio en cross-origin, nada en downgrade HTTPS→HTTPno-referrer: no envía referrer nunca (más privado, pero puede romper analítica)
6. Permissions-Policy
Controla qué APIs del navegador puede usar tu sitio (cámara, micrófono, geolocalización, etc.).
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(self)
Desactiva por defecto todo lo que no necesites. Esto previene que scripts de terceros abusen de estas APIs.
7. X-XSS-Protection
Activa el filtro XSS del navegador. Aunque los navegadores modernos lo han desactivado en favor de CSP, no hace daño mantenerlo para navegadores antiguos.
X-XSS-Protection: 1; mode=block
Configuración por plataforma
Apache (.htaccess)
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'"
Header always set X-XSS-Protection "1; mode=block"
</IfModule>
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'" always;
add_header X-XSS-Protection "1; mode=block" always;
Next.js (next.config.js)
const securityHeaders = [
{ key: 'Strict-Transport-Security', value: 'max-age=31536000; includeSubDomains' },
{ key: 'X-Content-Type-Options', value: 'nosniff' },
{ key: 'X-Frame-Options', value: 'SAMEORIGIN' },
{ key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
{ key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
]
module.exports = {
async headers() {
return [{ source: '/(.*)', headers: securityHeaders }]
},
}
Verificación
Después de configurar los headers, verifica que están activos:
- Herramientas de navegador: DevTools → Network → selecciona cualquier petición → Response Headers
- WarDek: escanea tu dominio y obtén una puntuación de headers de seguridad
- SecurityHeaders.com: herramienta gratuita de evaluación rápida
- Mozilla Observatory: auditoría completa de configuración HTTP
Errores comunes
Configurar CSP demasiado permisivo. Content-Security-Policy: default-src * es como no tener CSP. Empieza restrictivo y abre según necesidad.
Olvidar always en Nginx. Sin la directiva always, Nginx solo envía headers en respuestas 2xx, dejando las páginas de error sin protección.
HSTS con includeSubDomains sin verificar subdominios. Si un subdominio no tiene HTTPS, quedará inaccesible hasta que caduque el max-age.
No testear CSP antes de activar. Usa Content-Security-Policy-Report-Only primero para detectar violaciones sin bloquear contenido.
Cumplimiento normativo en España
Los headers de seguridad HTTP son un componente clave para cumplir con varias regulaciones europeas y españolas. El Esquema Nacional de Seguridad (ENS) exige cifrado en tránsito (HSTS), y la directiva NIS2 incluye las cabeceras de seguridad como parte de las medidas técnicas mínimas del Artículo 21. El INCIBE recomienda expresamente configurar HSTS, CSP y X-Content-Type-Options como parte de las buenas prácticas de ciberhigiene para PYMES.
Además, el RGPD exige medidas técnicas adecuadas para proteger datos personales. Cabeceras como CSP y X-Frame-Options reducen significativamente el riesgo de ataques que podrían comprometer datos de usuarios, lo que contribuye directamente al cumplimiento del artículo 32 del RGPD sobre seguridad del tratamiento.
Escanea tu sitio web gratis con WarDek — OWASP, NIS2, RGPD, AI Act en un solo escaneo.