Hello there, ('ω')ノ
そもそもトークン認証とは?
簡単に言うと:
- サーバー側ではなく、ユーザー側が「鍵」を持つ方式
- その「鍵」がトークン(JWTがその一種)
この鍵が破られたり、改ざんされたりすると不正ログインにつながります。
JWTの中身:見るべき構造
JWTは3つの部分でできています:
ヘッダー.ペイロード.署名
① ヘッダー:使う暗号方式の情報
② ペイロード:ユーザー名や有効期限
③ 署名:改ざん防止用のチェック
ブラウザの開発者ツールやプロキシツールを使うと簡単に中身を観察できます。 文字列が長くても、オンラインのJWTデコーダー(jwt.ioなど)で分解できます。
チェックポイント① トークンの改ざん耐性
JWTをデコードしてペイロードを見る:
- user: admin
- exp: 2025-12-31
user=admin → ほかのIDに変えて再署名なしで送信してみる → サーバーが受け付けてしまう場合、署名検証が甘い証拠!
ヘッダー部分に“alg: none”になっていないか確認 → 暗号方式なし=非常に危険
チェックポイント② 秘密鍵の漏えいリスク
JWTの署名を検証するための「秘密鍵」が外部に漏れていないか:
- GitHubや公開資料にハードコードされていないか確認
- トークン発行元URLが安全なHTTPSか?
- 固定値で発行されるトークンがないか? → ログインするたびに値が変わるべき
チェックポイント③ 有効期限と取り消し機構
exp(有効期限)が極端に長すぎないか? 例:1年や無期限など
一度発行したトークンを無効化できる仕組みがあるか? 例:ログアウト時にサーバー側で無効化処理が走るか
社内システムでの簡単な確認手順例
① ログイン → 開発者ツールでリクエストヘッダーを確認
② Authorization: Bearer トークンが見えるか?
③ そのトークンをコピーしてjwt.ioなどで中身をチェック
④ userやroleの値を変えて再送信してみる(安全な環境で)
⑤ 有効期限とヘッダー設定をメモ
まとめ:トークン認証・JWTの脆弱性を見つけるための観察ポイント
- JWTの署名がきちんと検証されているか?
- alg: none やヘッダー設定が適切か?
- 有効期限やトークン管理ポリシーは安全か?
Best regards, (^^ゞ