13
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JWTについて

Posted at

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

13
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?