ホーム / JWTの中身の読み方

JWTとは何か ― 中身の読み方と、扱うときの注意

「読める」ことと「信用してよい」ことは別だ、という点がすべてです。

読めることと、信じてよいことは別

JWT(JSON Web Token)は、認証情報を1本の文字列にまとめて受け渡すための形式です。暗号化されていません。誰でもデコードして中身を読めます。

だから重要なのは2点です。第一に、秘密にしたい情報をJWTに入れてはいけません。第二に、受け取ったJWTは署名を検証してから信用する必要があります。

読めることと、改ざんされていないことは別の話です。

3つのパートでできている

JWTは xxxxx.yyyyy.zzzzz のように、ピリオドで区切られた3つの部分からできています。

部分名前中身
1つ目ヘッダー署名アルゴリズム(alg)とトークンの種類(typ)
2つ目ペイロードユーザーIDや有効期限などの情報(クレーム)
3つ目署名ヘッダーとペイロードが改ざんされていないことを示す値

1つ目と2つ目はBase64URLでエンコードされているだけです。暗号化ではないので、デコードすれば誰でも読めます。Base64を手動で戻しても読めますし、JWTデコードを使えば3つを一度に展開できます。

よく使われるクレーム

ペイロードに入る項目をクレームと呼びます。標準的に決まっているものがいくつかあります。

デバッグでいちばんよく見るのは exp です。「ログインできない」の原因が単なる期限切れだった、というのはよくあります。まず期限を確認する癖をつけると、調査が速くなります。

デコードと検証は別の作業

ここが最も誤解されやすい点です。

デコードしただけのペイロードを信用して処理を進めると、誰でも中身を書き換えたトークンを作れてしまいます。「管理者フラグを true にしたペイロードを自分で作って送る」といった攻撃が成立します。

サーバー側では必ず署名を検証してから中身を使ってください。

逆に、ブラウザ側で有効期限を見て画面表示を切り替える、といった用途ならデコードだけでも構いません。セキュリティ上の判断に使うかどうかが境目です。

つまずきやすい点

セッションとJWT、どちらを使うか

ログイン状態の保持には、大きく2つの方式があります。JWTを使う方式と、サーバー側にセッションを持つ方式です。どちらが優れているということはなく、性質が違います。

JWTサーバーセッション
状態の置き場所トークンの中(クライアント側)サーバー側
サーバーを増やしたときそのまま動く共有の仕組みが要る
即時失効難しい容易
情報を変えたとき再発行するまで古いまますぐ反映される

サーバーを複数台に分散する構成ではJWTが扱いやすく、ログアウトや権限変更を即座に反映したい要件が強い場合はセッションのほうが素直です。

要件から選ぶのであって、新しいほうが良いという話ではありません。

実務では両者を組み合わせる形もよく使われます。短命なJWTを発行し、それを更新するための別のトークンをサーバー側で管理する構成です。この形なら、分散のしやすさと失効のしやすさをある程度両立できます。

デバッグの進め方

  1. まずデコードして中身を見る:exp が切れていないか、sub や aud が想定どおりかを確認します。ここで9割の問題は切り分けられます。
  2. ヘッダーの alg を確認する:サーバーが期待しているアルゴリズムと一致しているかを見ます。
  3. 時刻のずれを疑う:サーバーの時計がずれていると、有効なトークンが期限切れと判定されます。Unix時間変換で exp を日時に直し、現在時刻と比べてください。
  4. 署名の検証は本番の鍵で行う:手元のツールで中身が読めても、署名が正しいかは別問題です。検証は鍵を持っている環境で行います。

中身を確かめるなら

こでっとのJWTデコードは、トークンを貼り付けるとヘッダーとペイロードを整形して表示します。すべてブラウザ内で処理され、貼り付けたトークンが外部に送信されることはありません。本番のトークンを扱う場面では、この点が重要になります。

有効期限を日時に直すならUnix時間変換。Base64そのものを個別に扱いたい場合は、同じ かわたれ studio のBase64変換が使えます。

よくある質問

JWTは暗号化されていますか?

いいえ、暗号化されていません。ヘッダーとペイロードはBase64URLでエンコードされているだけなので、誰でもデコードして読めます。署名は改ざんを検知するためのもので、中身を隠すものではありません。秘密にしたい情報をJWTに入れないでください。

デコードと検証は何が違いますか?

デコードは中身を読むだけの作業で、鍵は不要です。検証は署名を使って改ざんされていないことを確かめる作業で、鍵が必要です。サーバー側でセキュリティ上の判断に使う場合は、必ず検証してから中身を使ってください。デコードした値をそのまま信用すると、偽造されたトークンを受け入れてしまいます。

ログインできない原因の調べ方は?

まずトークンをデコードして exp(有効期限)を確認してください。単なる期限切れであることが多くあります。次に aud や iss が想定どおりか、ヘッダーの alg がサーバーの期待と一致しているかを見ます。サーバーの時計がずれていて期限切れと判定されるケースもあります。

JWTを貼り付けても大丈夫ですか?

こでっとのJWTデコードはすべてブラウザ内で処理し、入力したトークンを外部に送信しません。ただし一般論として、本番環境の有効なトークンをオンラインのツールに貼り付けるのは避けるべきです。処理がどこで行われるかを確認してから使ってください。

関連ツール

ツール一覧を見る