JWT(JSON Web Token) じぇいだぶりゅーてぃー
簡単に言うとこんな感じ!
JWTは「改ざんできない電子の身分証明書」だよ!ログイン後にサーバーが発行する小さなデータの塊で、「あなたは〇〇さんです、権限はこれです」って情報を安全に持ち運べるんだ。パスポートみたいなイメージ!
JWTとは
JWT(JSON Web Token) は、2者間で情報を安全にやり取りするための、コンパクトで自己完結型のトークン形式です。RFC 7519 で標準化されており、Webサービスのログイン認証やAPIアクセス制御に広く使われています。
最大の特徴は「サーバー側でセッション情報を保存しなくていい」点です。従来のセッション管理では、ログイン情報をサーバーのメモリやデータベースに保存し、ユーザーがリクエストするたびに照合していました。JWTではその情報をトークン自体に埋め込んでデジタル署名するため、サーバーは署名を検証するだけで本物かどうか判断できます。
ビジネスの現場では、社内システムのシングルサインオン(SSO)やスマホアプリのAPI認証など、複数のサービスをまたいで認証情報を受け渡す場面で特に活躍しています。
JWTの構造:3つのパーツ
JWTは .(ドット)で区切られた3つのパーツから成り立っています。実際のトークンはこんな見た目です:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IuWxseeUsOWkqiIsImV4cCI6MTcwMDAwMDAwMH0
.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
| パーツ | 名前 | 中身の例 | 役割 |
|---|---|---|---|
| 第1部 | ヘッダー | {"alg":"HS256","typ":"JWT"} | 署名アルゴリズムの種類 |
| 第2部 | ペイロード | {"sub":"user123","name":"山田太郎","exp":1700000000} | ユーザー情報・有効期限など |
| 第3部 | 署名 | ヘッダー+ペイロードをシークレットキーで署名した値 | 改ざん検出 |
各パーツは Base64URL という方式でエンコード(人間には読みにくい文字列に変換)されています。ペイロードの内容は暗号化ではないので、デコードすれば中身が見えます。機密情報(パスワード等)は入れてはいけません。
覚え方:「頭・中身・ハンコ」
「ヘッダー(頭)」「ペイロード(中身)」「署名(ハンコ)」と覚えましょう。書類に例えると、頭に書式のルール、中身に内容、最後に公式のハンコを押したもの、と考えると分かりやすいです。
ペイロードに入れられるクレームの例
クレーム(Claim) とはペイロードに入れる情報の単位です。
| クレーム名 | 意味 | 例 |
|---|---|---|
sub | Subject(誰についての情報か) | "user123" |
exp | Expiration(有効期限) | UNIXタイムスタンプ |
iat | Issued At(発行日時) | UNIXタイムスタンプ |
iss | Issuer(発行者) | "auth.example.com" |
role | 独自クレーム(権限) | "admin" |
歴史と背景
- 2010年代初頭 — スマートフォンの普及でモバイルアプリのAPI認証需要が急増。Cookieベースのセッション管理がモバイル環境と相性が悪く、新しい認証方式が求められた
- 2015年 — IETF(インターネット標準化団体)が RFC 7519 としてJWTを正式に標準化
- 同年 — OAuth 2.0 や OpenID Connect との組み合わせが普及し、GoogleやFacebookなど大手のSSO(シングルサインオン)にも採用される
- 2016年〜 — マイクロサービスアーキテクチャの台頭とともに、サービス間の認証手段としてJWTが事実上の標準に
- 現在 — AWSやAzure、Auth0 など主要なクラウド・認証サービスが標準対応。ほぼすべてのWebフレームワークにライブラリが存在する
セッション方式 vs JWT方式
従来のセッション認証と比較することで、JWTのメリット・デメリットが見えてきます。
JWTの注意点
- ペイロードは暗号化されていない — デコードすれば誰でも中身を読める。パスワードや個人情報は絶対に入れない
- 有効期限が切れるまで無効化が難しい — 強制ログアウト機能が必要な場合は「トークンブラックリスト」などの追加実装が必要
- トークンが長い — 情報を埋め込むほどサイズが増え、毎回のリクエストに含めるコストが上がる
- 署名アルゴリズムの選択が重要 — 脆弱な
noneアルゴリズムを許可する実装はセキュリティホールになるため、必ずHS256やRS256を指定する
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 7519 | JWT本体の仕様 |
| RFC 7515 | JWS(JSON Web Signature):署名の仕様 |
| RFC 7516 | JWE(JSON Web Encryption):暗号化の仕様 |
| RFC 7517 | JWK(JSON Web Key):鍵の表現形式 |
| RFC 6749 | OAuth 2.0:JWTが多用される認可フレームワーク |
| OpenID Connect 1.0 | OAuth 2.0の上に構築されたID連携仕様。IDトークンにJWTを使用 |
関連用語
- OAuth 2.0 — JWTがよく使われる「認可フレームワーク」の標準仕様
- OpenID Connect — OAuth 2.0を拡張した認証レイヤー。IDトークンにJWTを採用
- SSO(シングルサインオン) — 一度のログインで複数サービスを使える