Tokens JWT en Java: Guía completa para trabajar con JSON Web Tokens
\n\nJSON 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\nJWT 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
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
Biblioteca JJWT (io.jsonwebtoken)
\n\nJJWT 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\nInstalació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\nCreación de JWT con JJWT
\nimport 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\nVerificación y análisis de JWT
\nimport 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)