C# Tips | セキュリティ:JWTの有効期限を確認する

C# C#
スポンサーリンク
スポンサーリンク

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 を正しく読み取る
  • 現在時刻と比較する
  • 有効期限を短く設定する

これらを守ることで、 攻撃者がトークンを盗んだり悪用したりするのを極端に難しくできます。

読者のみなさんが業務システムを開発する際、 このユーティリティを使うだけでセキュリティレベルが大幅に向上し、 ユーザーの安全を確実に守ることができます。

タイトルとURLをコピーしました