localStorage

ブラウザにキーバリュー形式でデータを永続的に保存する Web Storage API

APIインフラ

localStorage とは

localStorage は、ブラウザにキーバリュー形式でデータを永続的に保存する Web Storage API である。セッションをまたいでデータが保持され、明示的に削除するまで消えない。容量は 5〜10 MB。

sessionStorage との比較

観点 localStorage sessionStorage Cookie
有効期間 永続 (手動削除まで) タブを閉じるまで 有効期限まで
容量 5〜10 MB 5〜10 MB 4 KB
サーバー送信 なし なし 毎リクエスト送信
API 同期 同期 document.cookie

基本操作

// 保存
localStorage.setItem('theme', 'dark');

// 取得
const theme = localStorage.getItem('theme'); // 'dark'

// 削除
localStorage.removeItem('theme');

// 全削除
localStorage.clear();

// オブジェクトの保存 (文字列のみなので JSON 変換が必要)
localStorage.setItem('user', JSON.stringify({ name: 'Alice', age: 30 }));
const user = JSON.parse(localStorage.getItem('user')!);

型安全なラッパー

function getStorageItem<T>(key: string, fallback: T): T {
  const item = localStorage.getItem(key);
  if (item === null) return fallback;
  try { return JSON.parse(item) as T; }
  catch { return fallback; }
}

function setStorageItem<T>(key: string, value: T): void {
  localStorage.setItem(key, JSON.stringify(value));
}

// 使用
const theme = getStorageItem('theme', 'light');
setStorageItem('theme', 'dark');

適するケース / 適さないケース

✅ 適する ❌ 適さない
テーマ設定 (ダーク/ライト) 認証トークン (XSS で盗まれる)
言語設定 パスワード、個人情報
フォームの下書き 大量データ (→ IndexedDB)
UI の状態 (サイドバーの開閉) サーバーと同期が必要なデータ

セキュリティ上の注意

localStorage は JavaScript から自由にアクセスできるため、XSS 攻撃で全データが盗まれる。

// ❌ 認証トークンを localStorage に保存しない
localStorage.setItem('token', 'eyJhbGciOiJIUzI1NiJ9...');

// ✅ 認証トークンは HttpOnly Cookie で管理
// (JavaScript からアクセスできない)

ストレージイベント

// 別タブでの変更を検知
window.addEventListener('storage', (event) => {
  if (event.key === 'theme') {
    applyTheme(event.newValue!); // 別タブでテーマが変わったら同期
  }
});

storage イベントは変更を行ったタブ以外のタブで発火する。タブ間のデータ同期に使える。

理論と実装の両面から学ぶなら関連書籍が参考になる。

関連用語