私は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がヒットすることを意味します。
または私は間違いますか?
"これは本当にJWTの問題ではありません" ---そうではありませんが、トークンを失い、無効にする簡単な方法はありません。 – zerkms
"リフレッシュトークンを使用し、JWTの寿命が非常に短い" ---失われた場合、誰かが無期限に無期限にリフレッシュすることができます。 "これは数分おきにDBがヒットすることを意味します。" ---あなたはJWTを必要とせず、通常のセッションを使用できます。 – zerkms
@zerkmsまず第一に、トークンを失うことはどうですか? SSLを使用しないと、傍受される可能性があります。しかしそれはクッキーにも当てはまり、ちょうどセッションハイジャックです。しかし、それが起こったとしましょう:リフレッシュトークン戦略では、単一のトークンを簡単に無効にすることができます。そして2番目の議論では、DBを数分おきに打つと、セッションを使うこともできます:私は同意しません。 JWTの利点は、DBのヒットを最小限に抑えることです。そして、すべての数分は、依然としてあらゆる要求よりも優れています。 –