OAuth2.0とJWTによる認証システムの実装
現代のWebアプリでは認証にOAuth2.0やJWTを組み合わせて使うのが一般的です。 セッションベースの認証と比べてステートレスなため、スケールしやすい利点があります。
JWTの構造
JWTは「ヘッダー.ペイロード.署名」の3パートをBase64でエンコードした文字列です。
# デコードするとこのような内容
Header: { "alg": "HS256", "typ": "JWT" }
Payload: { "sub": "user:123", "name": "田中太郎", "exp": 1717200000 }
Signature: HMACSHA256(base64(header) + "." + base64(payload), secret)
JWT発行(Python例)
import jwt
from datetime import datetime, timedelta
SECRET = "your-256-bit-secret"
def create_token(user_id: int) -> str:
payload = {
"sub": str(user_id),
"exp": datetime.utcnow() + timedelta(hours=1),
"iat": datetime.utcnow(),
}
return jwt.encode(payload, SECRET, algorithm="HS256")
JWT検証
def verify_token(token: str) -> dict:
try:
return jwt.decode(token, SECRET, algorithms=["HS256"])
except jwt.ExpiredSignatureError:
raise Exception("トークンの有効期限が切れています")
except jwt.InvalidTokenError:
raise Exception("無効なトークンです")
リフレッシュトークン戦略
アクセストークンは短命(15〜60分)、リフレッシュトークンは長命(7〜30日)に設定します。 リフレッシュトークンはDBで管理し、失効・ローテーションを実装します。
セキュリティ上の注意点
- JWTはHTTPOnly Cookieに保存(XSS対策)
- アルゴリズムは
noneを許可しない - 秘密鍵は環境変数で管理し、コードに埋め込まない
- ペイロードに機密情報は入れない(Base64デコード可能)
まとめ
JWTは便利ですが、トークン失効の仕組みが複雑になりがちです。 セキュリティ要件に応じてセッション認証との使い分けを検討してください。