JWTとは?JSON Web Tokenの完全な解説
簡単な回答
JWT は、Base64URL でエンコードされた 3 つの部分がドットで区切られた文字列です: header.payload.signature。ヘッダーはアルゴリズムを指定し、ペイロードにはクレーム (ユーザー ID、ロール、有効期限) が含まれ、署名は信頼性を証明します。 JWT はステートレス認証に使用されます。無料の JWT デコーダを使用して、ブラウザ内のトークンの内容を検査します。
導入
JWT (JSON Web トークン) は、当事者間で情報を JSON オブジェクトとして安全に送信するために RFC 7519 によって定義された、コンパクトで URL に安全なトークン形式です。 JWT は、Web アプリケーションでの認証と認可に広く使用されています。ユーザーがログインすると、サーバーは JWT を発行し、クライアントはこれを後続のリクエストに含めて身元を証明します。 JWT はステートレスです。サーバーはデータベース内のトークンを検索する必要がありません。トークン自体には、ユーザーの主張と、改ざんされていないことを証明する署名が含まれています。
ステップバイステップ
-
3部構成を理解する
JWT には、ヘッダー (アルゴリズムとタイプ)、ペイロード (クレーム)、および署名 (整合性の証明) の 3 つの部分があります。各部分は Base64URL でエンコードされており、eyJhbGciOi...J9.eyJzdWIi...J9.signature のようにドットで区切られています。最初の 2 つの部分は、トークンを持っている人なら誰でも読むことができます。署名のみに秘密キーが必要です。
-
標準的な主張を学ぶ
ペイロードにはクレーム、つまり主題に関するステートメントが含まれています。標準クレーム: 'sub' (件名/ユーザー ID)、'iat' (タイムスタンプ時に発行)、'exp' (有効期限)、'nbf' (以前)、'iss' (発行者)、'aud' (対象者)。カスタム クレームには、ロール、権限、その他のデータを含めることができます。
-
署名アルゴリズムを理解する
JWT は対称 (HS256 - 共有秘密) または非対称 (RS256、ES256 - 公開/秘密キーのペア) 署名を使用します。署名により改ざんが防止されます。トークンの一部を変更すると署名が無効になります。秘密鍵/秘密鍵の所有者のみが有効なトークンを作成できます。
-
認証に JWT を使用する
ログイン後、サーバーは JWT を作成し、クライアントに送信します。クライアントは、後続のリクエストの Authorization ヘッダー (ベアラー トークン) に JWT を含めます。サーバーは署名を検証し、有効期限をチェックします。データベースの検索は必要ありません。
例
JWT 構造体
入力: 典型的な JWT
出力: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMSIsImV4cCI6MTY5MzYxMjgwMH0.signature
デコードされたヘッダー
入力: 最初の部分をデコードした
出力: {"alg": "HS256", "typ": "JWT"}
デコードされたペイロード
入力: 後半部分をデコードした
出力: {"sub": "user1", "name": "Alice", "iat": 1693526400, "exp": 1693612800}
よくある問題
- デコードと検証 — JWT をデコードする (内容を読み取る) ことは、それが本物であることを証明するものではありません。クレームを信頼する前に、必ずサーバー側で秘密キーを使用して署名を検証してください。
- JWT を localStorage に保存すると、JavaScript から JWT にアクセスできるようになり、XSS 攻撃に対して脆弱になります。セキュリティを強化するために httpOnly Cookie に保存します。
- 有効期間の長いトークン — トークンが盗まれた場合でも、有効期限が切れるまで有効です。長時間のセッションの場合は、有効期間の短いアクセス トークン (15 ~ 60 分) をリフレッシュ トークンとともに使用します。
- ペイロード内の機密データ — ペイロードは、トークン (Base64 であり、暗号化されていません) を持っている人なら誰でも読み取ることができます。ペイロードにはパスワード、クレジット カード、または秘密情報を決して入れないでください。
ヒント
- 主張を信頼する前に、必ずサーバー側で JWT 署名を検証してください。デコードだけでは認証ではありません。
- トークンの盗難による被害を最小限に抑えるために、長時間のセッションの場合は、有効期間の短いアクセス トークン (15 ~ 60 分) をリフレッシュ トークンとともに使用してください。
- XSS 攻撃を防ぐために、JWT を localStorage ではなく httpOnly、Secure、SameSite Cookie に保存します。
- JWT デコーダーを使用して、デバッグのためにトークンの内容を検査します。トークンがブラウザーから離れることはありません。