Tokens JWT em Java: criação, verificação e uso
JSON Web Token (JWT) é uma forma compacta e autossuficiente de transmitir informações entre partes na forma de um objeto JSON. Em Java, o JWT é amplamente utilizado para autenticação, autorização e troca de dados em APIs REST e arquitetura de microsserviços. Neste artigo, abordaremos as duas bibliotecas mais populares para trabalhar com JWT em Java — JJWT (Java JWT) da Stormpath e java-jwt da Auth0, além de vermos a integração com Spring Security.
O que é JWT e por que ele é necessário?
O JWT é composto por três partes, separadas por pontos:
- Header — cabeçalho contendo o tipo do token e o algoritmo de assinatura (ex.: HS256 ou RS256).
- Payload — carga útil com as declarações (claims), como identificador do usuário, papéis, prazo de validade.
- Signature — assinatura criada com base no header, payload e chave secreta.
Em Java, o JWT é mais frequentemente usado para:
- Autenticação de usuários sem armazenar sessões no servidor (stateless).
- Transmissão de permissões de acesso entre microsserviços.
- Tokens de uso único para redefinição de senha ou confirmação de email.
Biblioteca JJWT (io.jsonwebtoken)
JJWT é a biblioteca mais popular para trabalhar com JWT em Java. Ela é simples de usar, suporta todos os algoritmos padrão (HS256, RS256, ES256) e é ativamente atualizada.
Adicionando JJWT via Maven
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.12.6</version></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.12.6</version> <scope>runtime</scope></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.12.6</version> <scope>runtime</scope></dependency>Criação de um token JWT
import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import io.jsonwebtoken.security.Keys;import javax.crypto.SecretKey;import java.util.Date;
public class JwtExample { public static void main(String[] args) { // Geração de uma chave secreta segura para HS256 SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
String token = Jwts.builder() .subject("user123") .claim("role", "admin") .issuedAt(new Date()) .expiration(new Date(System.currentTimeMillis() + 3600000)) // 1 hora .signWith(key) .compact();
System.out.println("JWT criado: " + token); }}Verificação e análise de JWT
import io.jsonwebtoken.Claims;import io.jsonwebtoken.Jws;import io.jsonwebtoken.JwtException;import io.jsonwebtoken.Jwts;
public class JwtParserExample { public static void main(String[] args) { String jwtToken = "eyJhbGciOiJIUzI1NiJ9..."; // seu token SecretKey key = ...; // a mesma chave usada na criação
try { Jws<Claims> claimsJws = Jwts.parser() .verifyWith(key) .build() .parseSignedClaims(jwtToken);
Claims claims = claimsJws.getPayload(); System.out.println("Subject: " + claims.getSubject()); System.out.println("Role: " + claims.get("role")); System.out.println("Expiration: " + claims.getExpiration()); } catch (JwtException e) { System.out.println("Token inválido: " + e.getMessage()); } Também na biblioteca
Geolocalização e mapas em Go: visão geral de bibliotecas e exemplos de código
Testes em JavaScript (Node.js): frameworks e ferramentas
openapi-typescript para TypeScript: guia completo com exemplos