JWT (JSON Web Token・RFC 7519)(ジョット)
IETF 2015年5月標準化のJSON ベース認証Token フォーマット。Header.Payload.Signature 3部構成・Stateless 認証・OAuth 2.0 / OIDC ID Token の標準。
概要
JWT (JSON Web Token・「ジョット」発音) はIETF が2015年5月にRFC 7519 で標準化した、JSON ベース認証Token フォーマット。Michael B. Jones (Microsoft) 主導・OAuth 2.0 / OpenID Connect エコシステムでの認証Token として広範採用。Header.Payload.Signature の3部構成 (Base64URL 各エンコード・「.」区切り)・JWS (JSON Web Signature・RFC 7515) で署名・JWE (JSON Web Encryption・RFC 7516) で暗号化可能。Stateless 認証 (サーバセッション保存不要) で大規模Web アプリ・マイクロサービス間通信に最適、現代Web認証の中核。
JWT 構造
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNzM1Njg2MDAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
3部構成 (「.」区切り・各Base64URL エンコード):
- Header (アルゴリズム情報):
{
"alg": "HS256",
"typ": "JWT"
}
- Payload (Claims):
{
"sub": "1234567890",
"name": "Alice",
"iat": 1735686000,
"exp": 1735689600
}
- Signature (改竄検知):
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
主要署名アルゴリズム (alg)
| アルゴリズム | 種別 | 用途 |
|---|---|---|
| HS256 | 対称 HMAC-SHA256 | 単一サーバ・最も簡単 |
| HS384 | 対称 HMAC-SHA384 | より強い |
| HS512 | 対称 HMAC-SHA512 | 最強対称 |
| RS256 | 非対称 RSA-SHA256 | API分散・公開鍵検証 |
| RS384 / RS512 | 非対称 RSA-SHAxxx | 同 |
| ES256 | 非対称 ECDSA P-256 | 軽量・高速 |
| ES384 / ES512 | 非対称 ECDSA Pxxx | 同 |
| EdDSA | 非対称 Ed25519 | 最新推奨 |
| none | なし | 絶対禁止 (CVE多数) |
Standard Claims
JWT 標準Claim (Payload):
| Claim | 内容 |
|---|---|
| iss | Issuer (発行者) |
| sub | Subject (主体・ユーザID) |
| aud | Audience (対象API) |
| exp | Expiration Time |
| nbf | Not Before |
| iat | Issued At |
| jti | JWT ID (一意 / 再利用防止) |
OIDC ID Token (JWT) 例
OpenID Connect の ID Token はJWT 形式:
{
"iss": "https://accounts.google.com",
"sub": "112345678901234567890",
"aud": "your-app-client-id",
"exp": 1735689600,
"iat": 1735686000,
"email": "[email protected]",
"email_verified": true,
"name": "Alice Smith",
"picture": "https://lh3.googleusercontent.com/..."
}
サーバが署名検証して安全にユーザ情報取得可能。
JWT の主要利点
| 項目 | Cookie Session | JWT |
|---|---|---|
| Stateless | × (サーバセッション必要) | ◎ |
| スケーラビリティ | サーバ間共有困難 | ロードバランス容易 |
| マイクロサービス | 中央セッションStore 必要 | Token 自体に情報内蔵 |
| Mobile / API | Cookie 非対応 | ◎ |
| 改竄耐性 | サーバ管理 | 署名で防止 |
| 取消 | 即時 (DB削除) | 困難 (有効期限まで) |
JWT の課題
| 課題 | 対策 |
|---|---|
| 取消困難 | 短期Token (15分) + Refresh Token |
| 「alg: none」攻撃 | none 拒否 + alg whitelist |
| XSS 攻撃 (localStorage 漏洩) | HttpOnly Cookie 推奨 |
| Token サイズ大 | Cookie容量制限 4KB に注意 |
| 機密情報漏洩 | Payload は Base64 だけで読める (暗号化なし) |
| Replay 攻撃 | jti + Blacklist or short exp |
主要利用シーン
| 用途 | 採用 |
|---|---|
| OAuth 2.0 Access Token | Google / GitHub / Auth0 |
| OIDC ID Token | 全主要IdP |
| API Authentication | RESTful API / GraphQL |
| Microservices間 認証 | gRPC + JWT Metadata |
| SPA / Mobile アプリ | React / Vue / iOS / Android |
| Single Page App Session | localStorage / HttpOnly Cookie |
| Server-to-Server | Client Credentials Flow |
主要ライブラリ
| 言語 | ライブラリ |
|---|---|
| Node.js | jsonwebtoken / jose |
| Python | PyJWT / python-jose |
| Java | jjwt / nimbus-jose-jwt |
| Go | golang-jwt / go-jose |
| Rust | jsonwebtoken |
| C# / .NET | System.IdentityModel.Tokens.Jwt |
| Ruby | ruby-jwt |
| PHP | firebase/php-jwt |
jwt.io デバッガ
Auth0 が運営する https://jwt.io はJWT 学習・デバッグの定番:
- Token を貼り付けてHeader / Payload / Signature を可視化
- 署名アルゴリズム別検証
- 全ライブラリ一覧
- Token 生成試験
関連用語との違い
- vs Session: Stateless / Stateful
- vs Bearer Token: JWT は具体的フォーマット
- vs OAuth 2.0 Token: 形式は不定だが多くはJWT
FAQ
Q1: なぜ「ジョット」発音? A: RFC 7519 のIESG (Internet Engineering Steering Group) 議論で「JWT」発音は「ジョット」(jot) と決定。「ジェイ・ダブリュー・ティー」は誤り (公式)。
Q2: 機密情報をPayload に? A: 入れるべきでない。Payload はBase64 のみで暗号化なし・誰でも読める。機密情報必要なら JWE (暗号化Token) 使用。
Q3: Cookie vs localStorage 保存? A: HttpOnly + Secure Cookie 推奨 (XSS耐性)。localStorage はXSS で漏洩リスク・SPAでもCookie + CSRF Token 構成が現代推奨。