web-dev-qa-db-ja.com

JWTによるリプレイ攻撃の防止

私は現在、Webおよびモバイルアプリで使用されるRESTful APIを構築しています。 APIへの認証は JSON Web Tokens を使用して行われます。

JWTを使用する場合、expクレームを使用して、特定の時間後にトークンを期限切れにすることができます。これをjtiクレームと組み合わせることで、リプレイ攻撃や、アプリに組み込まれる攻撃を防ぐのに役立ちます。ただし、ユーザーの便宜のために、リクエストごとに、または30分程度の短い間隔でログインするようユーザーに要求し続けるのは望ましくありません。

それで、私は次の状況を考えています:

  • ユーザーはメールアドレスとパスワードを使用してログインします
  • サーバーは1時間で期限切れのJWTを送り返します
  • クライアントはAPIに別のリクエストを行い、ヘッダーにJWTを渡します
  • JWTが有効な場合、APIは要求されたデータとanotherJWTを送り返します。これは1時間で期限切れになります

クライアントが割り当てられた1時間の有効期限内にそれ以上の要求を行わない場合、後続の要求は再度ログインするように要求します。

私の質問:これは、ユーザビリティとリプレイ攻撃の防止との間のトレードオフである最良のソリューションですか?

5
BenM

懸念を分離する必要があると思います。クライアント側でのJWTの保護は、APIではなく、JWTを使用するアプリケーションの仕事です。この線がぼやけている場合は、アプリケーションをリエンジニアリングする必要がある可能性があるため、サービス駆動ではなく、モノリシックになる可能性があります。

JTI、EXP、IATは、攻撃を受けた場合に攻撃を軽減するためのツールを提供するように設計されています。 TLSは、送信中のJWTのスヌーピングを防ぐために使用されます。 EXPのウィンドウを短くすると、単一のトークンの表示が制限されますが、最終的にアプリケーションを介してトークンを取得した場合、EXPはミュートになり、次のトークンを取得します。

3
Shane Andrie