リフレッシュ・トークンをクライアントのどこに保存すればよいですか?
質問
私のSPAアプリケーションは、次のようなアーキテクチャを使用しています ( ソース ):
これは、私のクライアントアプリケーションがリフレッシュトークンを知っていると仮定しています。なぜなら、ユーザー認証情報(例:Eメール/パスワード)が存在しない場合、新しいアクセストークンを要求する必要があるからです。
私の質問です。 クライアント側アプリケーションのどこにリフレッシュトークンを格納すればよいのでしょうか。 SOでこのトピックに関する多くの質問/回答がありますが、リフレッシュトークンに関する回答は明確ではありません。
アクセストークンとリフレッシュトークンは、ローカル/セッションストレージに格納されるべきではありません。したがって、私は
アクセストークン
を
httpOnly
クッキーでアクセス・トークンを生成し(CSRFがあるにもかかわらず)、とにかくリソース・サーバへのリクエストのほとんどでそれを必要とします。
しかし、リフレッシュトークンについてはどうでしょうか?
しかし、リフレッシュ トークンはどうでしょうか なぜなら、(1)リソースサーバへのすべてのリクエストで送信され、CSRFにも脆弱になり、(2)同一の攻撃ベクトルでアクセス/リフレッシュの両方のトークンを送信することになるからです。
私が考えることができる3つのソリューションがあります。
1) メモリ内の JavaScript 変数にリフレッシュ トークンを保存する。これは 2 つの欠点があります。
- a) XSS に対して脆弱である (ただし、ローカル/セッション ストレージほど明白ではないかもしれない)。
- b) ユーザーがブラウザのタブを閉じると、quot;session" が失われる。
特に後者の欠点は、悪い UX になってしまうでしょう。
2) アクセストークンをセッションストレージに格納し、それを
Bearer access_token
認可ヘッダーでリソースサーバーに送信します。そうすると
httpOnly
クッキーをリフレッシュ・トークンのために使うことができます。これには、私が考えることができる1つの欠点があります。
- a) リフレッシュ トークンは、リソース サーバーに行われるすべてのリクエストで CSRF にさらされます。
3) トークンを両方とも
httpOnly
クッキーに格納します。これは、両方のトークンが同じ攻撃ベクトルにさらされるという前述の欠点があります。
もしかしたら他の方法があるかもしれませんし、私が述べた欠点以上のものがあるかもしれません(教えてください)。
クライアント側で私のリフレッシュ トークンをどこに保存するか。
? それは
httpOnly
クッキーなのか、それともメモリ内のJS変数なのでしょうか?前者であれば、アクセストークンをどこに置けばいいのでしょうか?
このトピックに精通している人々から、これを行うための最良の方法についての手がかりを得ることができれば、超嬉しいです。
どのように解決するのですか?
暗号化されたトークンを安全に保存するには
HttpOnly
クッキーに格納することができます。
https://medium.com/@sadnub/simple-and-secure-api-authentication-for-spas-e46bcea592ad
Refresh Tokenの寿命が気になる場合。保存を省略し、一切使用しないことも可能です。Access Tokenをメモリ上に保持し、Access Tokenの有効期限が切れた時点でサイレントサインインを行えばよいのです。
使用しない
Implicit
のフローは 廃止 .
SPA の認証で最も安全な方法は PKCEによる認証コード .
一般的には、既存のライブラリをベースにした oidc-client をベースにした既存のライブラリを使用するのが良いでしょう。
関連
-
[解決済み] JWT(JSONウェブトークン)の有効期限を自動的に延長する機能
-
[解決済み] なぜCSRF防止トークンをクッキーに入れるのが一般的なのですか?
-
[解決済み】node.jsのユーザー認証ライブラリは?
-
[解決済み】OAuth2.メリットとユースケース - なぜ?
-
[解決済み】OAuth 2の暗黙のグラント承認タイプの目的は何ですか?
-
[解決済み] トークン認証とCookieの比較
-
[解決済み] リソースサーバーのOAuth 2.0アクセストークンを検証する方法とは?
-
[解決済み】セッションは本当にRESTfulnessに違反するのか?
-
[解決済み] OpenIDプロバイダーのURLの一覧はどこにありますか?[クローズド]
-
[解決済み] SVN ユーザー名変更
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] GET] "/users/sign_out" に一致するルートはありません。
-
[解決済み] OpenIDとOAuthの違いは何ですか?
-
[解決済み】node.jsのユーザー認証ライブラリは?
-
[解決済み】JWTが盗まれたらどうする?
-
[解決済み] Refresh Token "の目的は何ですか?
-
[解決済み] Socket.IO 認証
-
[解決済み] REST API トークンによる認証
-
[解決済み] SAMLとOAuthによる連携ログインの比較
-
[解決済み] FacebookはOpenIDのプロバイダですか?
-
外部ソース(ExcelやWordなど...)からリンクをクリックすると、Cookieが認識されないのはなぜですか?