web-dev-qa-db-ja.com

ユーザー認証情報をJWTに保存しても問題ありませんか

JWTにユーザー資格情報(ユーザー名/パスワード)を保存しても問題ありませんか(後でsign itとverify結果のトークン)

聞いた それ

いいえ、JWTでパスワードを送信することは安全ではありません。これは、JWTクレームが単純にエンコードされ、それを見た人なら誰でも簡単にデコードできるためです。ユーザーに返される機密情報をJWTに保存することは安全ではありません

しかし、なぜJWT Webサイト 推奨 を認証目的で使用するのかはわかりません:

いつJSON Webトークンを使用する必要がありますか?

JSON Webトークンが役立つシナリオをいくつか以下に示します。

認証:これは、JWTを使用するための最も一般的なシナリオです。ユーザーがログインすると、後続の各リクエストにはJWTが含まれ、ユーザーはそのトークンで許可されているルート、サービス、リソースにアクセスできます。シングルサインオンは、オーバーヘッドが小さく、さまざまなドメイン間で簡単に使用できるため、現在JWTを広く使用している機能です。

12
FrozenHeart

JWTは認証の結果です。例えば

  1. ユーザーは自分の資格情報(ユーザー名/パスワードなど)を認証サービスに送信します。それは、モノリス内の1つまたは1つのサードパーティ、または認証専用の独自のマイクロサービスである可能性があります。
  2. サービスはユーザー名とパスワードを検証します。認証が成功した場合は、ユーザーがすでに認証されていることを表すJWTを返します。このJWTには、機密情報のないペイロードが含まれている可能性があります(ここにパスワードを保存しないでください)。
  3. ユーザーは、JWTを使用してサービスビジネスに別の要求を送信します。 JWTの有効期限が切れておらず、破損していない場合(標識はまだ有効です)、サービスはそのJWTを信頼できます。たぶん、このタスクは承認サービスに委任されるでしょう。

JWTトークンの内部には何がありますか?

まあ、最も単純なJWTには、JWTを使用したリクエストを受信したときにサインが破損していないかどうかを確認できるサインに関する情報(私はセキュリティの専門家ではないため、ここでは詳しく入力できません)が含まれています。

この情報はデジタル署名されているため、検証および信頼できます

その上、JWTではペイロードを送信できます。

より正式には、JWTは以下によって構成されます。

  • ヘッダー:トークンのタイプ+使用されているハッシュアルゴリズム
  • ペイロード:クレームは、エンティティ(通常はユーザー)および追加のメタデータに関するステートメントです。
  • 署名:署名は、JWTの送信者が本人であることを確認し、メッセージが途中で変更されていないことを確認するために使用されます。

たとえば、資格情報username:passwordがgabriel:giussiである認証サービスにリクエストを送信すると、この資格情報が確認され、問題がなければ次のJWTが作成されます。 enter image description here

次に、すべてのリクエストで、ユーザー名を含むエンコードされたJWTとサービスが

  • JWTサインが有効な場合は、承認(Gabrielに許可されていること)を実行します。
  • JWTの有効期限が切れている場合は、再度ログインするように要求します
  • サインが壊れている場合、認証エラーを返します。
13
gabrielgiussi

Jwtは、APIが使用するトークンを格納するためにのみ使用してください。トークンはログインが成功した後に生成され、APIに送信されたすべてのリクエストに添付できます。すべてのリクエストは、トークンが有効な場合にのみ続行する必要があります。