JWT とトークン認証
トークン自体に認証情報と署名を含めるステートレス認証の仕組み。_moc-web-infra
JWT の構造
<ヘッダ.ペイロード.署名>。claim を含むJSONをbase64エンコードしたものに署名を付与する。暗号化ではなく署名である点に注意(中身は誰でも読める)。
Authorization: Bearer <token>ヘッダで送る。- ステートレス: クライアントが毎回JWTを送るのでサーバは状態を持たなくてよく、認証サーバへの問い合わせ不要でスケールする。
署名アルゴリズム
- HMAC(HS256): 共有鍵による Hash-based MAC(ハッシュは SHA256)。auth サーバとリソースサーバが同一なら使える。
- RSA(RS256): 秘密鍵で署名・公開鍵で検証。auth とリソースが分離していても公開鍵を配れば検証できる(RSASSA-PKCS1-v1_5)。
Refresh Token
アクセストークンは短命(15分程度が定石)にし、長命(数週間〜数ヶ月)の refresh token で再発行する。
- フォーマットは自由(ランダム文字列でよい)だが、盗難に備え revoke 機能を用意すべき。
- claim には不変な値を設定する。
- ユーザーごとに複数の token pair を持たせたい場合、refresh token を JWT 化して claim に一意idを持たせDBに保存する。
保存先と安全性
localStorage ≒ sessionStorage < http-only Cookie < サーバセッション。いずれも XSS の前には無力。
- sessionStorage はタブ間で共有されない → 複数タブで認証状態を共有するなら localStorage(アクセストークンが十分短命なら許容)。
- ページ読込で複数APIが並列に飛ぶと refresh が多重発火し race するため、リクエスト前にフックして有効期限を確認するなどクライアント側で制御する。
CWT
JWT のバイナリ(CBOR)版。