Cuando hablamos de cookies en el ámbito de la programación y la seguridad web, uno de los atributos más importantes a considerar es HttpOnly
. Las cookies con el atributo HttpOnly
proporcionan un nivel adicional de seguridad al restringir el acceso a su contenido desde el entorno de JavaScript del lado del cliente. En este artículo, analizaremos en profundidad qué es HttpOnly
, por qué es relevante, y cómo su implementación contribuye a mitigar ciertas vulnerabilidades.
HttpOnly
?
HttpOnly
es un atributo opcional que se puede asignar a las cookies cuando se configuran en un servidor. La principal característica de este atributo es que impide que las cookies sean accesibles mediante JavaScript en el lado del cliente. Esto significa que una cookie marcada como HttpOnly
no podrá ser manipulada, leída ni modificada a través de document.cookie
o cualquier otra funcionalidad del entorno de scripting del navegador.
Ejemplo de cookie con el atributo HttpOnly
:
Set-Cookie: session_id=abc123; HttpOnly
En este ejemplo, se está configurando una cookie llamada session_id
con el valor abc123
y se añade el atributo HttpOnly
. Como resultado, esta cookie solo será accesible para el servidor en las solicitudes HTTP y no podrá ser leída desde el código JavaScript del navegador.
HttpOnly
?
El principal motivo para usar HttpOnly
es proteger la información sensible almacenada en las cookies contra ataques del tipo Cross-Site Scripting (XSS). En un ataque XSS, un atacante inyecta scripts maliciosos en una aplicación web con el objetivo de robar información del usuario, incluidas las cookies que contienen datos de autenticación o de sesión.
Si una cookie contiene información sensible como tokens de autenticación, identificadores de sesión u otra información crítica, y no está marcada como HttpOnly
, un atacante podría ejecutar un script en la misma página para capturarla y, posteriormente, usarla para suplantar la identidad del usuario legítimo.
HttpOnly
Al configurar HttpOnly
en una cookie, nos aseguramos de que su acceso esté limitado únicamente al entorno del servidor. Esto significa que la cookie solo se enviará en las cabeceras HTTP durante las solicitudes realizadas al servidor, y no se podrá modificar ni leer mediante JavaScript del lado del cliente.
Por lo tanto, este atributo se utiliza generalmente en cookies que almacenan información como:
session_id
).
auth_token
).
Ventajas del uso de HttpOnly
:
1. Prevención de robos de cookies mediante XSS: Si un atacante logra inyectar un script malicioso en el sitio web, no podrá acceder a las cookies marcadas como HttpOnly
.
2. Protección de información crítica: Las cookies HttpOnly
suelen usarse para proteger datos de sesión y de autenticación.
3. Fácil de implementar: Basta con añadir el atributo HttpOnly
al configurar la cookie en el servidor para obtener los beneficios de seguridad.
HttpOnly
Imaginemos un entorno en el que tenemos un servidor web que gestiona sesiones de usuario y, para este propósito, se genera una cookie con un identificador de sesión único para cada usuario autenticado. Así es como se vería el código para establecer una cookie con HttpOnly
en un entorno de Node.js utilizando Express:
app.get('/login', (req, res) => {
// Suponiendo que ya se ha autenticado el usuario
const sessionId = generateSessionId();
// Configurar la cookie con el atributo HttpOnly
res.cookie('session_id', sessionId, { httpOnly: true });
res.send('Usuario autenticado, cookie de sesión establecida');
});
En este ejemplo, la cookie session_id
se establece con el atributo httpOnly
configurado en true
. De esta manera, si un atacante intenta acceder a la cookie desde el navegador usando JavaScript, no podrá hacerlo.
HttpOnly
Aunque HttpOnly
mejora considerablemente la seguridad de las cookies, no es una solución infalible para todos los problemas de seguridad relacionados con cookies. Algunas de las limitaciones de HttpOnly
son:
1. No protege contra ataques de tipo Cross-Site Request Forgery (CSRF): Aunque la cookie no sea accesible desde JavaScript, un ataque CSRF podría seguir enviándola automáticamente con las solicitudes fraudulentas, ya que HttpOnly
no impide que el navegador envíe la cookie junto con las peticiones HTTP.
2. No evita el robo de cookies mediante tráfico no cifrado: Si la comunicación entre el navegador y el servidor no utiliza HTTPS, un atacante podría interceptar la cookie en tránsito, independientemente de si tiene el atributo HttpOnly
o no. Por ello, es recomendable usar HttpOnly
junto con el atributo Secure
, que asegura que la cookie solo se envíe a través de conexiones HTTPS.
Para maximizar la seguridad de las cookies, es recomendable combinar HttpOnly
con otros atributos, como:
Ejemplo completo de cookie con todos los atributos de seguridad:
Set-Cookie: session_id=abc123; HttpOnly; Secure; SameSite=Strict
En este caso, HttpOnly
protege la cookie de ser accedida desde JavaScript, Secure
evita que se envíe a través de HTTP sin cifrar, y SameSite=Strict
garantiza que la cookie no se enviará en solicitudes de terceros, aumentando aún más la seguridad.
Implementar HttpOnly
en las cookies es una práctica de seguridad fundamental para cualquier aplicación web moderna. Aunque no soluciona todos los problemas de seguridad relacionados con el uso de cookies, reduce significativamente el riesgo de exposición a ataques XSS y ayuda a proteger la información sensible. Al utilizar HttpOnly
en combinación con otros atributos como Secure
y SameSite
, podemos asegurar que nuestras cookies están protegidas ante varios vectores de ataque, manteniendo a salvo la información de los usuarios y mejorando la seguridad global de la aplicación.
Por tanto, si manejas datos de autenticación o información de sesión en cookies, es esencial que siempre marques las cookies relevantes con el atributo HttpOnly
.
Jorge García
Fullstack developer