JWT

2022-09-24

  • cookie と比較される
  • 暗号化ではない
  • トークン自体に認証情報と電子署名を持たせてしまうフォーマットのこと
  • 認証情報(claim)を含むJSONをbase64エンコードしたものに署名を付与したもの
  • token は Authorization ヘッダに乗せる
    • Bearer <token> が一般的
  • ステートレス
    • クライアントが毎リクエストJWTを渡してくるのでサーバで情報を保持しなくて良いという意味
  • 2022-10-10 スケーラブル
    • 認証サーバーにセッションの妥当性を問い合わせなくて良いので分散できる

フォーマット

<ヘッダ.ペイロード.署名>

JWT expiration time Best Practice

  • 基本短命である方が良い

The Ultimate Guide to handling JWTs on frontend clients (GraphQL)

And these values are kept short. Common practice is to keep it around 15 minutes

15分らしい

  • refresh token を付随すればユーザーが意識しなくてもトークンをリフレッシュ出来るのでかなり短くてよいらしい
    • refresh tokenが盗まれる可能性もあるのでrevokeする機能も実装したほうが良い

アルゴリズム

HMAC256

アルゴリズム: HmacSHA256

検証: 一方向関数 を使ってハッシュ値の検証
ユーザーの認証: 鍵共有すれば同じ値に対して同じハッシュ値になるため

  • authサーバとリソースサーバが同一であればHMAC使える
    • 違ったら, authサーバでskもって, リソースサーバでpk使って検証

HS256

RS256

デジタル署名

  • 第三者に対する証明: pkを渡せば良い

Refresh Token

claimには不変な値を設定すべき

codereview
ページ読み込み時にAPIに複数リクエストが飛ぶためリフレシュトークン
の更新が多重に起きてしまう
-> リクエスト前にフックして有効期限を確認?クライアントサイドに任せよう

クライアント側

参考文献