Spring Security 6 & JWT Authentication · レッスン

JWTの署名と検証

JWT署名の暗号学的な原理と、トークンの完全性・真正性を検証する方法を学びます。

レッスン 3/411 ステップ

「JWTの署名と検証」はCoddyKit上の無料Spring Security 6 & JWT Authenticationレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSpring Security 6 & JWT Authentication学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Spring Security 6 & JWT Authenticationコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

What is JWT Signing?

JSON Web Tokens (JWTs) are powerful, but how do we trust them? Signing is the answer! It's a cryptographic process that ensures a token hasn't been tampered with and comes from a trusted source.

  • Integrity: Confirms the token's content hasn't been changed since it was issued.
  • Authenticity: Verifies the token was issued by the expected sender.

Without a signature, anyone could create or alter a JWT!

Keys to Security: The Secret

For symmetric signing algorithms like HMAC (e.g., HS256), a single secret key is used. This key is known only to the issuer and the intended verifier(s).

  • The secret key is a string of bytes, crucial for both signing and verifying.
  • It must be kept highly confidential.
  • If the secret key is compromised, your JWTs are no longer secure!

Algorithms: HS256 & RS256

JWTs use cryptographic algorithms to create the signature. The algorithm type is specified in the token's header.

  • HS256 (HMAC SHA-256): A symmetric algorithm. Uses a single secret key for both signing and verification. Simpler to implement.
  • RS256 (RSA SHA-256): An asymmetric algorithm. Uses a private key for signing and a public key for verification. More complex but better for distributed systems.

We'll focus on HS256 for our examples due to its simplicity.

Building the Signature (HS256)

The signature is created by combining the Base64Url encoded header, the Base64Url encoded payload, and your secret key using the chosen algorithm.

  1. Take the Base64Url encoded header.
  2. Take the Base64Url encoded payload.
  3. Concatenate them with a dot: encodedHeader + "." + encodedPayload.
  4. Hash this combined string using HMAC SHA-256 with your secret key.
  5. Base64Url encode the resulting hash to get the final signature.

Result: encodedHeader.encodedPayload.signature

Code: Generating HS256 Signature

Here's a Java example to generate an HS256 signature for a JWT. Notice how the secret key is essential for the hashing process.

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class JwtSigner {
    public static void main(String[] args) throws Exception {
        String encodedHeader = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"; // {"alg":"HS256","typ":"JWT"}
        String encodedPayload = "eyJpZCI6MSwicm9sZSI6InVzZXIifQ";     // {"id":1,"role":"user"}
        String secret = "coddykit-secret-lesson-key-1234567890";

        String dataToSign = encodedHeader + "." + encodedPayload;

        Mac hmacSha256 = Mac.getInstance("HmacSHA256");
        SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256");
        hmacSha256.init(secretKey);

        byte[] signatureBytes = hmacSha256.doFinal(dataToSign.getBytes("UTF-8"));
        String encodedSignature = Base64.getUrlEncoder().withoutPadding().encodeToString(signatureBytes);

        System.out.println("Data to Sign: " + dataToSign);
        System.out.println("Generated Signature: " + encodedSignature);
        System.out.println("Full JWT: " + dataToSign + "." + encodedSignature);
    }
}

Verifying a JWT's Signature

Verification is the reverse process of signing. When you receive a JWT, you need to ensure its signature is valid.

  1. Separate the received JWT into its three parts: header, payload, and signature.
  2. Reconstruct the "data to sign" string: encodedHeader + "." + encodedPayload.
  3. Using the same secret key and algorithm, calculate a new signature from this data.
  4. Compare your newly calculated signature with the signature provided in the JWT.

If they match, the token is valid and untampered! If not, it's invalid.

Secure Key Management

