Share
Embed
Transcript
55 slides
-
1. ブラウザストレージについて 2. Alive Studio のブラウザストレージ活⽤について a. OBS 内での動作 b.
localStorage+イベントでの同期 3. 注意点 a. セキュリティ b. イベントハンドラの氾濫と抽象化 c. 型安全性 4. まとめ ⽬次 3 ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 -
Browser storage ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 ・localStorage ・Session storage ・indexedDB ・Cookies ・Cache storage
・その他 (標準化されていない 各Browserが独自に持つstorageなど) -
Browser storage ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 Web storage ・localStorage ・Session storage ・indexedDB ・Cookies
・Cache storage ・その他 (標準化されていない 各Browserが独自に持つstorageなど) -
localStorage ・ブラウザに key/value形式でデータを永続的に保存 できる仕組み。 ・保存容量は Cookie より大きい(ブラウザによって数MB〜10MB程度) ・ブラウザを閉じてもデータは残る(ユーザーが削除するかブラウザのストレージをクリアしない限り保 持)。 ・同一オリジン
(同じスキーム(https)、ホスト名(hoge.com)、ポート(:431))で共有される ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage -
Session storage ・ブラウザに key/value形式でデータを一時的に保存 できる仕組み。 ・保存容量は Cookie より大きい(ブラウザによって数MB〜10MB程度) ・ページセッションの寿命が尽きると消える(タブやウィンドウを閉じると削除)。 ・タブ/ウィンドウごとに独立。
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage -
IndexedDB ・ブラウザに 構造化データを保存 できるデータベース。 ・オブジェクトストアと呼ばれる仕組みで、オブジェクトやファイル、バイナリデータまで保存可能。 ・容量は localStorage より大きい(数百MB〜数GBまでブラウザ依存)。 ・データはユーザーが削除しない限り保持される(ブラウザを閉じても残る)。 ・同一オリジンで共有。
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API -
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 localStorageのイベントについて ・localStorageのイベントは、同じタブでは発火しない https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event TabA TabB storageEventを期待し ているコンポーネント
storageEventを期待し ているコンポーネント localstorageに対して更新を行うコ ンポーネント 👁 👁 localStorage -
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 localStorageのイベントについて ・localStorageのイベントは、同じタブでは発火しない https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event TabA TabB storageEventを期待し ているコンポーネント
storageEventを期待し ているコンポーネント localstorageに対して更新を行うコ ンポーネント write 👁 👁 localStorage -
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 localStorageのイベントについて ・localStorageのイベントは、同じタブでは発火しない https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event TabA TabB storageEventを期待し ているコンポーネント
storageEventを期待し ているコンポーネント localstorageに対して更新を行うコ ンポーネント write 👁 👁 piyoKey:hoge piyoKey:fuga localStorage -
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 localStorageのイベントについて ・localStorageのイベントは、同じタブでは発火しない https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event TabA TabB storageEventを期待し ているコンポーネント
storageEventを期待し ているコンポーネント localstorageに対して更新を行うコ ンポーネント write 👁 👁 event event localStorage -
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 localStorageのイベントについて ・localStorageのイベントは、同じタブでは発火しない https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event TabA TabB storageEventを期待し ているコンポーネント
storageEventを期待し ているコンポーネント localstorageに対して更新を行うコ ンポーネント write 👁 👁 event event localStorage -
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 1.セキュリティ ・localStorage は任意のスクリプトから参照可能 → XSS による情報漏洩のリスク ・localStorage の値はユーザー側で改変可能 →
データの完全性を保証できないリスク https://raxis.com/blog/dangers-of-storing-sensitive-data-in-web-storage/ https://www.rdegges.com/2018/please-stop-using-local-storage/ -
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 1.セキュリティ https://raxis.com/blog/dangers-of-storing-sensitive-data-in-web-storage/ ・localStorage は任意のスクリプトから参照可能 → XSS による情報漏洩のリスク ・localStorage の値はユーザー側で改変可能
→ データの完全性を保証できないリスク そもそも機密性の高いデータは localStorage に保存しない。 「消えても問題ない情報」「漏洩しても問題ない情報」のみ保存するようにする。 ⭐サーバー側で使用するときは保存された localStorageの値は基本「信用しない」。 サーバー側で検証/認証を行う。 -
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 2.イベントハンドラの増殖 ・図(例) 各コンポーネントからの 依存をHooksに集約し、Hooksで呼び出すlocalStorageへの依存を外部から注入 す ることでテストが可能になり、 eventの受け取りも単純化 localStorage component
A component B component C Hooks Utility Utility(mock) DI DI event →テストが書ける -
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 3.型安全性 ・localStorage の値は すべて string 型 ・ユーザーが自由に値を変更可能(先述) ・localStorage の値は
すべて string 型 → 型の保証がない ・ユーザーが自由に値を変更可能(先述) → 期待する構造・型で取り出せる保証がない -
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 3.型安全性 ・localStorage の値は すべて string 型 → 型の保証がない ・ユーザーが自由に値を変更可能(先述)
→ 期待する構造・型で取り出せる保証がない parse + validation を組み合わせて型安全に -
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 まとめ localStorage と storage イベントを組み合わせると、クロスタブ間でリアクティブな同期ができる ・しかし利用には セキュリティ・型安全性・保守性 に注意が必要 localStorage
の利用指針 ・機密性の高い情報は保存しない ・保存するのは「消えても困らない」「漏洩しても困らない」情報だけ ・サーバー側で扱う時には検証/認証 実装上 ・イベントハンドラの増殖 → 抽象化・依存性を外から注入することでテストを書く ・型安全性 → Zod 等で 安全にparse + validate