+ 作るログイン
図を読み込んでいます…
1 / 7
図でつながる 認証と暗号の基礎 / 全9章

JWT ― 読む・検証する・許可するを分ける

発行
アニメモ公式
版
第2版
改訂
コマ
全7

三つの部分を分解し、クレームへズーム。署名だけで終わらない検証と、期限・ログアウトの違いを解説します。

JWTは、クレームを運ぶ形式

JWT(JSON Web Token)は、発行者や有効期限などの情報をコンパクトに運ぶための形式です。情報の項目をクレームと呼びます。JWTという名前自体が、ログイン方式や認可ルールを意味するわけではありません。RFC 7519

この教材では、よく見かけるJWS Compact形式の署名またはMAC付きJWTを中心に扱います。ドットで区切られた三つの部分が特徴です。

JWTには暗号化されたJWE形式などもあります。「すべてのJWTが三分割で中身も読める」と一般化しないでください。

  • 06 / SECURITY NOTES
  • 1 / 7
  • JWTは、情報を運ぶ「形式」
  • Header
  • .
  • Payload
  • .
  • Signature
  • アルゴリズム等
  • クレーム
  • 署名 / MAC
  • ログイン方式や認可ルールそのものではない
  • ここでは、よく使われるJWS Compact形式を図解する。

三つの部分を開いてみる

base64url(header).base64url(payload).base64url(signature)

ヘッダーはアルゴリズムなど、ペイロードはクレーム、三つ目は署名値またはMACを表します。図では一枚のトークンが三枚に分かれます。

JWS形式のヘッダーとペイロードはBase64urlで表現されます。エンコードは暗号化ではありません。 手に入れた人が読めるので、パスワードや秘密鍵を入れてはいけません。

デコードできたことと、信用してよいことは別です。まだ署名・MACやクレームの検証をしていません。JWS Compact形式

  • 06 / SECURITY NOTES
  • 2 / 7
  • 三つに分けて、意味を読む
  • Header
  • .
  • Payload
  • .
  • Signature
  • アルゴリズム等
  • クレーム
  • 署名 / MAC
  • alg: RS256 typ: JWT
  • iss / sub / aud exp / nbf …
  • 前の二つに 結び付く値
  • 暗号化されたJWE形式などもある
  • Base64urlはエンコード。読めることと信頼できることは別。

誰から、誰へ、いつまで?

図ではペイロードへ寄って、判断に使う項目を見ます。

クレーム意味の目安
iss誰が発行したか
subその発行者のもとで誰・何を表すか
audどの受け手に向けたものか
expいつ失効するか
nbfいつ以降なら受け入れてよいか

exp などのNumericDateはUnix時刻の秒です。JavaScriptのミリ秒と混同しないでください。どのクレームを必須にするかは、JWTを使うプロトコルやアプリの要件で決まります。登録済みクレーム

  • 06 / SECURITY NOTES
  • 3 / 7
  • ペイロードへ寄る:誰から、誰へ?
  • Payload
  • iss 発行者 sub 対象の主体 aud 宛先
  • exp 失効時刻 nbf 有効開始 時刻は秒単位
  • クレームは検証して使う。NumericDateの単位は秒。

デコードの次に、検証の関門を通す

受け手は、想定したアルゴリズムと信頼する鍵で署名・MACを検証し、発行者・対象・時刻などの条件を確認します。ヘッダーに書かれた alg をそのまま信じて、何でも受け入れてはいけません。

受信 → 形式の検査 → 署名 / MACの検証
     → iss / aud / exp 等の検証 → 用途の確認

この矢印は検証項目を説明するためのものです。実装には適切な検証ライブラリを使い、未検証のクレームに基づく操作を先に実行しません。JWTのセキュリティ指針

  • 06 / SECURITY NOTES
  • 4 / 7
  • 検証の関門を、全部通す
  • 署名 / MAC
  • クレーム
  • 用途
  • 許可した方式と信頼する鍵
  • iss・aud・時刻など
  • 想定するJWTか
  • 受信した JWT
  • 未検証の内容で操作しない
  • algに従って何でも受け入れず、許可した方式で検証する。

署名が正しくても、宛先が違えば拒否する

写真API向けに発行されたトークンを、決済APIに持ち込んだとします。発行者と署名が本物でも、aud が自分を対象にしていなければ、その用途では拒否します。

図では同じトークンが二つのAPIへ向かい、宛先が合う側だけが通ります。JWTの検証は「署名が合う」の一問で終わりません。

別のプロトコル向けのJWTを受け入れないことも重要です。例えばOIDCのIDトークンを、そのまま任意のAPI用アクセストークンの代わりにはできません。用途の混同を防ぐ

  • 06 / SECURITY NOTES
  • 5 / 7
  • 署名が正しくても、宛先が違えば拒否
  • 写真API → 宛先一致
  • ほかの検証条件も必要
  • aud = 写真API
  • 決済API → 拒否
  • 正当な署名だけでは足りない
  • audが写真APIのトークンを、決済APIへ流用しない。

JWTなら、すぐに失効するとは限らない

有効な署名と未来の exp があれば、オフライン検証をする受け手は、利用者がログアウトした事実をそのJWTだけから知れない場合があります。

短い有効期限、セッション照合、失効リスト、トークンの状態を問い合わせる仕組みなどを、必要な即時性に応じて組み合わせます。JWTを採用しただけで、サーバーの状態管理が一切不要になるわけではありません。

また、Bearerトークンは持つ人が使えてしまうため、漏らさない扱いが必要です。JWTかどうかという形式の話と、所持者が使えるという性質の話は分けて考えます。Bearer Tokenの性質

  • 06 / SECURITY NOTES
  • 6 / 7
  • ログアウトと、JWTの期限は別
  • 発行
  • ログアウト
  • exp
  • オフライン検証の例
  • JWTの検証は通る場合がある
  • 即時に止めたいなら、失効やセッションの仕組みも設計する。

確認:ペイロードにadminと書いてあれば管理者?

答えはその文字列だけでは判断できません。誰でも文字列を作り、Base64urlで表現できます。適切な検証を通したうえで、その発行者がどの情報を保証するか、自分のアプリで何を許すかを決めます。

JWTは情報を運ぶ器です。OAuthはアクセスを委ねる仕組み、OIDCは認証結果を伝える仕組みで、JWTをその中で使うことがあります。

「読む」「検証する」「許可する」の三段階を区別できれば、JWTという見た目に引きずられずに設計を読めます。

  • 06 / SECURITY NOTES
  • 7 / 7
  • 確認:adminと読めたら、管理者?
  • 読む
  • 検証する
  • 許可する
  • デコード
  • 署名・クレーム・用途
  • アプリの認可
  • 検証済みの情報
  • 答えは NO。読む → 検証する → 許可する。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]