¿Te has preguntado cómo las aplicaciones modernas gestionan la autenticación y autorización de usuarios de manera segura? En este blog, exploraremos en profundidad los JSON Web Tokens (JWT), una tecnología clave para la gestión de identidades en aplicaciones web y móviles. Aprenderás qué son los JWT, cómo se estructuran, los algoritmos de firma más comunes, y las mejores prácticas para asegurar su implementación.
Un JSON Web Token (JWT) es un estándar abierto (RFC 7519) que define un método compacto y seguro para transmitir información entre dos partes en formato JSON.
Este token se usa principalmente en autenticación y autorización, permitiendo que un servidor valide la identidad de un usuario sin necesidad de almacenar sesiones en el backend.
Algunos casos de uso comunes incluyen:
Existen otros métodos de autenticación, como las cookies de sesiones y OAuth, pero cada una tiene sus propias características y limitaciones. A continuación te presento algunas diferencias:
Un JWT consta de tres partes separadas por puntos (.
): el encabezado, la carga útil y la firma. A continuación, se muestra un ejemplo de un JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
El token se divide de la siguiente manera:
1. Encabezado (Header): contiene el tipo de token y el algoritmo de firma utilizado. Por ejemplo:
{
"alg": "HS256",
"typ": "JWT"
}
2. Carga útil (Payload): contiene la información que se desea transmitir. Por ejemplo:
{
"userId": "123456",
"role": "admin",
"iat": 1674636000,
"exp": 1674640000
}
3. Firma (Signature): asegura la autenticidad del token mediante un algoritmo de firma. Por ejemplo:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
Los JWT pueden firmarse con algoritmos simétricos (HMAC - Hash-based Message Authentication Code) o asimétricos (RSA - Rivest-Shamir-Adleman y ECDSA - Elliptic Curve Digital Signature Algorithm).
El algoritmo HMAC utiliza una clave secreta compartida entre el emisor y el receptor para firmar y verificar el token. Los tres tipos más comunes de HMAC son:
El algoritmo RSA utiliza un par de claves (pública y privada) para firmar y verificar el token. Los tres tipos más comunes de RSA son:
El algoritmo ECDSA es similar al RSA, pero utiliza curvas elípticas en lugar de números enteros para firmar y verificar el token. Los tres tipos más comunes de ECDSA son:
Se recomienda evitar el uso de algoritmos más débiles como HS512 y HS384 a menos que sea absolutamente necesario.
Se recomienda incluir una fecha de expiración (exp
) y otros claims como ìat
(fecha de emisión) y nbf
(fecha de inicio de validez) para limitar la vida útil del token y prevenir ataques de replay.
{
"exp": 1674640000, // Fecha de expiración
"iat": 1674636000, // Fecha de emisión
"nbf": 1674636000 // Fecha de inicio de validez
}
Existen varias formas de almacenar un JSON Web Token (JWT), cada una con ventajas y desventajas. La elección depende del nivel de seguridad requerido en la aplicación. Algunas opciones comunes son:}
HttpOnly
: Impide el acceso desde JavaScript, protegiéndolas contra XSSSecure
: Garantiza que solo se envíen a través de conexiones HTTPSSameSite
: Limita el envío de cookies a solicitudes del mismo sitio para prevenir ataques CSRF. Puedes configurarlo según tus necesidades:
SameSite=Strict
: si requieres máxima seguridad pero puede afectar la usabilidadSameSite=Lax
: si necesitas un equilibrio entre seguridad y usabilidadSameSite=None
a menos que sea estrictamente necesario, ya que puede exponer las cookies a ataques CSRFRotación de tokens: consiste en invalidar el refresh token anterior y emitir uno nuevo cada vez que se usa para obtener un nuevo access token. Esto reduce el riesgo de reutilización de tokens comprometidos y mejora la seguridad.
Refresh Tokens: son credenciales de largo plazo utilizadas para obtener nuevos access tokens sin que el usuario deba ingresar credenciales nuevamente. Se recomienda usarlos en combinación con tokens de acceso de corta duración para minimizar el impacto de un robo. Para mejorar la seguridad, deben almacenarse de manera segura y rotarse periódicamente para evitar ataques de reutilización.
{
"accessToken": "JWT_de_corto_plazo",
"refreshToken": "JWT_de_largo_plazo"
}
JSON Web Tokens (JWT) son una solución eficiente para autenticación y autorización, pero deben usarse con precaución. Implementar buenas prácticas de seguridad como expiración, almacenamiento seguro y algoritmos de firma adecuados puede proteger tu aplicación contra ataques.
¡No te pierdas mi próximo blog, haremos una práctica de implementación de JWT en una aplicación web! 🚀