ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

jwtについて軽く調べた

仕事でjwt使う〜?って話になったので雰囲気しかしらなかったので調べてみた

jwtとは

  • <header>.<payload>.<sign>で構成されている
    • 各要素が.(dot)で区切られている
  • header
    • {"typ": "JWT", "alg": "HS256"}
      • typはJWTの文字列でjwtで有ることを表していて
      • algは署名アルゴリズム
        • HS256はHMAC SHA-256を表している
  • 関連仕様
    • JSON Web Signature(JWS)
    • JSON Web Encryption(JWE)

よくある作り方

  1. headerをbase64url encode
  2. payloadをbase64url encode
  3. .で結合
  4. 結合した文字列でhashを取る
  5. ハッシュ値を文字列の末尾に結合する

気になったこと

  • header, payloadはbase64エンコードをしているだけだが秘密鍵がもれない限りは同じ署名を作成できない > 改竄検出
  • 鍵のローテション
    • 一定時間で変更しないといけない
    • awsだとkms(Key Management Service)とか使うのか?
      • とりあえず手作業だと無理
  • cookieの不安
    • 4096Bが限界なのでbase64で1.2倍になると考えるとペイロードが多くなれば使えない?
    • ブラウザのSession Storageなどを使う方法もあるがcookieと違い自動的には送出されない
  • alg:none脆弱性
    • jwtはalg:noneにすると署名検証を行わないことが可能
    • ライブラリとかを使用する場合は注意必要
  • tokenの流出時について
    • tokenを直接無効はできない
      • 該当アカウントを一時的に無効化(tokenのexpまで)
      • 該当tokenのRefresh tokenを失効テーブルのようなものに登録
      • 期限切れ後アカウントを有効にし再度ログインさせる
  • 鍵の更新時
    • 鍵を更新する際に完全に置き換えると全員ログアウトさせる必要がある
      • 以前の鍵で署名されたものは検証を通過できない
    • 両方の鍵を運用する必要がありKeyIdのようなものが必要
    • 古い鍵で署名を検証し、送り返す際に新しい鍵で署名をする必要がある

まとめ

jwt楽でいいぞーと言われたけど、鍵の運用・更新周りが脳死で使うにはちょっとむずかしいなと感じた

どこまでセキュリティ意識するのか問題なのかも?