/11分で読めます
JWTとは?JSON Web Tokenの構造、クレーム、セキュリティを解説
JWT(JSON Web Token)は、システム間でクレームを安全に受け渡すためのコンパクトな形式です。現代のWebアプリでは、API認証、セッション管理、認可で広く使われています。
JWTとは?
JWTはJSON Web Tokenの略で、RFC 7519で定義されています。署名付きJSONオブジェクトとしてクレームを表現する、URLセーフなトークン形式です。
サーバーはログイン後にJWTを発行でき、クライアントは以後のリクエストでAuthorization: Bearer <token>ヘッダーに入れて送信します。
JWTの構造: Header、Payload、Signature
JWTは、ドットで区切られた3つのBase64URLエンコード済みパートで構成されます:
header.payload.signature- Header: トークン種別と署名アルゴリズム。例: HS256。
- Payload: ユーザーID、ロール、発行者、対象者、有効期限などのクレーム。
- Signature: 完全性と真正性を検証し、サーバーが改ざんを検出できるようにする部分。
JWTクレームの解説
よく使われる登録済みクレームには次のようなものがあります:
iss: 発行者sub: 主体。通常はユーザーIDaud: 対象者exp: 有効期限のタイムスタンプiat: 発行時刻のタイムスタンプnbf: この時刻より前は無効、というタイムスタンプ
ペイロードの内容はトークンを持つ人なら誰でもデコードできるため、シークレット、パスワード、秘密鍵、機密性の高い個人情報をクレームに入れないでください。
JWT認証の仕組み
- ユーザーが認証情報でサインインします。
- サーバーがユーザーを検証し、アクセストークンとしてJWTを発行します。
- クライアントはトークンを保存します。可能であればセキュアなHTTP-only Cookieを使うのが望ましいです。
- クライアントはAPIリクエストにトークンを添えて送信します。
- サーバーは保護されたデータを返す前に、署名とクレームを検証します。
HS256とRS256の違い
| アルゴリズム | 鍵の種類 | 主な用途 |
|---|---|---|
| HS256 | 共有シークレット | 単一サービスのアプリ、または厳密に管理された内部システム |
| RS256 | 公開鍵と秘密鍵のペア | 分散システムや第三者による検証 |
セキュリティのベストプラクティス
- アクセストークンの寿命は
expで短く設定します。 - ローテーションと失効に対応したリフレッシュトークンを使います。
- 署名、発行者、対象者、有効期限を必ず検証します。
- 署名なしトークンを拒否し、許可するアルゴリズムを明示的に制御します。
- トークンは必ずHTTPS経由で送信します。
- JWTは認証情報として扱い、ログに残したりエラーレポートへ含めたりしないようにします。
JWTツール
認証フローをテストするときは、次のツールでJWTを確認・作成できます:
参考資料
- Jones, M., Bradley, J., and Sakimura, N. (2015). RFC 7519: JSON Web Token (JWT). IETF. https://datatracker.ietf.org/doc/html/rfc7519
- Sheffer, Y., Hardt, D., and Jones, M. (2020). RFC 8725: JSON Web Token Best Current Practices. IETF. https://datatracker.ietf.org/doc/html/rfc8725
- OWASP Foundation. JSON Web Token Cheat Sheet for Java. https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.html