jwtについて軽く調べた
仕事でjwt使う〜?って話になったので雰囲気しかしらなかったので調べてみた
jwtとは
<header>.<payload>.<sign>
で構成されている- 各要素が
.(dot)
で区切られている
- 各要素が
- header
{"typ": "JWT", "alg": "HS256"}
- typはJWTの文字列でjwtで有ることを表していて
- algは署名アルゴリズム
- HS256はHMAC SHA-256を表している
- 関連仕様
よくある作り方
- headerをbase64url encode
- payloadをbase64url encode
.
で結合- 結合した文字列でhashを取る
- ハッシュ値を文字列の末尾に結合する
気になったこと
- header, payloadはbase64エンコードをしているだけだが秘密鍵がもれない限りは同じ署名を作成できない > 改竄検出
- 鍵のローテション
- 一定時間で変更しないといけない
- awsだとkms(Key Management Service)とか使うのか?
- とりあえず手作業だと無理
- cookieの不安
alg:none
脆弱性- jwtは
alg:none
にすると署名検証を行わないことが可能 - ライブラリとかを使用する場合は注意必要
- jwtは
- tokenの流出時について
- tokenを直接無効はできない
- 該当アカウントを一時的に無効化(tokenのexpまで)
- 該当tokenのRefresh tokenを失効テーブルのようなものに登録
- 期限切れ後アカウントを有効にし再度ログインさせる
- tokenを直接無効はできない
- 鍵の更新時
- 鍵を更新する際に完全に置き換えると全員ログアウトさせる必要がある
- 以前の鍵で署名されたものは検証を通過できない
- 両方の鍵を運用する必要があり
KeyId
のようなものが必要 - 古い鍵で署名を検証し、送り返す際に新しい鍵で署名をする必要がある
- 鍵を更新する際に完全に置き換えると全員ログアウトさせる必要がある
まとめ
jwt楽でいいぞーと言われたけど、鍵の運用・更新周りが脳死で使うにはちょっとむずかしいなと感じた
どこまでセキュリティ意識するのか問題なのかも?