シングルサインオン・ID連携

JWT(JSON Web Token) じぇいだぶりゅーてぃー

認証トークンJSONBase64署名OAuthOpenID Connect
JWTについて教えて

簡単に言うとこんな感じ!

JWTは「改ざんできない通行手形」だよ!ログインしたら手形を渡して、次からはその手形を見せるだけでOK。手形には「誰が・いつ・何の権限で」って情報が入っていて、偽造されていないか署名で確認できるんだ!


JWTとは

JWT(JSON Web Token、ジェイダブリューティー) は、二者間で情報を安全にやり取りするための、コンパクトで自己完結型のトークン(通行手形)フォーマットです。JSON形式でユーザー情報や権限などのデータを格納し、デジタル署名によって改ざんされていないことを証明できます。

Webアプリやモバイルアプリの認証認可の仕組みとして広く使われています。従来のセッション管理はサーバー側にログイン状態を保存する必要がありましたが、JWTを使うとトークン自体に情報が詰まっているため、サーバー側で状態を保持しなくて済む(ステートレス) という大きなメリットがあります。大規模なシステムや複数サービスにまたがるシングルサインオンSSO)との相性が特に良く、OAuth 2.0OpenID 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タイムスタンプ
jtiJWTの一意なID"abc123xyz"

署名アルゴリズムの種類

アルゴリズム方式用途
HS256対称鍵(同じ鍵で署名・検証)同一サービス内での認証
RS256非対称鍵(秘密鍵で署名、公開鍵で検証)複数サービス間の連携
ES256楕円曲線署名(非対称)モバイル・IoTなど軽量が求められる場面

歴史と背景

  • 2010年頃 — OAuthの普及とともにWebAPIでのトークン認証ニーズが高まる。セッション管理の限界(スケールアウト時の状態共有問題)が顕在化
  • 2015年 — IETFが RFC 7519 としてJWTを正式に標準化。同時にJWS(署名)・JWE(暗号化)も標準化
  • 2016年以降OpenID Connect の実装でIDトークンとしてJWTが標準採用され、急速に普及
  • 2020年代マイクロサービスアーキテクチャの普及で、サービス間の認証・認可にJWTが事実上の標準となる

セッション認証との比較

従来のセッション認証とJWTを使ったトークン認証の違いを整理します。

セッション認証 vs JWT(トークン認証) セッション認証(従来型) JWT(トークン認証) ① ログイン情報をサーバーに送信 ② サーバーがセッションIDを発行・保存 ③ クライアントはCookieでIDを保持 ④ リクエスト毎にIDをDBで照合 ① ログイン情報をサーバーに送信 ② サーバーがJWTを発行(保存しない) ③ クライアントがJWTを保持 ④ リクエスト毎にJWTの署名を検証 特徴 ✅ トークン失効が即時可能 ✅ 秘密情報をサーバー側のみで管理 ⚠️ サーバーにセッションDBが必要 ⚠️ スケールアウト時に共有DBが必要 特徴 ✅ サーバーに状態保持が不要(ステートレス) ✅ 複数サービスで使い回し可能 ⚠️ 発行済みトークンの即時無効化が困難 ⚠️ ペイロードは誰でも読める(暗号化なし) 向いている場面: 厳格な権限管理が必要な エンタープライズ系 向いている場面: マイクロサービス・API連携・ モバイルアプリ・SSO

JWTの実務上の注意点

  • 有効期限(exp)は短めに設定する — 漏洩しても被害を最小限に。アクセストークンは15〜60分が一般的
  • リフレッシュトークンと組み合わせる — 短命なアクセストークンを再発行する仕組みで使い勝手をカバー
  • ペイロードに個人情報・パスワードを入れない — Base64は暗号化ではなく「変換」なので誰でも読める
  • HTTPS必須HTTPで送信するとトークンが盗聴される

関連する規格・RFC

規格・RFC番号内容
RFC 7519JWT(JSON Web Token)の本体仕様
RFC 7515JWS(JSON Web Signature)— JWTの署名仕様
RFC 7516JWE(JSON Web Encryption)— ペイロードを暗号化する仕様
RFC 7517JWK(JSON Web Key)— 鍵をJSON形式で表現する仕様
RFC 7518JWA(JSON Web Algorithms)— 使用できる署名アルゴリズムの一覧
RFC 6749OAuth 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を安全に送受信するために必須の暗号化通信