どのようにあなたのアプリケーションでJWTを処理するには?


この質問はインターネット上の敏感な科目です.どこで見ても、人々は本当に独断的である傾向があります.
-ローカルストレージに保存しないでください!!!あなたはXSS攻撃を知らないのですか?
- httponly cookieにJWTを格納するのが安全であると信じるのを止めてください.あなたはまだXSRF攻撃にさらされています.
あなたはアイデアを得る.
長い話短い、私は自分自身の堅牢な認証システムを構築するための情報を探していた.私は上で引用された攻撃について何も知りませんでした、そしてもちろん、私のアプリケーションを保護する方法.
私は、私が学んだことを要約するために最善を尽くします.そして、異なるテクニックと彼らのフォールバックです.この記事は、できるだけ意見を自由にしようとします.
それ以上の道なしで、飛び込みましょう.

何が問題ですか。


免責事項:私は意図的にJWTは、セキュリティ部に焦点を当てるものを飛ぶでしょう.あなたは彼らの専用websiteの情報を見つけることができます.
一つだから.
あなたが新しいウェブサイトを構築していると仮定しましょう.いくつかの研究の後、あなたは、JWT(JSONウェブトークン)を使用していることを知っています.
JWTは基本的にいくつかの基本的な情報(必要に応じて)を含むエンコードされた文字列です.お客様のサーバーは、ログインプロセスを行うときにそれを送信し、クライアントがサーバーに受け入れられるために認証が必要な任意のさらなる要求に供給する必要があります.
要するに、JWTはあなたのサーバーに向かって合法的で認証されたものとしてあなたのユーザーを特定する方法です.
…認証を必要とするどんな更なる要求にもJWTを供給する必要があるならば、どこで我々はそれを破りますか?
これは物事が面白くなるところです.

ローカルストレージ


私の最初のアイデアは、私が信じている多くの人々のように、ブラウザのローカルストレージに新しく得られたJWTを保存することでした.物事は以下のようになります.
localStorage.setItem('jwt', jwtYouReceive);
そして、必要なときはいつでも
localStorage.getItem('jwt');
我々のJWTを保存する最も簡単な方法をbeignしているにもかかわらず、これは、これまで、最も安全な方法であることがわかります.
自然によって、localstorageの範囲内で記憶されるすべては、JavaScriptコードを通じてアクセス可能である.それは、どうにかハッカーが我々のウェブサイトで若干のJSコードを実行することができるならば、彼がJWTを盗むことができて、彼の要求のどれでも認証されたユーザーとして受け入れられるということを意味します.そうする方法はXSS攻撃を通してです.

XSS攻撃


クロスサイトスクリプティング
基本的に、いくつかの望ましくないコードがあなたのウェブサイトの中で実行されているとき、XSS攻撃は起こります.これはコンソールと同じくらい穏やかです.ログ、しかし、情報を盗むとして我々のJWTまで行くことができる.
それをよりよく理解するために、非常に工夫された例を取りましょう.

かなり簡単、右?今ここでキャッチされますが、フォームを介して送信されているものは、消毒されていない(データの任意の無担保または無関係の部分が削除されたりエスケープされていることを意味します)ので、ハッカーは有害なスクリプトを挿入することができます.
<div>
    I juste created an amazing blog post !! 
    <script>functionToReadYourJWTandSendItToMe()</script> 
    Please, accept it !
</div>
これはデータベースに挿入され、管理者がページのプレビューを見るためにページが開いているとき、スクリプトは隠れて実行されます.
そして、管理者がブログ・ポストを受け入れて、それがウェブサイトホームページで表示されるならば、スクリプトはページを開くすべての訪問客のために実行されます..誰でもJWTを盗むこと!
以下は要約です.

XSSに対する適切な防御なしでLocalStorageでJWTを保存することは劇的でありえます、そして、これは違反を見つけるためにあなたのウェブサイトの上ですべての行動の潜在的な大きな領域でハッカーを去りました.
開発者は現在、すべての可能な違反をチェックし、新しい機能を開発するときに留意する応答性を持っている.
XSSには、そのようなデータベースに行くすべてのサニタイジングに我々のアプリを確保する方法があります.
簡単に実装するが、多少危険なソリューションです.
二次解

httponlyクッキー


