web-dev-qa-db-ja.com

JWT&OAuth2-サーバーはトークンを保存しますか? &どのように安全/ハッカー安全ですか?

セキュリティ、認証戦略に関しては、私は完全な初心者です。だから私は「トークンベースの認証」についてのこの記事を読んでいました: https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication

2つの質問があります:

  1. 仲介者(またはハッカー)がクライアントから送信されたトークンを確認できず、それを使用してそのクライアント/人になりすましてリソースを取得できない理由がわかりません。その意味で、JSON Web Token/OAuth2ベースの認証がより安全になる理由は何ですか?毎回1回限りのトークンを使用する場合、ハッカーがトークンを読み取っても、別のリクエストに使用することはできないことを理解しています。しかし、トークンは有効期限が切れるまで同じままなので、それはどのようにしてより安全な認証戦略ですか?

  2. サーバーは、クライアントから送信されたトークンが有効であること、つまり、サーバーがログイン中にクライアントと交換したトークンをどのように認識しますか。サーバーは、データベースまたはどこかに生成されたトークンを保存し、「最終アクセスタイムスタンプ」などを更新し続け、last_accessed_timeが1時間以上前のトークンを削除し続け、1時間の非アクティブ状態の後に期限切れを続けますか?

22
user1102532

仲介者(またはハッカー)がクライアントから送信されたトークンを確認できず、同じものを使用してそのクライアント/人になりすましてリソースを取得できない理由がわかりません。

JWTは、man-in-the-middle(MITM)攻撃からユーザーを保護しません。攻撃者が有効なトークンを取得した場合、効果的になりすますことができます。コンテンツが暗号化されている場合でも。

JWTは、MITMを回避するためにSSL/TLS接続で使用する必要があります

その意味で、JSON Web Token/OAuth2ベースの認証がより安全になる理由は何ですか?

JWTはトークン形式であり、oauth2はプロトコルです。 oauth2はjwtを使用できます。 Oauth2は、資格情報がユーザーからメインサイトにのみ送信されるため、サードパーティサイトを使用するユーザーにとってより安全です。その後、サイトは、サードパーティサイトがユーザーを認証するために使用できるトークンを発行します。サードパーティのサイトにユーザーの資格情報が表示されることはありません

しかし、トークンは有効期限が切れるまで同じままなので、それはどのようにしてより安全な認証戦略ですか?

上記参照。トークンが盗まれないように保護する必要があります:主にHTTPSを使用するか、その影響を軽減します:HttpOnlyを使用してCookieに保存し(クライアント側でJWTコンテンツにアクセスする必要がない場合)、有効期限を短く設定し、トークンをローテーションします...

サーバーは、クライアントから送信されたトークンが有効であること、つまり、サーバーがログイン中にクライアントと交換したトークンをどのように認識しますか。

hhhh.pppp.ssssのようなJWTの3番目の部分は署名です。署名は、ヘッダーとペイロード(hhhh.pppp)に対してサーバー秘密鍵を使用して実行され、コンテンツを保護します。攻撃者がコンテンツまたは署名を変更した場合、サーバーはそれを検出して署名を検証し、認証を拒否します。

サーバーは、データベースまたはどこかに生成されたトークンを保存し、「最終アクセスタイムスタンプ」などを更新し続け、last_accessed_timeが1時間以上前のトークンを削除し続け、1時間の非アクティブ状態の後に期限切れを続けますか?

必要ありません。署名はトークン自体(ssss)にパックされているため、JWTは自己完結型であると言われています

サーバーには、暗号化秘密鍵または公開鍵と秘密鍵のペアがあります。トークンは、秘密鍵(HMAC対称鍵の場合)で署名および検証されるか、秘密鍵で署名され、対応する公開鍵(RSA非対称鍵の場合)で検証されます。

29
pedrofb

トークンを暗号化するのではなく、トークンに署名することがすべてです。サーバーは署名を検証するだけで、JWTは暗号化されません(実装しない限り)。デフォルトでは暗号化されていないため、機密データをトークンに保存しないでください。

1
Amir Sasson