webページを更新した場合にストアを維持する方法
let store = new Vuex.Store( {
modules: {
demo, auth
},
strict: true
} );
let router = new VueRouter( {
mode: 'history',
saveScrollPosition: true,
routes: routes
} )
履歴モードを使用していますが、Webページをリロードすると、ストアが空になります。解決策はありますか?
アプリの更新後に状態データを保持するには、localStorage
またはsessionStorage
を使用できます。
XSS:トークンをlocalStorage
に保存する際の問題は、アプリがXSS(クロスサイトスクリプティング)攻撃に対して脆弱であることです。それは別として、それは非常に安全です。 localStorage
はドメインにバインドされているため、Cookieとは異なり、ブラウザーを閉じた後でもwww.yourapp.com
のデータはそのまま残ります。リクエストを行ったサイトを管理する必要はありません。同じドメインのブラウザのすべてのタブは、localStorage
のデータを使用できます
上記の動作が必要ない場合は、sessionStorage
を使用できます。動作はほぼ同じですが、ブラウザーを閉じるとデータが消去されます。
Cookieを取得する場合は、XSSによって奪われるトークンの保存に役立つことを確認してください。ただし、CSRF(Cross Site Request Forgery)攻撃から保護するために、csrf-token
も提供する必要があります。
今後Cookieを使用する予定がある場合は、ヘッダーのhttpOnly
フラグがtrueに設定されていることを確認してください。
全体的に見て、localStorageは、トークンやその他のアプリデータを維持するための非常に一般的に推奨されるソリューションであることがわかりました。
参考のために、この回答にソースを追加します。
ステートレス(=セッションレス)認証を使用する場合に必要なCSRFトークン? 受け入れられた回答なども確認してください。
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage
https://www.whitehatsec.com/blog/web-storage-security/ これにより、localStorageの使用に関する落とし穴とハウツーがわかります。
ページを更新すると(F5)アプリを再実行しているので、データでストアを初期化しない限り、アプリの起動時と同じように空になります。
この場合に保持する状態を決定し、それらをCookie/LocalStorageに保存してから、app.js
それらをcookie/LocalStorageからストアにロードします。ページが更新された場合にユーザーをログインさせておきたいので、認証トークンなどの一般的な方法です。トークンの保存に関するStormpathからのいい投稿: https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage
ルート間を移動しているときにVuexストアとアプリ全体がリロードされている場合-アプリケーションに問題があり、VueRouterナビゲーションを適切に使用していない可能性があります。
状態をsessionStorage
にキャッシュできます。これは、ページ(タブ)の更新イベントが発生しても存続しますが、ページまたはブラウザーが閉じられると消去されます。