😽

オタクくん「ギャル先輩、セキュリティトークンについて教えてください!」

2024/06/03に公開

セキュリティトークンとは?

オタクくん「ギャル先輩、セキュリティトークンについて教えてください!」

ギャル先輩「またまた難しいこと聞いてくるじゃん?でもまぁ、教えてあげるよ。セキュリティトークンってのは、認証や認可のために使われるデジタルな鍵みたいなものなの。」

オタクくん「デジタルな鍵?もう少し詳しく教えてください。」

ギャル先輩「OK。トークンには色々な種類があるけど、代表的なのはJWT(JSON Web Token)ね。JWTは、ユーザーの情報を含んだトークンで、サーバーとクライアントの間で安全にデータをやり取りするために使われるの。」

JWTの構造

オタクくん「JWTの構造ってどんな感じですか?」

ギャル先輩「JWTは3つの部分で構成されてるの。ヘッダー、ペイロード、シグネチャー。この3つをドット(.)で区切って1つの文字列にしたものがJWTよ。」

オタクくん「具体的にどういう風に?」

ギャル先輩「じゃあ、具体的な例を見せるね。」

{
  "header": {
    "alg": "HS256",
    "typ": "JWT"
  },
  "payload": {
    "sub": "1234567890",
    "name": "John Doe",
    "admin": true
  },
  "signature": "SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}

ギャル先輩「こんな感じで、ヘッダーには署名のアルゴリズムとトークンのタイプ、ペイロードにはユーザー情報やカスタムクレーム、シグネチャーには秘密鍵を使ってヘッダーとペイロードをハッシュ化したものが入ってるの。」

オタクくん「ふむふむ、なるほど!」

JWTの使い方

オタクくん「実際にJWTを使って認証を行うにはどうしたらいいですか?」

ギャル先輩「まずは、ユーザーがログインするとサーバー側でJWTを発行するの。そのトークンをクライアントに渡して、次回以降のリクエストにそのトークンをヘッダーに含めて送る感じね。」

オタクくん「なるほど、コードで示してもらえますか?」

ギャル先輩「もちろん、Pythonで簡単な例を見せるね。」

import jwt
import datetime

# 秘密鍵
SECRET_KEY = 'my_secret_key'

# トークンの生成
def create_token(data):
    payload = {
        'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1),  # 有効期限
        'iat': datetime.datetime.utcnow(),  # 発行時間
        'sub': data  # ユーザー情報
    }
    return jwt.encode(payload, SECRET_KEY, algorithm='HS256')

# トークンのデコード
def decode_token(token):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
        return payload['sub']
    except jwt.ExpiredSignatureError:
        return 'Token has expired'
    except jwt.InvalidTokenError:
        return 'Invalid token'

# トークンの生成とデコードの例
user_data = {'id': 123, 'name': 'otaku_kun'}
token = create_token(user_data)
print(f'Generated Token: {token}')

decoded_data = decode_token(token)
print(f'Decoded Data: {decoded_data}')

オタクくん「これでトークンを生成して、検証できるんですね!」

ギャル先輩「そうそう。これでセキュリティトークンを使った認証ができるようになるわけ。」

セキュリティトークンの利点

オタクくん「セキュリティトークンを使う利点って何ですか?」

ギャル先輩「まず、ステートレスに認証を管理できるってこと。サーバー側でセッションを持たないからスケーラビリティが高いの。そして、トークン自体に情報を持たせられるから、リクエストごとにデータベースを参照する必要がないの。」

オタクくん「確かに、それは便利ですね!」

オタクくん「ギャル先輩、セキュリティトークンについてよくわかりました。ありがとうございます!」

ギャル先輩「わかったならいいけど、次回はもっと難しい質問持ってこないでよwww」

オタクくん「わかりました。でも、ギャル先輩に教えてもらうとすごくわかりやすいです!」

ギャル先輩「ふふ、そう言われると悪い気はしないけどwww」

Discussion