¿Qué es un JWT? Una explicación completa de los tokens web JSON
Respuesta rápida
Un JWT es una cadena con tres partes codificadas en Base64URL separadas por puntos: header.payload.signature. El encabezado especifica el algoritmo, la carga útil contiene afirmaciones (ID de usuario, roles, vencimiento) y la firma demuestra la autenticidad. Los JWT se utilizan para la autenticación sin estado. Utilice nuestro decodificador JWT gratuito para inspeccionar el contenido del token en su navegador.
Introducción
Un JWT (JSON Web Token) es un formato de token compacto y seguro URL definido por RFC 7519 para transmitir información de forma segura entre partes como un objeto JSON. Los JWT se utilizan ampliamente para la autenticación y autorización en aplicaciones web: después de que un usuario inicia sesión, el servidor emite un JWT que el cliente incluye en solicitudes posteriores para demostrar su identidad. Los JWT no tienen estado: el servidor no necesita buscar el token en una base de datos; el token en sí contiene las afirmaciones del usuario y una firma que demuestra que no fue manipulado.
Paso a paso
-
Comprender la estructura de tres partes.
Un JWT tiene tres partes: encabezado (algoritmo y tipo), carga útil (reclamaciones) y firma (demuestra integridad). Cada parte está codificada en Base64URL y separada por puntos: eyJhbGciOi...J9.eyJzdWIi...J9.signature. Las dos primeras partes son legibles por cualquier persona que tenga el token; sólo la firma requiere la clave secreta.
-
Conozca las afirmaciones estándar
La carga útil contiene afirmaciones: declaraciones sobre el tema. Reclamaciones estándar: 'sub' (sujeto/ID de usuario), 'iat' (emitido en la marca de tiempo), 'exp' (vencimiento), 'nbf' (no antes), 'iss' (emisor), 'aud' (audiencia). Los reclamos personalizados pueden incluir roles, permisos o cualquier otro dato.
-
Comprender los algoritmos de firma
Los JWT utilizan firma simétrica (HS256: secreto compartido) o asimétrica (RS256, ES256: par de claves pública/privada). La firma evita la manipulación: cambiar cualquier parte del token invalida la firma. Sólo el poseedor de la clave secreta/privada puede crear tokens válidos.
-
Utilice JWT para la autenticación
Después de iniciar sesión, el servidor crea un JWT y lo envía al cliente. El cliente incluye JWT en el encabezado de Autorización (token de portador) para solicitudes posteriores. El servidor verifica la firma y comprueba la caducidad, sin necesidad de realizar búsquedas en la base de datos.
Ejemplos
JWT estructura
Aporte: Un típico JWT
Producción: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMSIsImV4cCI6MTY5MzYxMjgwMH0.signature
Encabezado decodificado
Aporte: Primera parte decodificada
Producción: {"alg": "HS256", "typ": "JWT"}
Carga útil decodificada
Aporte: Segunda parte decodificada
Producción: {"sub": "user1", "name": "Alice", "iat": 1693526400, "exp": 1693612800}
Problemas comunes
- Decodificar versus verificar: decodificar un JWT (leer su contenido) NO prueba que sea auténtico. Verifique siempre la firma del lado del servidor con la clave secreta antes de confiar en las afirmaciones.
- Almacenar JWT en localStorage: esto los hace accesibles a JavaScript y vulnerables a ataques XSS. Almacene en httpOnly cookies para mayor seguridad.
- Tokens de larga duración: si se roba un token, sigue siendo válido hasta su vencimiento. Utilice tokens de acceso de corta duración (15 a 60 minutos) con tokens de actualización para sesiones largas.
- Datos confidenciales en la carga útil: cualquiera que tenga el token puede leer la carga útil (es Base64, no está cifrado). Nunca pongas contraseñas, tarjetas de crédito o secretos en la carga útil.
Consejos
- Verifique siempre la firma JWT del lado del servidor antes de confiar en cualquier afirmación; la decodificación por sí sola no es autenticación.
- Utilice tokens de acceso de corta duración (15 a 60 minutos) con tokens de actualización para sesiones largas para minimizar el daño causado por el robo de tokens.
- Almacene los JWT en cookies httpOnly, Secure, SameSite en lugar de localStorage para evitar ataques XSS.
- Utilice nuestro decodificador JWT para inspeccionar el contenido del token para su depuración; su token nunca sale de su navegador.