トークン攻撃と堅牢化
認証フローを悪用から守ります。
「トークン攻撃と堅牢化」はCoddyKit上の無料Cyber Security Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCyber Security Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cyber Security Academyコースには全4レッスンが含まれています。
認証情報としてのトークン
現代の認証では、トークンは認証情報です。有効なベアラートークンを持つ者は、トークンが期限切れになるか失効するまで、認証済みの本人として扱われます。
- そのため、トークンの窃取は認証情報の窃取と同じ意味を持ちます。
- 堅牢化では、トークンの有効期間を制限し、トークンを所持者に紐付け、迅速な失効を可能にすることが重要です。
このレッスンでは、OAuth/OIDC/SAMLトークンに対する攻撃と、それに対抗する防御策を扱います。
JWTアルゴリズムの混同
典型的なJWT攻撃では、algヘッダーが悪用されます。
- alg: noneが受け入れられると、攻撃者は署名のないトークンを偽造できます。
- RS256からHS256への混同では、攻撃者が公開RSA鍵をHMACの秘密鍵として使ってトークンに再署名します。
防御策は、サーバー側で想定するアルゴリズムを固定し、トークンによって検証処理の経路を決めさせないことです。
Vulnerable: verify(token, key) // alg taken from header
Hardened: verify(token, key, { algorithms: ["RS256"] })
// reject alg:none, reject HS* when RS* expectedXSSとログによるトークン窃取
最も一般的なトークン侵害は、有効なトークンをそのまま窃取することです。
- XSSは
localStorageやメモリからトークンを読み取ります。 - URL内のトークンは、ブラウザー履歴、リファラー ヘッダー、サーバーログを通じて漏えいします。
Authorizationヘッダーを詳細なログに記録することも原因になります。
ブラウザーのセッションにはhttpOnly、Secure、SameSite属性付きCookieを優先し、ログやURLからトークンを除去してください。
Set-Cookie: session=...; HttpOnly; Secure; SameSite=Lax
// keeps JS (and thus XSS) from reading the tokenリプレイ攻撃
リプレイ攻撃とは、取得した有効なトークンを再利用して被害者として行動する攻撃です。
- 短い有効期限、使い捨ての
nonce(OIDC)、アサーションIDの追跡(SAML)によって緩和できます。 - TLSはネットワーク上での受動的な傍受を防ぎます。
- 送信者制約付きトークンは、窃取された場合でも再利用を阻止します。
Replay defenses:
short exp + nonce/jti uniqueness
TLS everywhere
sender-constrained tokens (mTLS / DPoP)送信者制約付きトークン
ベアラートークンは、所持している誰でも使用できます。送信者制約付きトークンは、特定のクライアント鍵にトークンを紐付けます。
- mTLSバインドトークン(RFC 8705)は、トークンをクライアントのTLS証明書に結び付けます。
- DPoP(RFC 9449)は、クライアントがリクエストごとに署名するProof-of-Possession鍵にトークンを結び付けます。
これにより、対応する秘密鍵がなければ、窃取されたトークンは役に立たなくなります。
DPoP: each request carries a signed proof JWT
DPoP: <proof-jwt signed with client private key>
Authorization: DPoP <access_token>短い有効期間とリフレッシュローテーション
窃取されたトークンが使える期間を制限してください。
- アクセストークンの有効期間を短く(数分に)保ちます。
- リフレッシュトークンローテーションを使用します。リフレッシュのたびに新しいリフレッシュトークンを発行し、古いトークンを無効化します。
- ローテーション済みリフレッシュトークンの再利用を窃取の兆候として検出し、チェーン全体を失効させます。
On /token refresh:
issue new RT, invalidate old RT
if old RT presented again -> breach -> revoke familyトークンの失効とイントロスペクション
自己完結型JWTは有効期限まで有効であるため、失効が難しくなります。アクセスを迅速に遮断する仕組みを用意してください。
- 失効エンドポイント(RFC 7009)は、リフレッシュトークンとアクセストークンを無効化します。
- イントロスペクション(RFC 7662)を使うと、リソースサーバーはリアルタイムでトークンの状態を確認できます。
- 重要な失効処理には、
jtiを使った拒否リストを維持します。
POST /introspect token=...
-> { "active": true, "sub": "...", "scope": "read" }
POST /revoke token=...AudienceとScopeの適用
有効なトークンだからといって、あなたのAPIで自動的に認可されるわけではありません。トークンの意図を適用してください。
- audを確認し、別のサービス向けに発行されたトークンがあなたのサービスでリプレイされないようにします。
- エンドポイントごとにscopeを適用し、有効なトークンが完全なアクセス権を意味するとは考えないでください。
- issを検証し、信頼できない発行者のトークンを拒否します。
これにより、サービス間でのトークン再利用や混乱した代理人(confused deputy)の悪用を防げます。
ミックスアップ攻撃とプロバイダー間攻撃
クライアントが複数のアイデンティティプロバイダーに対応している場合、ミックスアップ攻撃によって、あるIdPが発行したコードやトークンを、攻撃者が選んだ別のエンドポイントに送信させられる可能性があります。
- クライアントは、レスポンスがどのASから来たものかを追跡できなくなります。
- 防御策として、
issパラメータ(RFC 9207)を使ってレスポンスを発行者に紐付け、プロバイダーごとにstateを検証します。
/authorize ... &state=<provider-bound>
callback must include &iss=<expected-AS>
client verifies iss matches the AS it started with安全な保管と転送
トークンをどこでどのように保管するかによって、漏えいリスクが決まります。
- ブラウザーセッションでは、httpOnly、Secure、SameSite属性付きCookieを使用し、
localStorageは避けます。 - モバイルではOSのキーチェーンまたはキーストアを使用し、平文ファイルには決して保存しません。
- サーバーではシークレットマネージャーを使用し、保存時に暗号化するとともに、最小権限を適用します。
- 転送中は常にTLSを使用し、クエリ文字列にトークンを埋め込まないでください。
トークン堅牢化チェックリスト
防御策を運用上のベースラインとしてまとめます。
- アルゴリズムを固定し、
alg: noneやアルゴリズム混同攻撃を拒否します。 - iss、aud、exp、署名、nonce/stateを検証します。
- アクセストークンのTTLを短くし、再利用検出付きのリフレッシュローテーションを使用します。
- 価値の高いAPIには、送信者制約付きトークン(DPoP/mTLS)を優先します。
- 失効とイントロスペクションに対応します。
- 安全に保管し、トークンをURLやログに残さないでください。
Hardening baseline:
[ ] alg pinned, none rejected
[ ] iss/aud/exp/sig/nonce validated
[ ] short TTL + RT rotation + reuse detection
[ ] DPoP/mTLS for sensitive scopes
[ ] revoke + introspect availableクイックチェック:窃取されたトークンを無効化する
トークン窃取そのものによる被害を最も効果的に制限する防御策を選択してください。
まとめ:トークン攻撃と堅牢化
重要なポイント:
- トークンは認証情報であり、窃取されるとアカウントが乗っ取られます。
- JWTは、アルゴリズムを固定し、iss、aud、exp、署名、nonceを検証して防御します。
- 短い有効期間と再利用検出付きのリフレッシュローテーションによって、露出を制限します。
- 送信者制約付きトークン(DPoP/mTLS)によって、窃取されたベアラートークンを無効化できます。
- 失効とイントロスペクションを提供し、トークンをURL、ログ、localStorageに残さないでください。
よくある質問
「トークン攻撃と堅牢化」レッスンは無料ですか?
はい。「トークン攻撃と堅牢化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cyber Security Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cyber Security Academyコースには全4レッスンが含まれています。
「トークン攻撃と堅牢化」で何を学びますか?
認証フローを悪用から守ります。 ブラウザで直接実行するハンズオンコードでCyber Security Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cyber Security Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCyber Security Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「トークン攻撃と堅牢化」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCyber Security Academyレッスンでコードを書いて実行できますか?
はい。すべてのCyber Security Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。