0Pricing
Cryptology Academy · レッスン

JWTの構造:ヘッダー、ペイロード、署名

base64urlの各部分をデコードし、JWTの各フィールドを理解します。

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

JWTとは何ですか

JSON Web Token(JWT)は、RFC 7519で定義されたコンパクトでURLセーフなトークン形式です。クレーム(主体に関するアサーション)と暗号署名を1つの文字列にエンコードし、ステートレス認証を可能にします。

3部構成

JWTは、base64url(header).base64url(payload).base64url(signature)という形式です。ドットが各部分を区切ります。ヘッダーとペイロードは読み取り可能であり、暗号化されているのではなくbase64urlでエンコードされているだけです。暗号技術が使われるのは署名だけです。

ヘッダー

ヘッダーはJSONオブジェクトです:{"alg":"HS256","typ":"JWT"}。algは署名アルゴリズム(HS256、RS256、ES256、none)を指定します。typは常に"JWT"です。その他のヘッダーには、鍵の選択に使うkid(鍵ID)などがあります。

ペイロード/クレーム

標準登録クレームには、iss(発行者)、sub(主体)、aud(対象者)、exp(有効期限を表すUnixタイムスタンプ)、nbf(有効期間の開始時刻)、iat(発行時刻)、jti(失効確認に使うJWT ID)があります。カスタムクレームは、追加される任意のキーと値の組です。

JWTをデコードする

import base64, json token = "eyJ..." parts = token.split(".") header = json.loads(base64.urlsafe_b64decode(parts[0]+"==")) payload = json.loads(base64.urlsafe_b64decode(parts[1]+"==")) print(header, payload)

署名の検証

HS256の場合:HMAC-SHA256(base64url(header)+"."+base64url(payload), secret)。受信側はこれを再計算し、署名部分と比較します。値が一致し、トークンの有効期限が切れていなければ、トークンは有効です。

非対称署名

RS256の場合、秘密鍵でheader.payload文字列にRSA-SHA256を使って署名します。公開鍵を持つすべての当事者が、秘密鍵なしで検証できます。公開鍵はJWKS(JSON Web Key Set)エンドポイント(例:/.well-known/jwks.json)を通じて配布されます。

Base64urlエンコーディング

Base64urlでは、+を-に、/を_に置き換え、=によるパディングを省略します。これにより、パーセントエンコーディングなしでJWTをURL、HTTPヘッダー、Cookie内で安全に扱えます。元のバイト列は暗号化されておらず、エンコードされているだけです。

JWTはデフォルトでは暗号化されない

JWTのペイロードは、base64urlデコードできる人なら誰でも読めます。実際に暗号化するための"enc"アルゴリズムを使ったJWE(JSON Web Encryption)を使用しない限り、秘密情報(パスワードやSSN)をJWTのペイロードに決して入れないでください。

トークンの有効期間

expには短い期間(アクセストークンでは15~60分)を設定してください。JWTを長期間有効にするとリスクが蓄積し、盗まれた場合に有効期限まで使われ続けます。安全に保存したリフレッシュトークンを使って、新しい短期間のアクセストークンを発行してください。

JWKSの検出

認証プロバイダー(Auth0、Keycloak、Google)はJWKS URLを公開します。検証側はkidに基づいて公開鍵を取得してキャッシュし、リクエストごとに発行者へ接続することなく署名を検証します。鍵のローテーションによってJWKSエンドポイントが更新されます。

確認問題

JWTのどの部分に暗号署名が含まれていますか。

まとめ

JWTは、base64urlエンコードされた3つのJSON部分、つまりヘッダー(アルゴリズム)、ペイロード(クレーム)、署名で構成されます。ペイロードは読み取り可能であり、暗号化されていません。次は、HS256とRS256のどちらを選ぶかを学びます。

よくある質問

「JWTの構造:ヘッダー、ペイロード、署名」レッスンは無料ですか?

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

「JWTの構造:ヘッダー、ペイロード、署名」で何を学びますか?

base64urlの各部分をデコードし、JWTの各フィールドを理解します。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Cryptology Academyを始めるのに経験は必要ですか?

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

「JWTの構造:ヘッダー、ペイロード、署名」レッスンにはどのくらい時間がかかりますか?

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

このCryptology Academyレッスンでコードを書いて実行できますか?

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

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

  1. JWTの構造:ヘッダー、ペイロード、署名
  2. HS256とRS256:対称鍵JWTと非対称鍵JWT
  3. JWTの脆弱性:alg=noneと鍵の取り違え
  4. 安全なJWT実装のベストプラクティス
← Cryptology Academyに戻る