0Pricing
Java Academy · Lektion

JWT: Struktur, Erstellung und Überprüfung

Dekodieren Sie die JWT-Struktur manuell, erstellen Sie signierte Tokens mit einem Secret und überprüfen Sie Claims ohne Frameworks.

JWT: Struktur, Erstellung und Überprüfung ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist ein JWT?

JSON Web Token (JWT) ist ein kompaktes, URL-sicheres Tokenformat zur Übertragung von Claims zwischen Parteien. Ein JWT wird signiert (und optional verschlüsselt). Es ist in sich geschlossen – zur Überprüfung der Claims ist keine Datenbankabfrage erforderlich.

JWT-Struktur: Header.Payload.Signature

Ein JWT besteht aus drei durch Punkte getrennten, Base64URL-kodierten Teilen: header.payload.signature. Der Header legt den Algorithmus fest. Der Payload enthält Claims. Die Signatur überprüft die Integrität.

// Example JWT:
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9      <- header
// .eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIn0  <- payload
// .SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c     <- signature

Header und Payload dekodieren

Dekodieren Sie jeden Teil mit Base64URL, um das JSON anzuzeigen. Der Payload enthält Claims – zu den standardmäßigen gehören: sub (Subject), iss (Aussteller), exp (Ablaufzeitpunkt), iat (Ausstellungszeitpunkt).

// Header:
{ "alg": "HS256", "typ": "JWT" }
// Payload:
{ "sub": "user-42", "name": "Alice", "role": "ADMIN",
  "iat": 1716000000, "exp": 1716003600 }

JWT manuell erstellen (HS256)

Erstellen Sie Header- und Payload-JSON, kodieren Sie beide mit Base64URL, verketten Sie sie mit einem Punkt und berechnen Sie anschließend den HMAC-SHA256 von header.payload; hängen Sie ihn als Signatur an.

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);

JWT manuell überprüfen

Teilen Sie den Token an den Punkten auf, dekodieren Sie Header und Payload, berechnen Sie den HMAC über header.payload erneut, vergleichen Sie ihn mit der Signatur und prüfen Sie, dass exp in der Zukunft liegt.

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

java-jwt-Bibliothek (Auth0) verwenden

Die Bibliothek com.auth0:java-jwt vereinfacht die Erstellung und Überprüfung von JWTs mithilfe einer Fluent API.

// 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 vs. RS256

HS256 verwendet einen gemeinsamen symmetrischen Schlüssel – einfach, aber sowohl der Aussteller als auch der Prüfer müssen einander den Schlüssel anvertrauen. RS256 verwendet RSA: Signieren mit dem privaten Schlüssel, Überprüfen mit dem öffentlichen Schlüssel – geeignet für Multi-Service-Architekturen, in denen jeder Dienst die Signatur überprüfen kann, ohne den Signaturschlüssel zu kennen.

JWTs speichern: HttpOnly-Cookies vs. localStorage

Speichern Sie JWTs in HttpOnly-Cookies (für JS nicht zugänglich – verhindert den Diebstahl durch XSS) mit den Flags Secure und SameSite=Strict. Vermeiden Sie localStorage – XSS-Angriffe können darauf zugreifen.

// 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());

Refresh-Tokens

JWTs haben eine kurze Gültigkeitsdauer (15 Min.). Refresh-Tokens (opak, serverseitig gespeichert) haben eine längere Gültigkeitsdauer. Der Client tauscht einen Refresh-Token gegen ein neues JWT aus, ohne sich erneut zu authentifizieren.

Herausforderung beim Widerruf von JWTs

JWTs sind zustandslos – es gibt keine integrierte Möglichkeit zum Widerruf. Verwenden Sie eine kurze Gültigkeitsdauer und eine Sperrliste widerrufener JWT-IDs (Claim jti) in Redis, um eine Abmeldung vor Ablauf zu ermöglichen.

// 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");

Spring-Security-JWT-Integration

Implementieren Sie in Spring Security JwtAuthenticationFilter extends OncePerRequestFilter, um bei jeder Anfrage das JWT zu extrahieren, zu überprüfen und daraus den SecurityContext zu setzen.

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);

Kurzer Test

Was ist der wesentliche strukturelle Unterschied zwischen der JWT-Signierung mit HS256 und RS256?

Zusammenfassung

JWT = header.payload.signature (Base64URL). Signieren Sie mit HMAC (HS256) oder RSA (RS256). Überprüfen Sie die Signatur und den Claim exp. Speichern Sie JWTs in HttpOnly-Cookies. Verwenden Sie eine kurze Gültigkeitsdauer und Refresh-Tokens. Widerrufen Sie JWTs mithilfe einer jti-Sperrliste in Redis.

Häufig gestellte Fragen

Ist die Lektion „JWT: Struktur, Erstellung und Überprüfung“ kostenlos?

Ja — der vollständige Text von „JWT: Struktur, Erstellung und Überprüfung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „JWT: Struktur, Erstellung und Überprüfung“?

Dekodieren Sie die JWT-Struktur manuell, erstellen Sie signierte Tokens mit einem Secret und überprüfen Sie Claims ohne Frameworks. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „JWT: Struktur, Erstellung und Überprüfung“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Kryptografisches Hashing mit MessageDigest
  2. Symmetrische AES-Verschlüsselung
  3. HMAC-SHA256 für Nachrichtenintegrität
  4. JWT: Struktur, Erstellung und Überprüfung
← Zurück zu Java Academy