JWT(JSON Web Token) じぇいだぶりゅーてぃー
認証トークンJSONBase64署名OAuthOpenID Connect
JWTについて教えて
簡単に言うとこんな感じ!
JWTは「改ざんできない通行手形」だよ!ログインしたら手形を渡して、次からはその手形を見せるだけでOK。手形には「誰が・いつ・何の権限で」って情報が入っていて、偽造されていないか署名で確認できるんだ!
JWTとは
JWT(JSON Web Token、ジェイダブリューティー) は、二者間で情報を安全にやり取りするための、コンパクトで自己完結型のトークン(通行手形)フォーマットです。JSON形式でユーザー情報や権限などのデータを格納し、デジタル署名によって改ざんされていないことを証明できます。
Webアプリやモバイルアプリの認証・認可の仕組みとして広く使われています。従来のセッション管理はサーバー側にログイン状態を保存する必要がありましたが、JWTを使うとトークン自体に情報が詰まっているため、サーバー側で状態を保持しなくて済む(ステートレス) という大きなメリットがあります。大規模なシステムや複数サービスにまたがるシングルサインオン(SSO)との相性が特に良く、OAuth 2.0 や OpenID Connect の実装でも標準的に使われています。
JWTの構造
JWTは「.(ドット)」で区切られた3つのパーツから構成されています。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6Iuazi
uWLmeiAhSIsImV4cCI6MTcxMjY0MDAwMH0
.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
↑ ヘッダー ↑ ペイロード ↑ 署名
| パーツ | 役割 | 内容例 |
|---|---|---|
| ヘッダー(Header) | トークンの種類と署名アルゴリズムを宣言 | {"alg": "HS256", "typ": "JWT"} |
| ペイロード(Payload) | 伝えたい情報(クレーム)を格納 | {"sub": "user123", "name": "山田太郎", "exp": 1712640000} |
| 署名(Signature) | 改ざんを検知するための電子署名 | ヘッダー+ペイロードを秘密鍵で署名したもの |
各パーツは Base64URLエンコード(URLで安全に使える文字列変換)されているだけなので、ヘッダーとペイロードは誰でも読めます。秘密情報はペイロードに入れないことが鉄則です。
クレーム(Claim)とは
ペイロードに入れる各情報の単位をクレーム(主張) と呼びます。JWTの仕様では以下の「登録済みクレーム」が定義されています。
| クレーム名 | 意味 | 例 |
|---|---|---|
sub | 主体(誰のトークンか) | "user123" |
iss | 発行者(誰が発行したか) | "https://auth.example.com" |
aud | 受け取り手(誰向けか) | "https://api.example.com" |
exp | 有効期限(Expiration) | Unixタイムスタンプ |
iat | 発行時刻(Issued At) | Unixタイムスタンプ |
jti | JWTの一意なID | "abc123xyz" |
署名アルゴリズムの種類
| アルゴリズム | 方式 | 用途 |
|---|---|---|
| HS256 | 対称鍵(同じ鍵で署名・検証) | 同一サービス内での認証 |
| RS256 | 非対称鍵(秘密鍵で署名、公開鍵で検証) | 複数サービス間の連携 |
| ES256 | 楕円曲線署名(非対称) | モバイル・IoTなど軽量が求められる場面 |
歴史と背景
- 2010年頃 — OAuthの普及とともにWebAPIでのトークン認証ニーズが高まる。セッション管理の限界(スケールアウト時の状態共有問題)が顕在化
- 2015年 — IETFが RFC 7519 としてJWTを正式に標準化。同時にJWS(署名)・JWE(暗号化)も標準化
- 2016年以降 — OpenID Connect の実装でIDトークンとしてJWTが標準採用され、急速に普及
- 2020年代 — マイクロサービスアーキテクチャの普及で、サービス間の認証・認可にJWTが事実上の標準となる
セッション認証との比較
従来のセッション認証とJWTを使ったトークン認証の違いを整理します。
JWTの実務上の注意点
- 有効期限(exp)は短めに設定する — 漏洩しても被害を最小限に。アクセストークンは15〜60分が一般的
- リフレッシュトークンと組み合わせる — 短命なアクセストークンを再発行する仕組みで使い勝手をカバー
- ペイロードに個人情報・パスワードを入れない — Base64は暗号化ではなく「変換」なので誰でも読める
- HTTPS必須 — HTTPで送信するとトークンが盗聴される
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 7519 | JWT(JSON Web Token)の本体仕様 |
| RFC 7515 | JWS(JSON Web Signature)— JWTの署名仕様 |
| RFC 7516 | JWE(JSON Web Encryption)— ペイロードを暗号化する仕様 |
| RFC 7517 | JWK(JSON Web Key)— 鍵をJSON形式で表現する仕様 |
| RFC 7518 | JWA(JSON Web Algorithms)— 使用できる署名アルゴリズムの一覧 |
| RFC 6749 | OAuth 2.0 — JWTが多用される認可フレームワーク |
関連用語
- OAuth 2.0 — JWTが標準的に使われる認可フレームワーク
- OpenID Connect — OAuth 2.0を拡張した認証プロトコル。IDトークンにJWTを使用
- シングルサインオン(SSO) — 一度のログインで複数サービスを利用できる仕組み。JWTと相性抜群
- Bearer認証 — JWTをHTTPヘッダーで送る際に使われる認証方式
- 公開鍵暗号 — RS256など非対称鍵署名の基礎技術
- Base64 — JWTの各パーツのエンコードに使われる変換方式
- セッション管理 — JWTと対比される従来型の認証状態管理の仕組み
- HTTPS — JWTを安全に送受信するために必須の暗号化通信