Tokens JWT em Java: Guia Completo para Trabalhar com JSON Web Tokens

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Tokens JWT em Java: Guia Completo para Trabalhar com JSON Web Tokens

\n\n

JSON Web Token (JWT) é um padrão aberto (RFC 7519) que define uma forma compacta e autossuficiente de transmitir informações entre partes como um objeto JSON. Em Java, existem várias bibliotecas maduras para trabalhar com JWT, que permitem criar, assinar, verificar e decodificar tokens. Neste artigo, abordaremos detalhadamente três bibliotecas principais: JJWT, Auth0 java-jwt e Nimbus JOSE + JWT, além de analisar as melhores práticas de uso.

\n\n

O que é JWT e por que é necessário em Java?

\n\n

O JWT consiste em três partes separadas por pontos:

\n
    \n
  • Header — contém informações sobre o tipo de token e o algoritmo de assinatura (por exemplo, HS256 ou RS256).
  • \n
  • Payload — contém as declarações (claims): padrão (iss, sub, exp, iat) e dados personalizados.
  • \n
  • Signature — é criada através do hash do header + payload usando uma chave secreta ou par RSA/ECDSA.
  • \n
\n\n

Em Java, o JWT é mais frequentemente usado para:

\n
    \n
  • Autenticação e autorização em APIs REST (especialmente em conjunto com Spring Security).
  • \n
  • Transmissão de informações entre microsserviços.
  • \n
  • Implementação de Single Sign-On (SSO).
  • \n
\n\n

Biblioteca JJWT (io.jsonwebtoken)

\n\n

JJWT é uma das bibliotecas mais populares e bem documentadas para Java. Ela suporta todos os algoritmos modernos de assinatura e criptografia, além de fornecer uma API fluente conveniente.

\n\n

Instalação

\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

Criação de JWT com 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        // Geração de chave 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

Verificação e parsing 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..."; // seu token\n        SecretKey key = ...; // mesma chave usada para assinar\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