JWTはWebアプリケーションで最も一般的な認証トークン形式です。ログインするたびに、APIはあなたのID、権限、そして多くの場合個人情報を含むJSON Web Tokenを発行します。何かが問題になった場合 — 期限切れのセッション、拒否されたリクエスト、チームメンバーが「このトークンの中身は?」と尋ねた場合 — 最初の直感はデコードすることです。
ほとんどのオンラインJWTデコーダーは機能します。問題は、トークンを信頼すべきかどうかです。
JWTの中に何があるのか
JWTはドットで区切られた3つのbase64urlエンコードされた文字列です:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NSIsIm5hbWUiOiJBbGljZSIsImlhdCI6MTUxNjIzOTAyMn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
最初の2部分をデコードするとJSONになります:
// Header
{
"alg": "HS256",
"typ": "JWT"
}
// Payload
{
"sub": "12345",
"name": "Alice",
"iat": 1516239022
}
署名は、トークンが秘密を知っている者によって発行されたことを証明する暗号ハッシュです。誰でもペイロードをデコードできます — それはセキュリティの境界ではありません。境界は署名を検証できるかどうかです。
デコード vs 検証
この違いは重要です:
- デコード = JSONをbase64デコードして読めるようにする。秘密は不要。誰でもできる。
- 検証 = 既知の秘密に対して署名を確認し、トークンが改ざんされていないことを確認する。秘密が必要。
ほとんどのオンラインデコーダーはデコードのみです。ヘッダーとペイロードを表示しますが、秘密を求めません — 検証ではなく、表示のみだからです。
デバッグ purposes(トークンにどのクレームがあるか、いつ期限切れになるか)では、デコードで十分です。認証の場合は検証が必要です — そしてそれはあなたが管理するインフラで行われなければなりません。
検証すべき標準JWTクレーム
JWTをデコードした場合、これらの登録クレームを確認してください:
| クレーム | 意味 | 確認すべきこと |
|---|---|---|
exp |
有効期限(Unixタイムスタンプ) | 未来になっているか? |
nbf |
有効開始(Unixタイムスタンプ) | 過去になっているか? |
iat |
発行時刻(Unixタイムスタンプ) | トークンはどれくらい古いか? |
iss |
発行者 | 認証サーバーと一致するか? |
aud |
オーディエンス | APIと一致するか? |
sub |
サブジェクト(ユーザーID) | 期待されるユーザーか? |
「有効な」トークンが失敗する最も一般的な理由:**期限切れ。**最初にexpを確認してください。
ブラウザでJWTをデコードする方法
これにサードパーティツールは不要です。JWTは3つのbase64url文字列にすぎません。でも、デコードコマンドを覚えるのが面倒な場合は、ブラウザベースのデコーダーがトークンをアップロードせずに同じことを行えます:
- デコーダーにJWTを貼り付ける
- デコードされたヘッダー、ペイロード、署名を確認
expクレームを確認してトークンが期限切れかどうかを確認- ヘッダーのアルゴリズムが期待どおりか確認
DevSpeedToolsのJWTデコーダーはブラウザ上で完動します。ネットワークリクエストも、アップロードも、ログもありません。DevTools → Networkを開き、トークンを貼り付けて、マシンから何も送信されないことを確認してください。
検証が必要な場合(デコードだけでなく)
認証問題をデバッグしていて、トークンが有効かどうかを知りたい場合 — 中身だけでなく — 署名を検証する必要があります。これは認証サーバーが使用する同じ秘密鍵または公開鍵で行われなければなりません。
秘密をWebサイトに貼り付ける必要がないオプション:
- Node.js:
jsonwebtoken.verify(token, process.env.JWT_SECRET) - Python:
jwt.decode(token, key, algorithms=['HS256']) - Go:
token, err := jwt.Parse(tokenString, keyFunc) - CLI:
jwt-cli(Rust)またはワンライナーのpyjwt
本番環境の秘密をオンラインツールに貼り付けるのはやめましょう。トークンは秘密ではありません。中身は often 秘密です。
まとめ
- **ブラウザベースのデコーダーで素早い検証。**アップロードなし、漏洩なし。
- **CLIまたは自分のコードで検証。**Webサイトに秘密を貼り付けるのはやめましょう。
- 最初に
expを確認 — 期限切れのトークンが「トークンが動かなくなった」という問題の原因の大半です。