【セキュリティ対策|実務向け】【実務解説】システム開発における「認証有効期限」の設計と実装の勘所

導入: なぜ認証有効期限を正しく実装すべきか

システム開発において、認証情報のライフサイクル管理はセキュリティの根幹です。IPAの認証制度においても有効期限が設定されているのと同様、私たちが開発するWebアプリケーションやAPIにおいても、トークンやセッションの有効期限を適切に制御することは「不正アクセスのリスク低減」と「万が一の漏洩時の被害最小化」という重要な課題を解決します。期限設定がない、あるいは長すぎる認証は、攻撃者に十分な猶予を与えてしまうことになります。

基礎知識: 認証有効期限とは

認証有効期限とは、発行された認証情報(セッションIDやJWTなどのアクセストークン)が「有効であると認められる期間」のことです。期限が過ぎた認証情報はシステムから拒否される必要があります。
特に現代のWeb開発で一般的なJWT(JSON Web Token)では、Payload部分に「exp(Expiration Time)」というクレームを含めることで、トークン自体に期限を持たせます。これを確認することで、サーバーはデータベースへの問い合わせなしに、トークンの有効性を即座に判断できます。

実装/解決策: 有効期限付きトークンの発行と検証

実装において重要なのは「短寿命のアクセストークン」と「長寿命のリフレッシュトークン」を使い分ける戦略です。アクセストークンの有効期限は短く(例:15分~1時間)、期限切れ時にリフレッシュトークンを使って新しいアクセストークンを再発行する仕組みを構築します。これにより、トークンが盗まれた際の影響範囲を最小限に抑えつつ、ユーザーの利便性を維持できます。

サンプルプログラム: PythonによるJWT有効期限の実装例

以下は、PyJWTライブラリを使用して、有効期限付きのトークンを発行・検証する基本的なコードです。

import jwt
import datetime

秘密鍵(実際には環境変数などで管理してください)
SECRET_KEY = “your-secret-key”

def create_token(user_id):
# 現在時刻から1時間後の有効期限を設定
payload = {
“user_id”: user_id,
“exp”: datetime.datetime.utcnow() + datetime.timedelta(hours=1)
}
# トークンの生成
token = jwt.encode(payload, SECRET_KEY, algorithm=”HS256″)
return token

def verify_token(token):
try:
# トークンの検証(期限切れの場合はjwt.ExpiredSignatureErrorが発生)
payload = jwt.decode(token, SECRET_KEY, algorithms=[“HS256”])
return payload
except jwt.ExpiredSignatureError:
return “エラー: トークンの有効期限が切れています”
except jwt.InvalidTokenError:
return “エラー: 無効なトークンです”

使用例
token = create_token(“user123″)
print(f”発行されたトークン: {token}”)
print(f”検証結果: {verify_token(token)}”)

応用・注意点: 現場で陥りやすいバグと回避策

1. 時刻同期のズレに注意: サーバー間の時刻がわずかにズレているだけで、トークンが即座に拒否されることがあります。許容範囲(Clock Skew)として、検証時に数分程度の猶予を持たせることが一般的です。
2. 即時無効化の仕組み: トークンベースの認証では、有効期限が切れるまでトークンを無効化できないという課題があります。ログアウト時や不正検知時には、ブラックリスト(Redisなど)にトークンIDを保存し、検証ステップで確認するロジックを追加することで、即時無効化を実現してください。
3. 認証製品の期限との整合性: IPAの文書にもある通り、認証製品そのものも期限管理が重要です。自社システムで使用しているライブラリやフレームワークのセキュリティ認証状況も定期的に棚卸しし、EOL(サポート終了)品を使い続けないよう注意しましょう。

コメント

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