Tokens JWT en Java: Guía completa para trabajar con JSON Web Tokens

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Tokens JWT en Java: Guía completa para trabajar con JSON Web Tokens

\n\n

JSON Web Token (JWT) es un estándar abierto (RFC 7519) que define una forma compacta y autónoma de transmitir información entre partes como un objeto JSON. En Java existen varias bibliotecas maduras para trabajar con JWT que permiten crear, firmar, verificar y decodificar tokens. En este artículo analizaremos en detalle tres bibliotecas principales: JJWT, Auth0 java-jwt y Nimbus JOSE + JWT, así como las mejores prácticas para su uso.

\n\n

¿Qué es JWT y para qué sirve en Java?

\n\n

JWT consta de tres partes separadas por puntos:

\n
    \n
  • Header — contiene información sobre el tipo de token y el algoritmo de firma (por ejemplo, HS256 o RS256).
  • \n
  • Payload — contiene las declaraciones (claims): estándar (iss, sub, exp, iat) y datos personalizados.
  • \n
  • Signature — se crea mediante el hash de header + payload usando una clave secreta o un par RSA/ECDSA.
  • \n
\n\n

En Java, JWT se utiliza principalmente para:

\n
    \n
  • Autenticación y autorización en APIs REST (especialmente en combinación con Spring Security).
  • \n
  • Transmisión de información entre microservicios.
  • \n
  • Implementación de inicio de sesión único (SSO).
  • \n
\n\n

Biblioteca JJWT (io.jsonwebtoken)

\n\n

JJWT es una de las bibliotecas más populares y mejor documentadas para Java. Soporta todos los algoritmos de firma y cifrado modernos, y proporciona una API fluida y conveniente.

\n\n

Instalación

\n
<dependency>\n    <groupId>io.jsonwebtoken</groupId>\n    <artifactId>jjwt-api</artifactId>\n    <version>0.12.6</version>\n</dependency>\n<dependency>\n    <groupId>io.jsonwebtoken</groupId>\n    <artifactId>jjwt-impl</artifactId>\n    <version>0.12.6</version>\n    <scope>runtime</scope>\n</dependency>\n<dependency>\n    <groupId>io.jsonwebtoken</groupId>\n    <artifactId>jjwt-jackson</artifactId>\n    <version>0.12.6</version>\n    <scope>runtime</scope>\n</dependency>
\n\n

Creación de JWT con JJWT

\n
import io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.SignatureAlgorithm;\nimport io.jsonwebtoken.security.Keys;\nimport javax.crypto.SecretKey;\nimport java.util.Date;\n\npublic class JwtExample {\n    public static void main(String[] args) {\n        // Generación de clave segura para HS256\n        SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);\n\n        String jwt = Jwts.builder()\n                .subject("user123")\n                .issuer("https://pythonlib.ru")\n                .issuedAt(new Date())\n                .expiration(new Date(System.currentTimeMillis() + 3600000)) // 1 hora\n                .claim("role", "ADMIN")\n                .signWith(key)\n                .compact();\n\n        System.out.println("JWT: " + jwt);\n    }\n}
\n\n

Verificación y análisis de JWT

\n
import io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.Jws;\nimport io.jsonwebtoken.Jwts;\n\npublic class JwtParser {\n    public static void main(String[] args) {\n        String jwt = "eyJhbGciOiJIUzI1NiJ9..."; // tu token\n        SecretKey key = ...; // la misma clave que se usó para firmar\n\n        try {\n            Jws<Claims> claimsJws = Jwts.parser()\n                    .verifyWith(key)\n                    .build()\n                    .parseSignedClaims(jwt);\n            \n            Claims claims = claimsJws.getPayload();\n            String subject = claims.getSubject();\n            String role = claims.get("role", String.class);\n            \n            System.out.println("Subject: " + subject);\n            System.out.println("Role: " + role);\n        } catch (Exception e)                    

Recommendations