プログラミング上級

上級 認証・認可(JWT / OAuth2)の実務|解説編

導入

現代のウェブアプリケーションにおいて、認証と認可は不可欠な要素です。特に、複数のサービスが連携するマイクロサービスアーキテクチャにおいては、JWT(JSON Web Token)やOAuth2の理解が求められます。これらの技術は、ユーザーの認証情報を安全に管理し、アクセス制御を実現するための強力な手段です。本稿では、実務における具体的なシチュエーションを通じて、これらの技術の適用方法を探ります。

教科書レベルの解説(アーキテクチャ / 実務設計)

重要な概念の整理

JWTは、ユーザー情報を含むトークンであり、サーバー間での情報交換を効率化します。一方、OAuth2は、リソースへのアクセスを第三者に委譲するためのフレームワークです。この二つの技術を組み合わせることで、セキュアでスケーラブルな認証・認可システムを構築できます。

具体的なシチュエーションとして、ユーザーが異なるマイクロサービスにアクセスする際の認証フローを考えます。ユーザーがログインすると、認証サーバーがJWTを発行し、クライアントはこのトークンを利用して各マイクロサービスにアクセスします。

コード例(Python)


import jwt
import datetime

# 秘密鍵
SECRET_KEY = 'your_secret_key'

# JWTの生成
def create_jwt(user_id):
    payload = {
        'user_id': user_id,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)
    }
    return jwt.encode(payload, SECRET_KEY, algorithm='HS256')

# JWTの検証
def verify_jwt(token):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
        return payload['user_id']
    except jwt.ExpiredSignatureError:
        return None
    except jwt.InvalidTokenError:
        return None

コードの行ごとの解説

  1. 秘密鍵を定義します。この鍵は、JWTを生成および検証するために必要です。
  2. create_jwt関数では、ユーザーIDとトークンの有効期限を含むペイロードを作成し、JWTを生成します。
  3. verify_jwt関数では、受け取ったトークンを検証し、有効な場合はユーザーIDを返します。
  4. トークンが期限切れまたは無効な場合、Noneを返すことでエラー処理を行います。

解説編

JWTを利用する際の落とし穴として、トークンの有効期限管理があります。長すぎる有効期限はセキュリティリスクを高め、一方で短すぎるとユーザー体験を損なう可能性があります。一般的には、短期間のトークンとリフレッシュトークンを組み合わせることで、セキュリティと利便性のバランスを取ることが推奨されます。また、OAuth2を利用する場合、スコープの設定に注意が必要です。過剰な権限を与えると、悪用されるリスクが高まります。

まとめ

  • JWTは、ユーザー情報を安全に管理するための効果的な手段です。
  • OAuth2は、リソースへのアクセスを制御するためのフレームワークであり、適切なスコープ設定が重要です。
  • トークンの有効期限管理や権限設定に注意を払い、セキュリティを確保することが求められます。