🔐

JWT(JSON Web Token)

2023/11/08に公開

なにか

JSON Web Tokensは、2者間でクレームを安全に表現するためのオープンな業界標準 RFC7519メソッドです。

公式

  1. ユーザーがログインする(本人であるという証明)
  2. サーバーがJWTを発行し、レスポンスに付加する(本人であるということを認証)
  3. 以降、リクエスト・レスポンスにJWTを付加し、都度、JWTを検証することで上記の状態を保証する

仕組み(JWS = Json Web Signature)

実際に使用されているのは、JSON Web トークンに署名(シグネチャ)した文字列を連結した"JWS"が使用されている
JWSはドット (.) で区切られた3つの部分で構成されている

  • ヘッダー
  • ペイロード
  • シグネチャ

ヘッダー

{
  "alg": "HS256", // 署名に使用するアルゴリズム
  "typ": "JWT" // トークンのタイプ
}

ペイロード

クレームといわれる値が含まれる
iss (発行者)、exp (有効期限)、sub (件名)、aud (対象者)
エンティティ(認証されたユーザーの)等
参考

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

シグネチャ

ヘッダーとペイロードをBase64Urlエンコードし、ヘッダーで指定されているアルゴリズム(今回だと、"alg": "HS256")で変換したものになる
以下で、変換された値が、シグネチャとなる

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret // 秘密鍵
)

JWS発行後

下記のような形で、付加され送信される

Authorization: Bearer <token>

秘密鍵と対になっている公開鍵を使用することで、トークンが改ざんされているか否か検証することができる

セキュリティ

トークンがまるごと抜き取られた場合、そのトークンを使用してapiのリソース等を操作できてしまう
対策としては

  • トークンの期限は短く設定する(アクセストークンが30m、リフレッシュトークンを24hにする等)
  • 登録情報の変更など、重要な処理をする場合は、二段階認証等の確認処理を挟む

その他

IDフェデレーション( ≒ SSO?)

  1. 認証サーバー(Facebook等のSNS)で、ログインし認証情報を発行
  2. その情報を使用し、その他のリソースを使用する

Discussion