0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python初心者】安全なトークンの作り方と注意点

Posted at

【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 モジュールの便利な関数についてまとめました。
トークンはただの文字列ですが、セキュリティに深く関わる重要な情報です。
今後の学習でも、トークンの生成だけでなくどう安全に取り扱うかを意識していきたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?