プログラミング上級

上級 認証・認可(JWT / OAuth2)の実務|練習問題編

導入

現代のウェブアプリケーションにおいて、認証と認可は欠かせない要素です。特に、複数のサービス間でのユーザー情報の管理やセキュリティを確保するために、JWT(JSON Web Token)やOAuth2が広く使われています。これらの技術を適切に実装することで、ユーザーの利便性を向上させつつ、安全なシステムを構築することが可能です。本記事では、実務に即したシナリオを通じて、JWTおよびOAuth2の具体的な実装方法と、それに伴う落とし穴について考察します。

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

重要な概念の整理

JWTは、ユーザーの認証情報を安全に転送するためのトークン形式です。OAuth2は、リソースへのアクセスを安全に制御するためのフレームワークです。これらを組み合わせることで、ユーザーが複数のサービスにアクセスする際のセキュリティを強化できます。具体的には、OAuth2を用いてアクセストークンを取得し、そのトークンをJWTとして利用することで、ユーザーのセッション情報を軽量かつ安全に管理できます。

例えば、あるアプリケーションが複数のAPIを呼び出す必要がある場合、各APIに対して独自の認証を行うのではなく、一度の認証で得たJWTを利用して、各APIへのアクセスを簡素化することができます。このような設計により、開発者は複雑な認証処理から解放され、よりビジネスロジックに集中できる環境を構築できます。

コード例(Python)


import jwt
import datetime

# JWTの生成
def create_jwt(user_id):
    secret_key = "your_secret_key"
    expiration = datetime.datetime.utcnow() + datetime.timedelta(hours=1)
    token = jwt.encode({"user_id": user_id, "exp": expiration}, secret_key, algorithm="HS256")
    return token

# JWTの検証
def decode_jwt(token):
    secret_key = "your_secret_key"
    try:
        payload = jwt.decode(token, secret_key, algorithms=["HS256"])
        return payload
    except jwt.ExpiredSignatureError:
        return "Token has expired"
    except jwt.InvalidTokenError:
        return "Invalid token"

コードの行ごとの解説

  1. import jwt: JWTを扱うためのライブラリをインポートします。
  2. import datetime: 日時を扱うためのライブラリをインポートします。
  3. def create_jwt(user_id): JWTを生成する関数を定義します。
  4. secret_key = “your_secret_key”: トークンを署名するための秘密鍵を定義します。
  5. expiration = datetime.datetime.utcnow() + datetime.timedelta(hours=1): トークンの有効期限を設定します。
  6. token = jwt.encode(…): ユーザーIDと有効期限を含むJWTを生成します。
  7. return token: 生成したトークンを返します。
  8. def decode_jwt(token): JWTを検証する関数を定義します。
  9. try: トークンのデコードを試みます。
  10. return payload: デコードしたペイロードを返します。
  11. except: エラー処理を行います。

練習問題編

以下の練習問題に挑戦して、JWTおよびOAuth2の理解を深めましょう。

  1. 問題1: JWTの有効期限を設定する際、どのような点に注意すべきか説明してください。
  2. 問題2: OAuth2のフローの一つを選び、その特徴を説明してください。
  3. 問題3: JWTを利用した認証において、セキュリティ上の懸念点は何か、具体例を挙げて説明してください。
  4. 問題4: アクセストークンが漏洩した場合の対策を述べてください。
  5. 問題5: JWTのペイロードに含めるべきでない情報は何か、理由を説明してください。

まとめ

  • JWTとOAuth2を組み合わせることで、シンプルかつ強力な認証・認可システムを構築できる。
  • トークンの有効期限や秘密鍵の管理は、セキュリティを維持するために重要である。
  • 実務においては、具体的なシナリオを踏まえた設計が不可欠である。