web-dev-qa-db-ja.com

SPAの更新トークンが安全でないと見なされるのはなぜですか?

私はAuth0サイトの Refresh Tokens and SPA に関するドキュメントを読んでいましたが、ブラウザに安全に保存できないため、 SPAはRefresh Tokensを使用しないでください と述べています。代わりに、サイレント認証を使用して、新しいアクセストークンを取得します。

シングルページアプリケーション(通常は暗黙的付与を実装)は、いかなる状況でも更新トークンを取得しないでください。その理由は、この情報の機密性です。更新トークンを使用すると、ユーザーは本質的に永久に認証された状態を維持できるため、ユーザー資格情報と考えることができます。したがって、この情報をブラウザに表示することはできません。安全に保管する必要があります。

よくわかりません。私の理解では、新しいアクセストークンを取得する唯一の方法は、Authサーバーに新しいリクエストを送信することと、Auth0セッションCookieのフォームを使用して、ログインしているユーザーを認証することです。セッションCookieを受信すると、Auth0その後、サーバーは新しいアクセストークンを発行できます。

しかし、それはブラウザやローカルストレージに更新トークンを持つこととどう違うのですか?更新トークンよりもセッションCookieの安全性が高いのはなぜですか? SPAでリフレッシュトークンを使用するのが悪いのはなぜですか?

11
Eric B.

更新トークンを使用するため、および/tokenから新しいアクセストークンを取得するには、SPAにクライアントシークレットが必要です。これは、ブラウザーに安全に保存することができません。ただし、 ネイティブアプリRFCのOAuth 2. は、/tokenエンドポイント(パブリッククライアント用)にクライアントシークレットを要求しないことを推奨しているため、SPAでも更新トークンを使用できます。

更新トークンを取得するには、 Auth code grant を使用する必要があります。これにより、リダイレクトURLでコードが渡され、SPAをホストしているサーバーにアクセスします(追加の攻撃ポイントになる可能性があります)。 Implicit Grantは、トークンをブラウザーにのみ配信します(リダイレクトURLのハッシュ部分はサーバーに到達しません)。

更新トークンとSSOセッションCookieの使用の違い-Cookieは HttpOnly とマークされ、JavaScriptコードを使用した攻撃からアクセスできないため、おそらくより安全です。

3
Ján Halaša

良い質問-したがって、ブラウザにトークンを保存する本当に安全な方法はありません(または他の機密情報)-参照 リンクなどこのように 。したがって、シングルページアプリ(SPA)は更新トークンを保存するべきではありません-更新トークンは有効期間が長い(有効期限が長い、または無期限)ため、特に問題があり、盗まれた場合、攻撃者はそれぞれ個別に期限が切れた後もアクセストークンを更新し続けることができます。 。

必要なときに(たとえば、APIを呼び出すために)アクセストークンを取得し、メモリにのみ保存する(それでもXSS/CSRFに対して脆弱)か、または使用するか忘れるかをお勧めします。次に、アクセストークンが必要になったときに、もう一度checkSessionを呼び出します。

あなたの質問-checkSessionrequestはトークンの送信を必要としません。これは文字通り、名前が示すとおり、セッションが存在するかどうかを確認するための承認サーバーに対する「セッションのチェック」です。含まれている場合、承認サーバー応答に新しいアクセストークンが含まれます。 SPAの使用例についてはこちら を参照してください

さらに説明が必要な場合は、この回答の下にコメントを残してください。

3
arcseldon

Cookieと更新トークン、およびOAuth2の両方について、多くの誤解があります。

まず、機密のクライアントだけが更新トークンを使用できるとは限りません。 OAuth2プロトコルは、機密クライアントは認証する必要があるが、機密クライアントを必要としないと述べています。エルゴ、リフレッシュ操作ではクライアント認証はオプションです。 RFC 6749、Section 6、Refreshing an Access Token を参照してください。

第二に、あなたは選択肢が何であるかを理解する必要があります:

  1. ユーザーに5分ごとにユーザー名とパスワードの入力を強制する(アクセストークンの有効期限が切れたときはいつでも)
  2. 長命のアクセストークン
  3. HTTP Cookieによる認証

更新トークンを使用しない世界中の誰もがオプション#3を使用しています。 Cookieを介した認証は、機能的かつセキュリティ面で100%リフレッシュトークンの保存と同等です。もちろん、トークンとCookieの両方で、それらを保存する場所に関するオプションがあります。

a。 HTTPのみ、b。安全(TLS/SSLが必要)およびc。セッション(メモリ内)と永続的(ローカル、ドメインストレージ)

「HTTPのみ」オプションはCookieにのみ適用されるため、トークンよりもCookieを使用することの唯一の利点を表す場合があります。つまりトークンはJavascriptを介して処理されるため、トークンをスクリプトから遠ざけることはできません。つまり、トークンは、それを格納したページのドメインから(またはCORSポリシーで許可されているとおり)、JavaScriptでのみ使用できます。したがって、この問題は誇張される可能性があります。

もちろん、alwaysTLS/SSLを使用して認証Cookieまたはトークンを送信するように注意する必要があります。正直なところ、ほとんどの違反はプライベートな企業ネットワーク内から発生することがわかっているため、エンドツーエンドのTLSはもはや基本的な要件です。

最後に、Cookieまたはトークンが永続的であるか、つまりブラウザを閉じても、デバイスを再起動しても存続する場所に保存されるかどうかは、ユーザビリティとセキュリティのトレードオフに依存します。 -foryourapplication

より高いレベルのセキュリティを必要とするアプリケーションの場合は、すべてをメモリに保持します(つまり、セッションCookie、Javascript変数のトークン)。ただし、それほど多くのセキュリティを必要とせず、本当に数日または数週間のセッション期間が必要なアプリの場合は、それらを保存する必要があります。どちらの方法でも、そのストレージは元のドメインのページとスクリプトにのみアクセスできるため、Cookieとトークンは機能的に同等です。

3
Charlie Reitzel