JWT: estrutura, criação e verificação
Decodifique manualmente a estrutura de JWT, crie tokens assinados com um segredo e verifique as declarações sem frameworks.
JWT: estrutura, criação e verificação é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
O que é um JWT?
JSON Web Token (JWT) é um formato compacto e seguro para URLs para transmitir declarações entre partes. Um JWT é assinado (e opcionalmente criptografado). Ele é autocontido — não é necessária uma consulta ao banco de dados para verificar as declarações.
Estrutura do JWT: cabeçalho, carga útil e assinatura
Um JWT possui três partes codificadas em Base64URL e separadas por pontos: header.payload.signature. O cabeçalho especifica o algoritmo. A carga útil contém as declarações. A assinatura verifica a integridade.
// Example JWT:
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 <- header
// .eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIn0 <- payload
// .SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c <- signatureCabeçalho e carga útil decodificados
Decodifique cada parte com Base64URL para visualizar o JSON. A carga útil contém as "declarações" — algumas padrão são: sub (assunto), iss (emissor), exp (expiração) e iat (emitido em).
// Header:
{ "alg": "HS256", "typ": "JWT" }
// Payload:
{ "sub": "user-42", "name": "Alice", "role": "ADMIN",
"iat": 1716000000, "exp": 1716003600 }Criando um JWT manualmente (HS256)
Construa o JSON do cabeçalho e da carga útil, codifique cada um em Base64URL, concatene-os com um ponto, calcule o HMAC-SHA256 de header.payload e acrescente o resultado como assinatura.
String header = Base64.getUrlEncoder().withoutPadding()
.encodeToString("{\"alg\":\"HS256\",\"typ\":\"JWT\"}".getBytes());
String payload = Base64.getUrlEncoder().withoutPadding()
.encodeToString("{\"sub\":\"user-42\",\"exp\":9999999999}".getBytes());
String sigInput = header + "." + payload;
byte[] sig = computeHmac(secretKey, sigInput);
String jwt = sigInput + "." + Base64.getUrlEncoder().withoutPadding().encodeToString(sig);Verificando um JWT manualmente
Divida pelos pontos, decodifique o cabeçalho e a carga útil, recalcule o HMAC sobre header.payload, compare-o com a assinatura e verifique se exp está no futuro.
String[] parts = jwt.split("\\.");
String sigInput = parts[0] + "." + parts[1];
byte[] expectedSig = computeHmac(secretKey, sigInput);
byte[] actualSig = Base64.getUrlDecoder().decode(parts[2]);
if (!MessageDigest.isEqual(expectedSig, actualSig)) throw new SecurityException("Invalid signature");
// Decode payload and check exp:
String payloadJson = new String(Base64.getUrlDecoder().decode(parts[1]));
// parse JSON and check exp > nowUtilizando a biblioteca java-jwt (Auth0)
A biblioteca com.auth0:java-jwt simplifica a criação e a verificação de JWTs com uma API fluente.
// Create:
Algorithm alg = Algorithm.HMAC256(secretKey);
String token = JWT.create()
.withSubject("user-42")
.withClaim("role", "ADMIN")
.withExpiresAt(Instant.now().plusSeconds(3600))
.sign(alg);
// Verify:
JWTVerifier verifier = JWT.require(alg).withIssuer("my-service").build();
DecodedJWT decoded = verifier.verify(token);
System.out.println(decoded.getSubject());HS256 versus RS256
HS256 utiliza uma chave simétrica compartilhada — é simples, mas tanto o emissor quanto o verificador precisam confiar um no outro quanto à chave. RS256 utiliza RSA: assine com a chave privada e verifique com a chave pública — é adequado para arquiteturas com vários serviços, nas quais qualquer serviço pode verificar sem conhecer a chave de assinatura.
Armazenando JWTs: cookies HttpOnly versus localStorage
Armazene JWTs em cookies HttpOnly (não acessíveis pelo JS — o que evita o roubo por XSS), com as sinalizações Secure e SameSite=Strict. Evite localStorage — ataques XSS podem lê-lo.
// Set JWT as HttpOnly cookie in Spring:
ResponseCookie cookie = ResponseCookie.from("jwt", token)
.httpOnly(true).secure(true).sameSite("Strict")
.path("/").maxAge(3600).build();
response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());Tokens de atualização
JWTs têm uma expiração curta (15 minutos). Tokens de atualização (opacos e armazenados no servidor) têm uma expiração mais longa. O cliente troca um token de atualização por um novo JWT sem precisar se autenticar novamente.
Desafio da revogação de JWTs
JWTs não mantêm estado — não há revogação integrada. Utilize uma expiração curta e uma lista de bloqueio com os IDs dos JWTs revogados (declaração jti) no Redis para permitir o logout antes da expiração.
// On logout, add the jti to a Redis blocklist with TTL = token expiry:
redis.set("revoked:" + jti, "1", ex, 3600);
// On verify, check blocklist:
if (redis.exists("revoked:" + decoded.getId())) throw new SecurityException("Token revoked");Integração de JWT com Spring Security
No Spring Security, implemente JwtAuthenticationFilter extends OncePerRequestFilter para extrair, verificar e definir o SecurityContext a partir do JWT em cada requisição.
String token = request.getHeader("Authorization").replace("Bearer ","");
DecodedJWT decoded = verifier.verify(token);
String userId = decoded.getSubject();
UsernamePasswordAuthenticationToken auth =
new UsernamePasswordAuthenticationToken(userId, null, authorities);
SecurityContextHolder.getContext().setAuthentication(auth);Verificação rápida
Qual é a principal diferença estrutural entre a assinatura de JWTs HS256 e RS256?
Recapitulação
JWT = cabeçalho.carga útil.assinatura (Base64URL). Assine com HMAC (HS256) ou RSA (RS256). Verifique a assinatura e a declaração exp. Armazene em cookies HttpOnly. Utilize uma expiração curta e tokens de atualização. Revogue por meio de uma lista de bloqueio de jti no Redis.
Perguntas Frequentes
A aula “JWT: estrutura, criação e verificação” é grátis?
Sim — o texto completo de “JWT: estrutura, criação e verificação” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “JWT: estrutura, criação e verificação”?
Decodifique manualmente a estrutura de JWT, crie tokens assinados com um segredo e verifique as declarações sem frameworks. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “JWT: estrutura, criação e verificação”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Hash criptográfico com MessageDigest
- Criptografia simétrica AES
- HMAC-SHA256 para integridade de mensagens
- JWT: estrutura, criação e verificação