JWTを使用してREST APIを保護するために、いくつかの資料(この guide およびこの question など)に従って、JWTは次のいずれかに格納できます。 localStorageまたはCookies。私の理解に基づいて:
したがって、上記の前提に基づいて-JWTをCookieに保存するのが最適です。サーバーへのすべてのリクエストで、JWTはCookieから読み取られ、ベアラースキームを使用してAuthorizationヘッダーに追加されます。サーバーは、(CookieからJWTを読み取るのではなく)要求ヘッダーでJWTを検証できます。
私の理解は正しいですか?その場合、上記のアプローチにはセキュリティ上の懸念がありますか?または、実際にlocalStorageを使用するだけで済ませることができますか?
@ pkid169が述べた記事で言及したXSRF Double Submit Cookiesメソッドが好きですが、記事があなたに言っていないことが1つあります。攻撃者ができることは、CSRF Cookie(HttpOnlyではない)を読み取るスクリプトを挿入し、JWT Cookieが自動的に送信されるこのCSRFトークンを使用して、APIエンドポイントの1つにリクエストを送信するためです。
したがって、実際にはあなたはまだXSSの影響を受けやすく、攻撃者がJWTトークンを盗んで後で使用することはできませんが、XSSを使用してユーザーに代わってリクエストを行うことができます。
JWTをlocalStorageに保存するか、XSRFトークンをhttp専用のCookieに保存するかは、どちらもXSSによって簡単に取得できます。HttpOnlyCookieのJWTでも、高度なXSS攻撃によって取得できます。
そのため、Double Submit Cookiesメソッドに加えて、コンテンツのエスケープを含むXSSに対するベストプラクティスに従う必要があります。これは、ブラウザが望まないことをする原因となる実行可能コードを削除することを意味します。通常、これは、JavaScriptが評価される// <![CDATA [タグとHTML属性を削除することを意味します。
タイムリーな Stormpathからの投稿 は、私のポイントをかなり詳しく説明し、私の質問に答えました。
JWTをCookieに保存してから、前述のようにすべてのリクエストでAuthorizationヘッダーにJWTを渡すか、記事で示唆されているように、CSRFを防ぐためにバックエンドに依存します(Angularの場合はxsrfToken
を使用) 。