はじめに
アクセストークンによる認証方式の一つである「JWT(JSON Web Token)」の仕組みについて整理する。
JWTの基本
JWTは次の3つの部分で構成されている。
<ヘッダー>.<ペイロード>.<署名>
それぞれの役割は以下の通り。
- ヘッダー:アルゴリズム情報(例:HS256など)
- ペイロード:ユーザーIDなどの認証情報
- 署名:改ざんされていないことを検証するための指紋のようなもの
サーバーはトークンの何を検証しているのか?
クライアントはサーバーから受け取ったJWTを、以後のリクエストに添えて送る。
サーバー側で @jwt_required()
のような仕組みを使うと、以下の流れでトークンを検証する。
- トークンを
ヘッダー.ペイロード
と署名
に分解する - サーバーが持つ秘密鍵(
SECRET_KEY
)を使って、ヘッダーとペイロードを元に署名を再計算する - トークン内の署名と、サーバー側で再計算した署名が一致するかを比較する
一致すれば「改ざんされていない=サーバーが過去に発行したもの」と見なされる。
改ざんはどう検出されるのか?
仮にユーザーがトークン内の user_id
を書き換えて不正にアクセスしようとした場合、ペイロード
が変更されたため、サーバーが再計算する署名とトークンに含まれている署名が一致しなくなる。結果としてトークンは無効と判断され、アクセスは拒否される。
この仕組みによって、JWTは「内容を保持しつつ、改ざんを防ぐ」ことができている。
サーバーは状態を持たない
JWTの特徴は「ステートレス」なこと。サーバーはセッション情報を保持する必要がなく、毎回トークンの署名を検証するだけで認証処理が完結する。そのため、サーバーのスケーラビリティが高く、大規模サービスにも向いている。
注意点
- JWTの内容はBase64エンコードされているだけで暗号化されていないため、機密情報を入れるべきではない
- トークンが漏洩すれば第三者が不正アクセスできるため、有効期限やリフレッシュトークンと組み合わせた対策が必要
まとめ
JWTは「署名」という仕組みを通じて、ユーザー情報が改ざんされていないことを保証する。サーバーは毎回トークンを受け取り、内部の署名を検証することで、改ざんされていないことを確認している。
この仕組みによって、セッションを持たずに安全かつ効率的な認証処理が可能になっている。