2017-05-01 16 views
1

イム、 しかし..私は本当にそれが1時間トークンになりたい...その使用一度..だから、サーバーが新しいトークンを生成し、クライアントがあります次の要求/呼び出し中にそのトークンを使用する。JWTと1回のトークン?私自身のJWTトークン認証を「ローリング」の過程で

しかし、JWTは「無国籍」となっていると私は理解しています。 しかし、ワンタイムトークンのアプローチでは、どうにかして有効なトークンを "保存"する必要があります。トークンは一度使用されるとリフレッシュされるからです。 またはサーバー上の値を保存しないように、まだ「1時間」-tokensを作成することができるようにとにかくはありますか? 私は任意の値を格納したいいけない理由のための2つの主な理由は、第二に、すべてのスケーラビリティ(必ず私は値を格納する間にキャッシュサーバを持つことができます..しかし、それは必要なことがwouldntの場合、それはいいだろう)。..の最初のものです。 JWTは...

任意のアイデア私の理解..私はトークンを検証できるようにするには、サーバー上の値を格納する必要がある場合それはwouldntのからステートレスことになっていますか。?

+0

あなたはそれが一度だけである必要があるのはなぜ? 2回目にトークンを使用するとどうなりますか? –

+0

私たちがすべてのエンドポイントに使用するトークンを1つだけ生成すれば、データベース内のレコードを削除するためのエンドポイントがあるとしましょう。次に、そのトークンを保持できる人ONCEは複数の削除要求を作成し、多くの損害を引き起こす可能性があります。しかし、もしトークンが一度しか使用できないならば、被害は少なくとも制限されます。しかし、私は誤解されるかもしれません。 – Inx51

+0

解決策は存在しますが、あなたのビジネスに依存します。 –

答えて

0

それが満了していないと署名が正しいことを、一般の人々は、人々がログアウトしている通常のものですブラックリストにトークンのDBを維持する場合は本当にありません、JWTのトークンが有効でないなど

私が考えることができる賢明な方法は、それらに短い有効期限を与え、すでに使用されているトークンのリストを維持することです。その後、DBから期限切れになるトークンを定期的に削除します。

実際にレコードにTTLを持つDB(dyanmoDB、mongodb)があるので、トークンを入れるだけで、トークンの有効期限が切れるとttlを設定します。

+0

ああ、ええ、私はすでに使用されているトークンをブラックリストに載せることについていくつか読んでいます。それはそれを行う一つの方法かもしれません..しかし、これは不可能に近いことは分かっていますが、トークンをdb(任意の種類)の必要なしで使用できます..トークンを「ステートレス」として扱うには? – Inx51

+0

私は個人的に別の方法を考えることができません、なぜDBを避けようとしていますか?トークンに短い有効期限を設定すると、DBがそれほど大きくならないredis/TTLを使うことができますか? –

+0

トランザクションの状態を整える必要があります。つまり、トークンABCが使用されたようなものです。それをより軽く保つ場合は、jwtで 'nonce'を使用し、dbの' nonce'に対してその状態を格納することができるので、トークン全体を格納する必要はありません。いずれにしても、dbサイズに関心がある場合は、dbから古いデータを削除するには、ttlまたはバッチジョブを使用する必要があります。 –

0

ソリューションはもちろん、存在します。任意の分散システムと同様に

(あなたがスケーラビリティを述べた)あなたは、可用性と一貫性の間で選択する必要があります。

  1. 可用性を選択します。この場合、すべてのエンドポイント間で最終的に一貫した方法で複製するすでに使用されているトークンのリストを維持することができます。例えば、トークンが使用されるとき、それぞれのエンドポイントはそのトークンをバックグラウンド内の他のエンドポイントに送る。しかし、そのトークンがそのエンドポイントが更新されるまで別のエンドポイントによって2回目に使用されることができる(短い)時間枠がある。

  2. 一貫性を選択します(トークンを何度も使用することはできません)。この場合、すでに使用されているトークンを含む中央データベースを使用し、アクションを実行する必要があるたびにそのデータベースをチェックします。スケーラビリティ?トークンにシャーディングを使用し、トークンサブセットを担当するnのデータベースを持つことができます。

どのようなソリューションが最適かは、お客様のビジネスによって異なります。

+0

はい、今のところ、トークンをRedisキャッシュに格納するという考え方です。しかし、どのくらいのパフォーマンスオーバーヘッドが追加されるのかわからないので、dbを使用することを避けることができれば、それは甘いだろう。しかし、それは難しいかもしれないと思う。パフォーマンスのヒットは目立たないかもしれないので、これを複雑にしていますが、私が決定する前にすべての解決策を検討する必要があると考えています。 – Inx51

0

任意のDB保存せずに一回JWTトークンを持つことの可能な方法:

https://www.jbspeakr.cc/howto-single-use-jwt/

+0

さらに良いアプローチ:https://security.stackexchange.com/questions/153746/ one-time-jwt-token-with-jwt-id-claim –

関連する問題