Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ブラウザストレージを活用した、複数アプリをまたぐ永続化とリアクティブな同期
Search
永田哲平
September 21, 2025
1
72
ブラウザストレージを活用した、複数アプリをまたぐ永続化とリアクティブな同期
永田哲平
September 21, 2025
Tweet
Share
More Decks by 永田哲平
See All by 永田哲平
Claude Code VS Gemini CLI Let’s 競技Vibe Coding
teppei0717
1
200
「Devin!!! まだお前の口からまだ聞いてねェ!!! 『生きたい』と言えェ!!!!!!」
teppei0717
0
40
VibeCodingで 加速する開発と支援
teppei0717
0
810
あなたの配信ワイワイたりていますか?? 配信を盛り上げるAI「waiwai-ai」を作った話
teppei0717
0
310
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Agile that works and the tools we love
rasmusluckow
330
21k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.6k
The Language of Interfaces
destraynor
162
25k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
Statistics for Hackers
jakevdp
799
220k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.9k
Fireside Chat
paigeccino
39
3.6k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
Transcript
1 ブラウザストレージを活⽤した、 複数アプリをまたぐ永続化とリアクティブな同期 てつを。(@tetsuwo0717)
2 ⾃⼰紹介 GMOペパボ株式会社 事業開発部 Alive Projectチーム てつを。 ‧出⾝地/勤務地:⿅児島⛰ ‧X:@tetsuwo0717
1. ブラウザストレージについて 2. Alive Studio のブラウザストレージ活⽤について a. OBS 内での動作 b.
localStorage+イベントでの同期 3. 注意点 a. セキュリティ b. イベントハンドラの氾濫と抽象化 c. 型安全性 4. まとめ ⽬次 3 ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期
4 ブラウザストレージについて
ブラウザストレージを活⽤した、 複数アプリをまたぐ永続化と リアクティブな同期
Browser storage ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 ブラウザに内蔵されているデータを保存する仕組み。 ・localStorage ・Session storage ・indexedDB ・Cookies ・Cache
storage ・その他
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
12 Alive Studio の localStorage活⽤について
Alive Studio ・Vtuberを始めとするライブ配信者向けの配信画面デザインツール。 ・OBS上で動く → OBS・・・配信者がオンライン配信や録画を行うためのソフト ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 配信画面 Alive Studio
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 どうやっているの…?
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 OBSには配信画面にブラウザ(CEF)を表示する機能がある
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 OBSには配信画面にブラウザを表示する機能がある →配信画面上でブラウザを表示したい時に便利 https://www.youtube.com/@cleha_blood
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 AliveStudioのセットアップ時に追加される「ソース」も 全てブラウザ
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 画像を表示するだけのアプリ
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 画像を表示するだけのアプリ
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 背景を透過することで、まるで素材を追加したかのように見える
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 ?
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 これもブラウザ
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 これもブラウザ
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 OBSのプラグインを作っているんですね〜!
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 OBSのプラグインを作っているんですね〜! Webアプリを表示しているだけ
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 ブラウザ内のドキュメント間の同期について
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 ・「localStorage」を使って同期している → 同一originであるため共有される ・ブラウザドックからlocalStorageに「これをここに表示」という情報を書き込む localStorage これをここのソースに 表示するんや! 👁 storageEventを監視 →画像の変更など
ドキュメント間の同期について
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 localStorage これここのソースに 表示するんや! 👁 StorageEventを監視 →画像の変更など ドキュメント間の同期について
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 localStorage これここのソースに 表示するんや! 👁 StorageEventを受け取って →画像の変更など ドキュメント間の同期について
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 ドキュメント間の同期について ドキュメント間のリアクティブな同期が可能になる
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 ドキュメント間の同期について ドキュメント間のリアクティブな同期が可能になる
37 localStorageのイベントについて
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 localStorageのイベントについて ・localStorageのイベントは、同じタブでは発火しない
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 localStorageのイベントについて ・localStorageのイベントは、同じタブでは発火しない https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event TabA TabB 同origin localStorage
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 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
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 localStorageのイベントについて ・storage イベントオブジェクトには oldValue と newValue プロパティが含まれている ・keyの検証をすれば localStorage.getItem()
を再度呼び出す必要はない。
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 localStorage超便利じゃん!!
47 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.イベントハンドラの増殖 ・localStorageごとに storage イベントや独自のハンドラが生える。 ・結果として、コードのあちこちに似たようなイベント処理が散らばり、複数のハンドラが非同期に作用し合うた めテストが書きづらくなり、検証やデバッグのコストが大きくなる。 localStorage component A
component B component C event event event 地獄!!😱
ブラウザストレージを活⽤した、複数アプリをまたぐ永続化とリアクティブな同期 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
55 Thank you!