JWT
- 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
- Hash-based MACのことで, ハッシュ関数が SHA256
- mac: タグ値, SHA256 なら256bit
HMAC - Wikipedia
検証: 一方向関数 を使ってハッシュ値の検証
ユーザーの認証: 鍵共有すれば同じ値に対して同じハッシュ値になるため
- authサーバとリソースサーバが同一であればHMAC使える
- 違ったら, authサーバでskもって, リソースサーバでpk使って検証
HS256
RS256
- RSA署名を正しく理解する
- RSASSA-PKCS-v1_5 RFC 8017 - PKCS #1: RSA Cryptography Specifications Version 2.2 日本語訳
- “algorithm” の話にハッシュ化の話がある RFC 7518 - JSON Web Algorithms (JWA)
- RSA暗号 RFC 3447 - Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1
- 8.2 RSASSA-PKCS1-v1_5
- EMSA-PKCS1-v1_5 を使ってハッシュ化
- 8.2 RSASSA-PKCS1-v1_5
デジタル署名
- 第三者に対する証明: pkを渡せば良い
Refresh Token
-
アクセストークンを再発行するためのトークン, 有効期限は長め(数週間~数ヶ月)
- LINE APIは90日?
-
フォーマットに決まりはなくランダム文字列でいい
- が UUID はセキュリティ的に適さない?
- java - Is UUID.randomUUID() suitable for use as a one-time password? - Stack Overflow
- uuid/v4 は 122/128bit secure 適さなくはない気が
- java - Is UUID.randomUUID() suitable for use as a one-time password? - Stack Overflow
- が UUID はセキュリティ的に適さない?
-
refreshtoken_iat: iatってissue_atか
claimには不変な値を設定すべき
codereview
ページ読み込み時にAPIに複数リクエストが飛ぶためリフレシュトークン
の更新が多重に起きてしまう
-> リクエスト前にフックして有効期限を確認?クライアントサイドに任せよう
クライアント側
参考文献
- JWT周りについて理解するために読んだサイト
- JWTを認証用トークンに使う時に調べたこと - Carpe Diem
- リフレッシュトークンの期限切れの判定方法とその場合のアクセストークン再発行の方法に関して - API 2.0 - LINE WORKS Developers : コミュニティ
- JWT形式を採用したChatWorkのアクセストークンについて - Chatwork Creator’s Note
- JWTを使った今どきのSPAの認証について | HiCustomer Lab - HiCustomer Developer’s Blog
- Firebase Auth も Auth0 のようにiFrame内でトークンを管理するらしい