0Pricing
Java Academy · Aula

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     <- signature

Cabeç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 > now

Utilizando 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

  1. Hash criptográfico com MessageDigest
  2. Criptografia simétrica AES
  3. HMAC-SHA256 para integridade de mensagens
  4. JWT: estrutura, criação e verificação
← Voltar para Java Academy