JWT の有効期限を確認することは「安全な認証を維持するための最重要ステップ」です
読者のみなさんが Web API や業務システムを開発する際、 JWT(JSON Web Token)の 有効期限(exp)を正しく確認することは必須のセキュリティ要件です。
JWT はステートレスであるため、 一度発行したトークンをサーバー側で無効化することができません。 そのため、有効期限を正しく扱うことが安全性の中心になります。
ここでは、初心者でも理解できるように ステップバイステップで思考しながら、 実務で使える C# の JWT 有効期限確認ユーティリティを丁寧に解説します。
JWT の有効期限(exp)とは何か
exp(Expiration Time)
JWT のペイロードに含まれる標準クレームで、 「このトークンはいつまで有効か」を示します。
例(JWT のペイロード):
{
"userId": "123",
"exp": 1723456789
}
exp は UNIX 時間(UTC) で表されます。
有効期限が重要な理由
- トークンが盗まれても被害を最小化できる
- 長期間使われるトークンは危険
- セッション管理の代わりになる
JWT の有効期限を確認する方法
Step 1:JWT をデコードする
署名検証を行わずに中身を確認することもできますが、 実務では必ず署名検証とセットで行います。
Step 2:exp クレームを取り出す
JWT のペイロードから exp を取得します。
Step 3:現在時刻と比較する
exp < 現在時刻(UTC)なら期限切れです。
実務で使える JWT 有効期限確認ユーティリティ(テンプレート)
using System;
using System.IdentityModel.Tokens.Jwt;
public static class JwtExpirationChecker
{
public static bool IsExpired(string token)
{
var handler = new JwtSecurityTokenHandler();
var jwt = handler.ReadJwtToken(token);
var exp = jwt.Payload.Exp;
if (exp == null)
throw new Exception("exp クレームが存在しません");
// exp は UNIX 時間(秒)
var expDate = DateTimeOffset.FromUnixTimeSeconds(long.Parse(exp.ToString())).UtcDateTime;
return expDate < DateTime.UtcNow;
}
public static DateTime GetExpiration(string token)
{
var handler = new JwtSecurityTokenHandler();
var jwt = handler.ReadJwtToken(token);
var exp = jwt.Payload.Exp;
if (exp == null)
throw new Exception("exp クレームが存在しません");
return DateTimeOffset.FromUnixTimeSeconds(long.Parse(exp.ToString())).UtcDateTime;
}
}
C#有効期限確認の使い方(実務コード例)
string token = "受け取ったJWTトークン";
bool expired = JwtExpirationChecker.IsExpired(token);
if (expired)
{
Console.WriteLine("JWT は期限切れです");
}
else
{
DateTime exp = JwtExpirationChecker.GetExpiration(token);
Console.WriteLine($"JWT の有効期限: {exp}");
}
C#有効期限を深掘りする(重要ポイント)
有効期限は短くするべき理由
JWT はステートレスであるため、 一度発行した JWT をサーバー側で無効化できません。
そのため、有効期限を短くすることが重要です。
推奨値:
- 通常の API 認証:15〜30 分
- 高セキュリティ環境:5〜10 分
- リフレッシュトークン:数時間〜数日
Clock Skew(時刻のズレ)に注意
サーバーの時刻がずれていると、 有効期限判定が誤ることがあります。
.NET の TokenValidationParameters では デフォルトで 5 分の猶予が設定されています。
JWT の有効期限確認で絶対にやってはいけないこと
- exp を確認せずにトークンを受け入れる
- exp をクライアント側だけで確認する
- exp を長期間に設定する(数日〜数週間)
- exp をログに出力する
- exp を無効化するためにトークンを書き換える
これらはすべて重大なセキュリティ事故につながります。
実務的ベストプラクティス
- exp は必ず確認する
- exp は短く設定する
- リフレッシュトークンを併用する
- 署名検証と exp チェックを同時に行う
- HTTPS を必ず使う
- トークンをログに出力しない
まとめ:JWT の有効期限確認は「安全な認証の中心」
JWT の有効期限確認の本質は次の 3 つです。
- exp を正しく読み取る
- 現在時刻と比較する
- 有効期限を短く設定する
これらを守ることで、 攻撃者がトークンを盗んだり悪用したりするのを極端に難しくできます。
読者のみなさんが業務システムを開発する際、 このユーティリティを使うだけでセキュリティレベルが大幅に向上し、 ユーザーの安全を確実に守ることができます。
