JWTとセッションセキュリティ
🔥 Vibe プロンプト
「JWTを監査:デコード、alg=none攻撃の確認、弱いHMAC鍵のブルートフォース。」
import jwt, json, base64
token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYWRtaW4iLCJyb2xlIjoidXNlciJ9.sig"
header_b64, payload_b64, _ = token.split(".")
def b64_decode(s):
s += "=" * (4 - len(s) % 4)
return json.loads(base64.urlsafe_b64decode(s))
print(f"ヘッダー: {b64_decode(header_b64)}")
print(f"ペイロード: {b64_decode(payload_b64)}")
# alg=none攻撃
none_token = "eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4ifQ."
try:
decoded = jwt.decode(none_token, options={"verify_signature": False})
print(f"alg=none攻撃成功: {decoded}")
except:
print("alg=none拒否 (良好)")
JWTセキュリティチェックリスト
| 問題 | リスク | 対策 | |-----|-------|------| | alg=none | 重大 | noneを拒否 | | 弱い秘密鍵 | 高 | 256ビットランダム | | 期限なし | 中 | expクレーム追加 |
セッションセキュリティ
session["user_id"] = user.id
session.permanent = True
app.permanent_session_lifetime = timedelta(hours=2)
# ログイン後に再生成
session.clear() # セッション固定化防止
session["user_id"] = user.id
重要なポイント
- コアコンセプトをしっかり理解する
- ハンズオンコード例で実践する
- 実世界の問題に応用する
- 演習で知識を強化する
さらに学ぶ
- 公式ドキュメント
- GitHubのオープンソースプロジェクト
- コミュニティフォーラムとディスカッション
- 関連コースとチュートリアル