JWTについて


Json Web Token

JWT→ジョットと発音する

JWTは、ヘッダー(Header)、ペイロード(Payload)、署名(Sinature)をピリオドで区切った文字列。

ヘッダー
{
  "typ": "JWT",  // 固定値
  "alg": "HS256" // 署名アルゴリズム HS256で良い
}

これをBase64urlエンコードする。

ペイロード

JSONをBase64urlエンコードした文字列
個々の項目名をクレームと呼ぶ

  • 予約クレーム
クレーム 説明
iss JWT発行者
sub JWT発行者から払い出されたユーザ識別子。文字列またはURIで表わされる。⇒社員番号を設定
aud JWTを利用することが想定された主体の識別子一覧
exp JWTの有効期限を示す。⇒有効期限を設定
nbf JWTが有効になる日時を示す
iat JWTを発行した時刻を示す
jti JWTのための一意な識別子。JWTのリプレイを防ぐことに利用する
typ typヘッダパラメータと同じ値空間および同じ規則が適用される
  • パブリッククレーム

IANA JSON Web Token Claim Registryに登録された上記以外のクレーム

  • プライベートクレーム

上記以外の独自に作ったクレーム

署名

エンコード済みヘッダー、ピリオド(".")、エンコード済みペイロードを連結したものを入力値として、"alg"の署名アルゴリズムで署名し、Base64urlエンコードした文字列

クライアント側の実装例

サーバから受け取ったJWTをクッキー or ローカルストレージに保存する
API実行時にJWTをヘッダのAuthorizationキーの値に設定する。
Authorization: Bearer <JWT>
※Bearerスキームが一般的

ローカルストレージの使い方

localStorage.setItem("message", "こんにちはlocalStorage"); // 設定
localStorage.getItem("message"); // 取得
localStorage.clear(); // 削除

セッションストレージの使い方(ウインドウやタブを閉じるまで有効)

sessionStorage.setItem("message", "こんにちはlocalStorage"); // 設定
sessionStorage.getItem("message"); // 取得
sessionStorage.clear(); // 削除
認証サーバ側の実装例

認証OKの場合、redisにユーザIDをキーにデータを登録する。JWTを生成してクライアントに送付する。

リクエストヘッダのJWTを検証する。
JWTが不正 or 有効期間(24時間)が切れていた場合、ログイン画面を表示する。
ユーザIDに紐づくセッション情報がredisに存在するかどうかを確認する。
redisデータが存在しない、redisデータの有効期限が切れている(60分)場合、ログイン画面を表示する。
ログアウト時にredisのセッション情報を削除する。