1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【セキュリティ】JWT Lifetimes

Last updated at Posted at 2025-11-13

はじめに

― 有効期限(exp)を正しく管理しないとどうなるか ―

JWT は「署名が正しければ有効」と思われがちですが、もう一つ重要なチェック要素があります。それが 有効期限(exp) です。
JWT は一度クライアントへ渡ったら、基本的にサーバ側で削除できません。
そのためレイテンシの長い API や分散システムにおいては、「トークンがいつまで生きるか」の設計が非常に重要です。


1. Token Lifetime(トークンの寿命)

JWT はサーバ側で強制的に削除できません。
Cookie ならサーバ側で「失効」処理が可能ですが、JWT にはその機能がないため、

  • exp が長すぎる
  • そもそも exp が設定されていない

という状態だと、攻撃者がトークンを手に入れたら永遠に使えてしまう という最悪の事態になります。

exp がないJWTはどうなる?

ほとんどの JWT ライブラリはこう動きます:

exp が無ければ、署名さえ正しければ常に有効と判定する

つまり「半永久トークン」が誕生してしまいます。


2. どれくらいの exp が適切?

アプリの性質によって変わります:

サービス例 安全要求 推奨寿命
Webメール 数時間〜数日
SNS 中~高 数十分〜数時間
銀行/金融 数分
管理コンソール 非常に高 数分

長くしすぎると漏えい時の impact が増え、短くしすぎるとユーザ体験が落ちます。
現実的には 短めのAccess Token + Refresh Token が一般的なベストプラクティスです。


3. “Token Revocation Problem”

有効期限前に無効化したい場合どうする?

JWT は stateless なので、サーバ側から「このトークンを今すぐ無効化して」ということができません。
そのため実務では「Blocklist(無効化リスト)」を保持する必要があります。

ただし:

  • 分散APIだと複数サーバで同期する必要がある
  • キャッシュ層や microservice 全体で管理が必要
  • 結果として “centralized session” に逆戻り

JWT を乱用すると本来のメリットを失うため、設計は慎重に行う必要があります。


4. Practical Example 6(TryHackMe)

この例の JWT は exp が設定されていないため永続トークン

提供された token をそのまま使うだけで admin としてログインできます:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXIiLCJhZG1pbiI6MX0.ko7EQiATQQzrQPwRO8ZTY37pQWGLPZWEvdWH0tVDNPU

実行ログ:

curl -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXIiLCJhZG1pbiI6MX0.ko7EQiATQQzrQPwRO8ZTY37pQWGLPZWEvdWH0tVDNPU' \
  http://MACHINE/api/v1.0/example6?username=admin

結果:

{
  "message": "Welcome admin, you are an admin, here is your flag: THM{a450ae48-7226-4633-a63d-38a625368669}"
}

5. The Development Mistake

開発者が JWT に exp を入れ忘れるか、意図的に無期限にしてしまったこと。
ほとんどのライブラリは exp がなければ有効と判断してしまうため、攻撃者が盗んだら「永遠に使える」危険なトークンとなる。


6. The Fix(修正方法)

JWT 発行時に必ず exp を設定します:

lifetime = datetime.datetime.now() + datetime.timedelta(minutes=5)

payload = {
    'username' : username,
    'admin' : 0,
    'exp' : lifetime
}

access_token = jwt.encode(payload, self.secret, algorithm="HS256")

これによりライブラリ側が期限チェックを自動的に行い、期限切れトークンを拒否するようになります。


まとめ

JWT の有効期限に関する重要ポイントは以下のとおり:

  1. exp がなければ JWT は“永遠に使える”危険なトークンになる
  2. JWT はサーバ側で削除できないため、exp の設計を間違えると重大事故につながる
  3. 漏えい対策として、短いAccess Token + Refresh Token が推奨
  4. JWT の詐取=アカウント乗っ取り。
    exp がなければ「永続セッション」として悪用される。
  5. セキュリティ設計の原則:
    “短めの exp を必ず設定すること”

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?