【Python初心者セキュリティの高いWebアプリケーションでは、ユーザーの認証や一時的な操作を許可するために「トークン」というものがよく使われます。この記事では、Pythonで安全なトークンを作る方法と、そのときに気をつけるべきポイントを自分なりにまとめておきます。
トークンとは?
トークンとは、一時的な認証・識別に使う「使い捨ての鍵」のような文字列です。
たとえば次のような用途があります:
- パスワード再設定URLに含めて本人確認
- アカウント有効化のための一時リンク
- APIアクセス用の一時キー
- セッション情報の識別子(セッショントークン)
Pythonで使えるトークン生成関数
Pythonの secrets
モジュールには、安全なトークンを生成する関数がいくつかあります。
secrets.token_bytes(n)
**nバイトのランダムなバイナリデータ(bytes)**を生成します。
import secrets
token = secrets.token_bytes(16)
print(token)
実行例:
b'\x87\xdc\x1aT\xed\x9b\x10\x90\xea\xd0\xb6\x84\x8d\xe1\xf3\x0f'
バイナリデータそのままなので、URLに使いたい場合は適した形式に変換する必要があります。
secrets.token_hex(n)
16進数(hex)形式の文字列としてトークンを返します。token_bytes()
の結果を16進数文字列に変換したものと同じです。
import secrets
token = secrets.token_hex(16)
print(token)
実行例:
ab7d0a5c0f48ec3f64a9c65a9a9f7b38
メールなどでURLに載せるのにも向いています。
secrets.token_urlsafe(n)
URLにそのまま使える文字だけを使って、安全なトークンを生成します。Base64形式に近いですが、+
や /
のようなURLに使えない文字は含まれません。
import secrets
token = secrets.token_urlsafe(16)
print(token)
実行例:
7NiVu-MAKo8j0PUAW47oHg
パスワードリセットリンクや招待リンクのような用途に最適です。
トークンの長さの目安
セキュリティを保つためには、トークンはある程度の長さが必要です。
以下は目安です:
バイト数 | 特徴 | 実際の長さ(token_hex) |
---|---|---|
8バイト | 簡易的・短期用途に | 16文字 |
16バイト | 標準的なセキュリティ | 32文字 |
32バイト | 高セキュリティ用途 | 64文字 |
トークンを使うときの注意点
トークンを生成するだけでなく、使い方にも注意が必要です。
1. 推測されにくいものを使うこと
→ secrets
を使えばOK。random
はNGです(予測可能なので危険)。
2. 有効期限を設けること
→ たとえば発行から「1時間以内しか使えない」ようにしておくと安全性が上がります。
3. 一度きりしか使えないようにすること
→ 同じトークンを複数回使われると不正アクセスのリスクが高まります。
4. HTTPSを使って送受信すること
→ トークンが通信中に盗まれないように、必ず暗号化された通信で扱う必要があります。
おわりに
この記事では、安全なトークンの作り方や、secrets
モジュールの便利な関数についてまとめました。
トークンはただの文字列ですが、セキュリティに深く関わる重要な情報です。
今後の学習でも、トークンの生成だけでなくどう安全に取り扱うかを意識していきたいと思います。