LocalStorageに関する情報を見つけるためにさらに掘り下げている間、私はJWTをHTTPOnlyクッキーに保存することを勧めている多くの人々を見ました.あなたがクッキーが何であるかについて自信がないならば、MDNドキュメンテーションに行くのを自由に感じてください.
httpOnly部が最も重要なものであることに留意してください.httponly属性のないクッキーはいくつかのJSコードによって読まれることができました.
属性を適用することによって、HTTPリクエストのためにこのクッキーの使用を制限します.
しかし我々は、現在XSRF攻撃を起こしやすいです.

XSRF攻撃


クロスサイトリクエスト偽造
名前が意味するかもしれないように、この攻撃の目標は、目標とされたウェブサイトで実行される悪意のあるウェブサイトに要求を作成することです.現実の世界の例をよく理解しましょう.
あなたのウェブサイトを開いているし、ログインしている.JWTはHTTPOnlyクッキーに確実に格納されます.そして、あなたがサーバーに送るすべての要求がクッキーを自動的に含むので、あなたのJWTを意味します.
ユーザーアカウントを持つすべてのアプリケーションとして、フォームを埋めることによっていくつかの情報を変更する可能性があります.これはあなたのサーバにリクエストを送ります.
あなたはそれに移動すると、メールを受信しました.新しいタブを開き、メールを開き、リンクをクリックします.
☠️ ページを開くとすぐに実行されるスクリプトがあります.事前に準備、それはあなたのウェブサイト上で要求を実行します.☠️
どうやって?さて、ハッカーはアカウントを作成し、devのツールを開いて、サーバーにエンドポイントがあったのを見ました.
基本的に、ハッカーはあなたがしたように同じ要求を送ります、しかし、彼は情報を管理します.あなたのユーザー名が変更されている、あなたのプロフィール写真aswell ..たぶんあなたのパスワード.
この攻撃に関する最も驚くべき部分は、ハッカーがJWTを回復する必要がないということです.
このような攻撃からあなたのウェブサイトを確保する方法があります.XSS
三番目の解決.

メモリに格納する


多分LocalStorageより単純な解決でさえ、ゴールはかなり単純です.JWTを変数に指定し、必要に応じて使用できます.
const jwt = ...;
この変数はハッカーのためにXSSまたはXSRF攻撃から到達することは不可能です.
つの深刻な欠点としてこのような単純なソリューション:あなたのユーザーがあなたのウェブサイトを閉じるたびに、彼は戻ってくる次の時間、彼は再びログインする必要があります、非常に貧しいユーザー体験を作成します.
他の解決策と同様に、ダウンサイドを緩和する方法があります.

蘇生トークンを持つ


あなたが最初のJWTを要求するとき、計画は余分なトークン(RefreshRankトークントークン)を得ることです.このトークンは、データベース内のサーバーと同様、httponly cookie内のブラウザに保存されます.彼の目標は、彼があなたのJWT期限を毎回ログインプロセスを通過することなく、ユーザーのログインを維持することですこのようなプロセスは、サイレントリフレッシュと呼ばれています.
実際には、この動作を使用して、ユーザセッションの永続化を前提にします.RefreshRankトークンは、クッキーの中に格納されるように、我々はセッション間でそれを使用することができます.私たちのウェブサイトが起動すると、特定のエンドポイントへの呼び出しをトリガーします.
- RefreshRankトークンがJWTであるなら、これはどのように安全ですか?
RefreshRankトークンだけを使用し、彼に専用されている特定のエンドポイントで受け入れられます.残りのAPIにアクセスしようとすると失敗します.
しかし、ハッカーはXSRFを使うことができましたね.
はい、しかし、彼は返されるJWTを見ることができません.
この方法は、多くのボイラー板とオーバーヘッドにつながります.

ラッピング


上記の解決策のどれも弾丸証明です、常に、華麗な攻撃者が入る方法です.いくつかの解決策は実装が簡単ですが、いくつかの設定が必要ですが、おそらくより良い全体的な“保護”を提供します.
どんなスーツを選んでください.
私は、あなたが私がこれを書いたのと同じくらいこの非常に濃い話題を理解するのを助けたことを望みます.
あなたはOthrys websiteの上でオリジナルの記事を見つけることができます、そして、あなたは私にこの記事について議論するためにここで私にタグを付けることができます.