6.2 localStorage・sessionStorage

Web Storage API

localStorageとsessionStorageは、ブラウザにキーバリュー形式でデータを保存するWeb Storage API。DevToolsを使用すると、保存されているデータの確認、編集、削除が簡単に行える。ユーザー設定、一時データ、認証トークンなどのデバッグに必須。

Web Storageの概要

localStorageとsessionStorageの違い

特性 localStorage sessionStorage
有効期限 永続(明示的に削除するまで) タブ/ウィンドウを閉じるまで
スコープ オリジン単位(同一オリジンの全タブで共有) タブ単位(同じURLでも別タブは別データ)
容量 約5MB(ブラウザにより異なる) 約5MB(ブラウザにより異なる)
用途 ユーザー設定、永続データ 一時的なフォームデータ、セッション情報
オリジンとは プロトコル + ホスト + ポートの組み合わせ。例: https://example.com:443。同一オリジンポリシーにより、異なるオリジン間でストレージは共有されない。

ストレージの確認

確認方法

操作手順

  1. F12 → Applicationパネルを開く
  2. 左サイドバーの「Storage」セクションを展開
  3. 「Local Storage」または「Session Storage」を展開
  4. オリジン(ドメイン)をクリック
  5. 保存されているキーと値の一覧が表示される

表示される情報

説明
Key データのキー名
Value 保存されている値(文字列)

フィルタリング

上部の検索ボックスでキーや値を絞り込める。多数のエントリがある場合に便利。

データの編集

値の編集

操作手順

  1. 編集したい値のセルをダブルクリック
  2. 新しい値を入力
  3. Enterキーで確定、Escapeでキャンセル

キーの編集

キー名のセルをダブルクリックして編集可能。ただし、キーを変更すると実質的に新しいエントリが作成され、古いエントリは削除される動作になる。

新しいエントリの追加

操作手順

  1. テーブルの空白行をダブルクリック
  2. または、最後の行の下の空白エリアをクリック
  3. キーを入力 → Tab → 値を入力 → Enter

エントリの削除

  • 単一削除: エントリを選択 → Delete キー、または右クリック → Delete
  • 全削除: 右上の「Clear All」ボタン(🚫アイコン)
注意 削除は即座に反映され、元に戻せない。重要なデータを削除する前に、Consoleでバックアップを取ることを推奨。

Consoleでの操作

Consoleを使用すると、プログラムからストレージを操作できる。

基本操作

// 値の取得
localStorage.getItem('key');
sessionStorage.getItem('key');

// 値の設定
localStorage.setItem('key', 'value');
sessionStorage.setItem('key', 'value');

// 値の削除
localStorage.removeItem('key');
sessionStorage.removeItem('key');

// 全削除
localStorage.clear();
sessionStorage.clear();

// キーの数を取得
localStorage.length;

// インデックスでキーを取得
localStorage.key(0);

全データの表示

// localStorageの全データをオブジェクトとして取得
Object.entries(localStorage).forEach(([key, value]) => {
  console.log(key, value);
});

// または、スプレッド構文で
console.table({...localStorage});

JSONデータの操作

// オブジェクトを保存(JSON文字列に変換)
const user = { name: 'Alice', age: 30 };
localStorage.setItem('user', JSON.stringify(user));

// オブジェクトを取得(JSONをパース)
const savedUser = JSON.parse(localStorage.getItem('user'));
console.log(savedUser.name); // 'Alice'
DevToolsパネルとConsoleの連携 ApplicationパネルでStorageを選択した状態でConsoleを開くと、即座にlocalStorage/sessionStorageを操作できる。変更はApplicationパネルにも反映される(リフレッシュボタンで更新)。

JSONデータの確認

JSONとして保存された値は、展開して内容を確認できる。

確認方法

  1. JSON形式の値をクリック
  2. 値がフォーマットされて表示される
  3. ツリー構造で展開/折りたたみ可能

Consoleでの整形表示

// JSON値を整形して表示
const data = localStorage.getItem('settings');
console.log(JSON.parse(data));

// テーブル形式で表示
console.table(JSON.parse(localStorage.getItem('items')));

