2016-06-13 10 views
2

私はJWTのシンプルさが好きで、RESTful JSON APIとAngular 2フロントエンドを提供するElixir/Phoenixバックエンドを持っているWebアプリケーションの認証メカニズムを実装するときに使用しました。JWTはユーザー認証の安全なオプションですか?

今日私はthisの記事を偶然見つけました(私はこのウェブサイトとは全く関係ありません)、私は議論したいJWTの使用についていくつかの疑念を抱かせました。主:

  • 、システム全体を停止せずに無効にすることがJWTsの本当の方法はありません。少なくとも彼らが無国籍のときは。
  • これはアクセスを取り消すことができないことを意味し、非常に悪い可能性があります。
  • LocalStorage - JWTは主にフロントエンド側に格納されますが、Session Storageほど安全ではありません。

ローカルストレージは、クッキーとは異なり、すべての単一の要求でデータ ストアの内容を送信しません。 ローカルストレージからデータを取得する唯一の方法は、JavaScriptを使用することです。これは、コンテンツセキュリティポリシーに合格したJavaScript が、 にアクセスしてエクスプロイトできることを意味します。それだけでなく、JavaScriptでも気にせず、 はHTTPS経由でデータを送信するかどうかを追跡します。 JavaScript に関する限り、それはちょうどデータであり、ブラウザは のように他のデータを操作します。

は、私たちのクッキージャーで誰も確実にしないようにしてくれました。ここでは、 を無視しようとしています。それはちょっと後で私に のようです。

これまでのところ、https経由ですべてを処理し、XSS攻撃やCORS攻撃から保護する限り、彼のポイントは有効ではないと思います。私は悪質なJSがサイト上で実行できるかどうかは、これがJWTの問題ではないことを意味します。 JSでは、混在したコンテンツ(httpとhttps)は許可されていません。

すべてのトークンを無効にする:JWTの世代番号変数のようなものを使用してください。環境変数に格納され、すべてのトークンにエンコードされています。これは単純な整数です。すべてのトークンを無効にする場合は、トークンを増やします。次に世代番号が一致するかどうかを確認するメカニズムが必要です。これはDBにヒットする必要はなく、パフォーマンス上の問題ではありません。また、実践的な展開戦略で複数のインスタンスに展開するのは難しいことではありません。

単一のトークンを無効にする:リフレッシュトークンとJWTの非常に短い寿命(2〜3分)を使用します。 JWTのTTLがほぼ終了している場合、ユーザーはリフレッシュトークンを使用して新しいTTLを取得します。これは、数分おきにDBがヒットすることを意味します。

または私は間違いますか?

+0

"これは本当にJWTの問題ではありません" ---そうではありませんが、トークンを失い、無効にする簡単な方法はありません。 – zerkms

+0

"リフレッシュトークンを使用し、JWTの寿命が非常に短い" ---失われた場合、誰かが無期限に無期限にリフレッシュすることができます。 "これは数分おきにDBがヒットすることを意味します。" ---あなたはJWTを必要とせず、通常のセッションを使用できます。 – zerkms

+0

@zerkmsまず第一に、トークンを失うことはどうですか? SSLを使用しないと、傍受される可能性があります。しかしそれはクッキーにも当てはまり、ちょうどセッションハイジャックです。しかし、それが起こったとしましょう:リフレッシュトークン戦略では、単一のトークンを簡単に無効にすることができます。そして2番目の議論では、DBを数分おきに打つと、​​セッションを使うこともできます:私は同意しません。 JWTの利点は、DBのヒットを最小限に抑えることです。そして、すべての数分は、依然としてあらゆる要求よりも優れています。 –

答えて

4

LocalStorage - JWTは主にフロントエンド側に格納されていますが、 はセッションストレージほど安全ではありません。

は、必ずいずれかのXSSの脆弱性によって盗まれているそれらのリスクを軽減するであろう、HttpOnly cookies以内にあなたのJWTsを格納することができます。ちょうどあなたの環境に住んでいる可能性がJWT 世代-number変数、のようなものを使用します。すべてのトークンを無効にするなど、安全なフラグ、HSTSを、

-

もちろん、他のすべての通常のベストプラクティスが適用されます 個の変数があり、トークンごとにコード化されています。

はい、これを行うことも、新しい秘密を完全に生成することもできます。使用リフレッシュトークンとJWT (数分)のための非常に短い寿命:単一のトークンを無効にするための

。 JWTのTTLがほぼ終了している場合、ユーザ はリフレッシュトークンで新しいTTLを取得します。これは、毎分 カップルのDBヒットを意味します。

これは、従来のサーバーサイドのセッション状態メカニズムを使用して、再フォーマットトークンを使用することを意味していますか?これは有効なアプローチのようです。セキュアなアルゴリズム(SHA-2 - saltは不要)でセッショントークンがサーバーサイドでハッシュされていることを確認してください。

唯一の難しい部分は、クライアントからサーバーへのクロック同期です。クライアントを短期間で期限切れにすると、小さな時計の違いによってクライアントが混乱する可能性があり、時間通りに更新トークンを要求しません。これは物事をより複雑にし、複雑さはセキュリティの主要な敵です。

トークンがすぐに期限切れになる場合は、従来のサーバーサイドのセッション管理メカニズムを使用する方が効果的です。

関連する問題