JSON Web Token(JWT)の内容、ペイロードを読むためのデコード方法、ライブラリなしでの構造検証を学びましょう。
JWTとは?
JSON Web Token(JWT)は、コンパクトかつURL安全な形式でクレーム(情報の主張)を伝える仕組みで、RFC 7519で標準化され、現代のAPI認証やSSO(シングルサインオン)の定番となっています。JWTは1本の文字列の中に小さなJSONと暗号署名を収めた形で、受け取った側は誰でも中身を読めますが、有効なトークンを発行できるのは署名鍵を持つサーバーだけです。この性質によりサーバーはセッションを保持する必要がなくなり、ユーザーID・権限・有効期限といった情報をトークン自体が運ぶ「ステートレス認証」が実現します。
よく使われる場面
API認証
ユーザーが一度ログインするとJWTが発行され、以降のリクエストではAuthorization: Bearer ヘッダでトークンを送ります。APIは署名を検証するだけで身元と権限を信頼でき、DBアクセスが不要になります。
シングルサインオン(SSO)
OpenID Connectの基盤はJWTです。IDプロバイダが発行するIDトークンを、下流アプリは公開されているJWKSエンドポイントで検証することで、ログイン状態を共有できます。
短期の一回限りのアクセス権
パスワードリセット、メール確認、署名付きダウンロードURLなど、一度使って終わる用途に最適です。expクレームに有効期限を入れておけば自動的に失効します。
ステップガイド
JWT構造を理解する
JWTはドットで区切られた3つのBase64URLエンコード部分で構成されます:ヘッダー.ペイロード.署名。ヘッダーはアルゴリズムを指定し、ペイロードはクレーム(データ)を含み、署名は整合性を検証します。
ヘッダーをデコードする
最初のドットの前の部分を取り、Base64URLデコードします。{"alg":"HS256","typ":"JWT"}のようなJSONオブジェクトが得られます。これが使用されている署名アルゴリズムを示します。
ペイロードをデコードする
2番目の部分をBase64URLデコードします。sub(サブジェクト/ユーザーID)、exp(有効期限UnixタイムスタンプP)、iat(発行時刻)、iss(発行者)などのクレームが見えます。
有効期限を確認する
expクレームはUnixタイムスタンプです。現在時刻と比較してトークンがまだ有効かどうか確認します。例:exp: 1700000000 = 2023年11月14日 22:13 UTC。
JWTデコーダーツールを使う
JWTをJWTデコーダーツールに貼り付けると、デコードされたヘッダー・ペイロード・署名をフォーマットされたJSONで即座に表示します。サーバー不要、ブラウザ内で完結します。
無料ツールを使う
JWT デコーダー
よくある質問
Q: ブラウザでJWTをデコードするのは安全ですか?
A: はい——デコード(ペイロードを読む)は安全です。JWTはBase64URLエンコードであり、暗号化ではありません。トークンはアクセス権を付与するため、信頼できない第三者のサイトには共有しないでください。
Q: 秘密鍵なしでJWT署名を検証できますか?
A: できません。署名検証にはHMACの場合は秘密鍵、RSA/ECDSAの場合は公開鍵が必要です。デコーダーは構造を表示しますが、鍵なしでは署名を検証できません。
Q: 「JWTの有効期限が切れた」とはどういう意味ですか?
A: expタイムスタンプが過去になっていることを意味します。サーバーは期限切れトークンを拒否します。新しいトークンを取得するには再認証が必要です。