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のセッション情報を削除する。