JWT 入門:デコードと検証の違いを 5 分で理解
・対象: 初学者,Web エンジニア・タグ: tool:jwt-decoder, jwt, security, authentication
「API のログインで JWT トークンって出てきたけど、これって何?」「デコードって聞くけど、暗号化されてるの?」――初めて JWT に触れるとき、誰もが感じる疑問です。
この記事では、JWT の基本構造・デコードと検証の違い・安全な運用のポイントを 5 分で理解できるようまとめました。まずはツールで実際に触ってみましょう。
1. そもそも JWT とは?
JWT(JSON Web Token) は、Web アプリや API で「このユーザーは誰か」「どんな権限を持っているか」といった情報を安全にやり取りするためのトークン(文字列)形式です。
例えば、ログイン後にサーバーが発行した JWT をクライアント(ブラウザやアプリ)が保持し、次回のリクエスト時にそのトークンを提示することで「ログイン済み」と認証されます。
- 自己完結型:トークン自体に情報が含まれる
- 署名付き:改ざんを検知できる
- 広く使われている:OAuth 2.0、OpenID Connect、SaaS の API など
2. JWT の構造(Header・Payload・Signature)
JWT は「.(ドット)」で区切られた 3 つの部分で構成されます:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
これを分解すると:
- Header(ヘッダー): アルゴリズムやトークンタイプ
- Payload(ペイロード): ユーザー情報や有効期限
- Signature(署名): 改ざんされていないかを検証するために使う
重要: Header と Payload は Base64URL エンコードされているだけで、暗号化されていません。つまり、誰でもデコードして中身を見ることができます。
3. デコードと検証の違い(最重要ポイント)
| 操作 | 内容 | 誰ができる? | 用途 |
|---|---|---|---|
| デコード | Base64URL を復号して中身を読む | 誰でもできる | トークン内容の確認・デバッグ |
| 検証(Verify) | 署名を秘密鍵/公開鍵でチェック | 鍵を持つ者のみ | 改ざん検知・真正性の保証 |
よくある誤解
❌ 「デコードできたから正しいトークンだ」 → 間違い! ⭕ 「デコードは誰でもできる。検証して初めて信頼できる」 → 正解!
デコードは「中身を見る」だけ。改ざんされたトークンでも、デコードは成功します。検証を行わないと、悪意ある第三者が作った偽トークンを受け入れてしまう危険があります。
4. 使う場面・利点
JWT はこんなシーンで活躍します:
- 認証トークン: ログイン後の状態を保持(セッションの代わり)
- API 通信: マイクロサービス間で権限情報を受け渡し
- Single Sign-On(SSO): 複数サービスで共通のログイン状態を共有
- OAuth 2.0 / OpenID Connect: アクセストークンや ID トークンとして
利点:
- ステートレス:サーバーでセッション管理不要
- スケーラブル:複数サーバーに分散しやすい
- 標準化:多くのライブラリ・フレームワークが対応
5. よくある勘違い・失敗例
❌ 失敗例 1: Payload に機密情報を入れる
Payload は誰でもデコードできるため、パスワード・クレジットカード番号・個人情報を入れてはいけません。
❌ 失敗例 2: デコードだけで信頼する
フロントエンドでデコードして「ログイン済み」と判断するコードは危険です。必ずバックエンドで署名検証を行いましょう。
❌ 失敗例 3: 有効期限(exp)を無視
exp(Expiration Time)が切れたトークンを受け入れると、古いトークンが悪用されるリスクがあります。検証時に必ずexpもチェックしましょう。
❌ 失敗例 4: alg: none を許可
署名なしトークン(alg: none)を許可すると、誰でも偽トークンを作れてしまいます。実運用では必ず署名アルゴリズムを指定しましょう。
6. セキュリティ・注意点(安全な運用のために)
✅ 短寿命トークンを使う
有効期限は15 分〜1 時間程度に設定し、定期的にリフレッシュする設計が推奨されます。
✅ 秘密鍵を厳重に管理
HS256(共通鍵)の秘密鍵や、RS256(公開鍵暗号)の秘密鍵が漏れると、偽トークンが作られてしまいます。環境変数や専用の鍵管理サービス(AWS KMS、Google Cloud KMS など)を活用しましょう。
✅ HTTPS で通信
JWT は平文で送られるため、必ず HTTPSで通信してください。HTTP 通信では盗聴のリスクがあります。
✅ XSS 対策
トークンを localStorage に保存すると、XSS 攻撃で盗まれる危険があります。可能であればHttpOnly Cookieに保存し、JavaScript からアクセスできないようにしましょう。
7. 手を動かす:ツールで試してみよう
理論だけでなく、実際に JWT をデコードしてみましょう。
📌 JWT Decoder を使う
- サンプルトークンをコピー(上記の例、または実際のトークン)
- /tools/jwt-decoder にアクセス
- トークンを貼り付けると、Header・Payload・Signature が即座に表示されます
試してみること:
- Payload の
exp(有効期限)を確認 - Header の
alg(署名アルゴリズム)を確認 - 改ざんしたトークンをデコードしてみる(デコードは成功するが、検証は失敗することを確認)
注意: このツールはデコード専用です。署名検証は行いません。検証は必ずバックエンドで実装しましょう。
8. 3 分クイズ:理解度チェック
次の問いに答えてみましょう(答えは記事中にあります):
- JWT の 3 つの部分は何?
- デコードと検証の違いは?
- Payload に入れてはいけない情報の例を挙げてください
alg: noneを許可すると何が問題?- 有効期限(exp)が切れたトークンを受け入れるとどうなる?
答えを見る
- Header・Payload・Signature
- デコードは「中身を読む」だけ。検証は「改ざんされていないか確かめる」
- パスワード、クレジットカード番号、個人情報など
- 誰でも偽トークンを作れてしまう
- 古いトークンが悪用されるリスクがある
9. 関連リンク
JWT は「自己完結型の認証トークン」として広く使われていますが、デコード ≠ 検証 を理解し、安全に運用することが重要です。
覚えておきたいポイント:
- Payload は平文(機密情報は入れない)
- 検証は必ずバックエンドで
- 短寿命トークン + リフレッシュトークンの併用
- HTTPS 通信・XSS 対策は必須
関連ツール:
- JWT Decoder でデコードを試す
参考リンク:
さあ、JWT Decoder でトークンをデコードして、実際の構造を確かめてみましょう!
関連ツール: /tools/jwt-decoder