The security of your JWTs critically depends on how well you manage your signing keys. A compromised key invalidates all your security efforts!

  • Confidentiality: Keep secret keys private. Never hardcode them in client-side code.
  • Rotation: Regularly change your keys to limit the impact of a potential compromise.
  • Strength: Use strong, random, and sufficiently long keys.
  • Store keys in secure environments, like environment variables or dedicated key management services.

Code: Verifying HS256 Signature

This example demonstrates how to verify a JWT's signature. We use the same secret key to recalculate the signature and compare it against the one in the token.

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class JwtVerifier {
    public static void main(String[] args) throws Exception {
        String jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6InVzZXIifQ.qS6pQ_6_q-P_5_o-O_6_n-N_7_m-M_8_l-L_9_k-K_0_j-J_1_i-I_2_h-H_3_g-G_4_f-F_5_e-E_6_d-D_7_c-C_8_b-B_9_a-A"; 
        String secret = "coddykit-secret-lesson-key-1234567890";

        String[] parts = jwt.split("\\.");
        String encodedHeader = parts[0];
        String encodedPayload = parts[1];
        String receivedSignature = parts[2];

        String dataToSign = encodedHeader + "." + encodedPayload;

        Mac hmacSha256 = Mac.getInstance("HmacSHA256");
        SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256");
        hmacSha256.init(secretKey);

        byte[] calculatedSignatureBytes = hmacSha256.doFinal(dataToSign.getBytes("UTF-8"));
        String calculatedSignature = Base64.getUrlEncoder().withoutPadding().encodeToString(calculatedSignatureBytes);

        if (calculatedSignature.equals(receivedSignature)) {
            System.out.println("Signature is VALID!");
        } else {
            System.out.println("Signature is INVALID!");
            System.out.println("Received: " + receivedSignature);
            System.out.println("Calculated: " + calculatedSignature);
        }
    }
}

Symmetric vs. Asymmetric Signing

While HS256 (HMAC SHA-256) uses a shared secret, RS256 (RSA SHA-256) and ES256 (ECDSA SHA-256) use key pairs.

  • Symmetric (e.g., HS256): Same key for signing and verifying. Best for single-service applications or when the verifier is also the issuer.
  • Asymmetric (e.g., RS256, ES256): Private key for signing, public key for verifying. Ideal for distributed systems where multiple services need to verify tokens issued by a central authority. The public key can be shared widely without compromising security.

Quick Check: JWT Security

You've learned about JWT signing and verification. Let's test your understanding.

Recap: Secure JWTs

Great job! We've demystified how JWTs are secured through signing and verification.

  • Signing ensures a JWT's integrity and authenticity using a cryptographic algorithm and a secret key.
  • HS256 (HMAC SHA-256) is a symmetric algorithm using a single shared secret.
  • Verification involves recalculating the signature and comparing it to the received one.
  • Secure key management is paramount for JWT security.
  • Asymmetric algorithms like RS256 use key pairs for distributed verification.

Next up, we'll see how to integrate JWTs with Spring Security!

無料で開始

AI チューターと学ぶ Java — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
12
レッスン
48

よくある質問

「JWTの署名と検証」レッスンは無料ですか?

はい。「JWTの署名と検証」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Spring Security 6 & JWT Authenticationコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Spring Security 6 & JWT Authenticationコースには全4レッスンが含まれています。

「JWTの署名と検証」で何を学びますか?

JWT署名の暗号学的な原理と、トークンの完全性・真正性を検証する方法を学びます。 ブラウザで直接実行するハンズオンコードでSpring Security 6 & JWT Authenticationを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Spring Security 6 & JWT Authenticationを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSpring Security 6 & JWT Authenticationは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「JWTの署名と検証」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSpring Security 6 & JWT Authenticationレッスンでコードを書いて実行できますか?

はい。すべてのSpring Security 6 & JWT Authenticationレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. JSON Web Tokenの理解
  2. JWTの構造とクレーム
  3. JWTの署名と検証
  4. JWTの有効期限と検証ルール
← Spring Security 6 & JWT Authenticationに戻る