デバッグのテクニック

ストレージ変更の監視

storageイベントを使用して、他のタブ/ウィンドウでのlocalStorage変更を監視できる。

// storageイベントのリスナー(同一オリジンの別タブの変更を検知)
window.addEventListener('storage', (event) => {
  console.log('Storage changed:', {
    key: event.key,
    oldValue: event.oldValue,
    newValue: event.newValue,
    url: event.url
  });
});
storageイベントの注意点 storageイベントは、変更を行ったタブ自身では発火しない。他のタブ/ウィンドウでの変更のみ検知する。

ブレークポイントでの確認

Sourcesパネルでストレージ操作の前後にブレークポイントを設定し、データの変化を追跡。

スニペットでのバックアップ

// localStorageの全データをコンソールに出力(コピー用)
console.log(JSON.stringify(localStorage, null, 2));

// バックアップからの復元
const backup = {"key1":"value1","key2":"value2"};
Object.entries(backup).forEach(([k, v]) => localStorage.setItem(k, v));

よくあるパターン

ユーザー設定の保存

// テーマ設定の保存と読み込み
// 保存
localStorage.setItem('theme', 'dark');

// 読み込み(デフォルト値付き)
const theme = localStorage.getItem('theme') || 'light';

認証トークンの管理

// トークンの保存
localStorage.setItem('authToken', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...');

// トークンの確認
const token = localStorage.getItem('authToken');
if (!token) {
  console.log('ログインが必要です');
}

// ログアウト時の削除
localStorage.removeItem('authToken');

フォームデータの一時保存

// 入力中のフォームデータをsessionStorageに保存
document.querySelector('form').addEventListener('input', (e) => {
  const formData = new FormData(e.target.form);
  const data = Object.fromEntries(formData);
  sessionStorage.setItem('formDraft', JSON.stringify(data));
});

// ページ読み込み時に復元
const draft = sessionStorage.getItem('formDraft');
if (draft) {
  const data = JSON.parse(draft);
  // フォームに値を設定...
}

トラブルシューティング

データが保存されない

原因 対策
プライベートブラウジング シークレットモードではストレージが制限される場合がある
容量超過 QuotaExceededErrorが発生。不要なデータを削除
ストレージ無効 ブラウザ設定でストレージが無効になっている

容量の確認

// 使用量の概算(バイト)
function getStorageSize(storage) {
  let total = 0;
  for (let key in storage) {
    if (storage.hasOwnProperty(key)) {
      total += key.length + storage[key].length;
    }
  }
  return total * 2; // UTF-16は1文字2バイト
}

console.log('localStorage使用量:', getStorageSize(localStorage), 'bytes');

QuotaExceededErrorの対処

// try-catchでエラーをハンドリング
try {
  localStorage.setItem('largeData', hugeString);
} catch (e) {
  if (e.name === 'QuotaExceededError') {
    console.error('ストレージ容量が不足しています');
    // 古いデータを削除するなどの対処
  }
}

データが消える

  • sessionStorage: タブを閉じると削除される仕様
  • ブラウザのクリア: 履歴削除時にストレージも削除される場合がある
  • ストレージ圧迫: ブラウザが自動的に古いデータを削除することがある

セキュリティ上の注意

機密情報の保存

  • パスワードを平文で保存しない
  • クレジットカード情報を保存しない
  • 認証トークンはHttpOnly Cookieの方が安全

XSS攻撃のリスク

localStorageはJavaScriptからアクセス可能。XSS攻撃でスクリプトが注入されると、ストレージ内のデータが盗まれる可能性がある。

推奨事項

  • 重要な認証情報はHttpOnly Cookieを使用
  • 保存するデータは最小限に
  • 有効期限のあるトークンを使用
  • 適切なCSP(Content Security Policy)を設定
DevToolsでの確認 DevToolsを使えば誰でもストレージの中身を確認できる。ユーザーに見られても問題ないデータのみ保存すること。
参考文献
[1] View and edit local storage - Chrome DevTools. developer.chrome.com
[2] View and edit session storage - Chrome DevTools. developer.chrome.com
[3] Web Storage API - MDN. developer.mozilla.org