Web ストレージ(localStorage / sessionStorage)
ブラウザにキーと値を保存する仕組みです。Cookie と違いサーバへ自動送信されず容量も大きい一方、機密情報を入れてはいけない点を整理します。
- 1.Web ストレージはブラウザ内にキーと値(文字列)を保存する仕組みで、localStorage と sessionStorage がある。
- 2.Cookie と違ってリクエストに自動で付かない(サーバへ送られない)ため、純粋なクライアント側の保存に向く。
- 3.JavaScript から誰でも読めるので、トークンやパスワードなどの機密は保存しないこと。
Web ストレージとは
Web ストレージは、ブラウザにデータを保存するための仕組みです。キーと値のペアで保存し、どちらも文字列として扱われます。種類は 2 つあります。
- localStorage:明示的に消すまで永続して残る(タブやブラウザを閉じても消えない)。
- sessionStorage:そのタブを閉じると消える。タブごとに独立している。
どちらもオリジン単位(スキーム・ホスト・ポートの組)で分離されており、別オリジンのデータは見えません。サーバを介さず、JavaScript から直接読み書きします。
使い方
API は両者で共通です。setItem / getItem / removeItem / clear を使います。
// 保存(値は文字列。オブジェクトは JSON 文字列にして入れる)
localStorage.setItem("theme", "dark");
localStorage.setItem("user", JSON.stringify({ id: "u123", name: "Taro" }));
// 取得
const theme = localStorage.getItem("theme"); // "dark"
const user = JSON.parse(localStorage.getItem("user")); // オブジェクトに戻す
// 削除
localStorage.removeItem("theme");
localStorage.clear(); // そのオリジンの全件を削除
// タブ限定にしたいときは sessionStorage(API は同じ)
sessionStorage.setItem("step", "2");
値は文字列のみなので、オブジェクトや配列は JSON.stringify で文字列化して保存し、取り出すときに JSON.parse で戻します。
Cookie との違い
「ブラウザに保存する」点は同じですが、性質はかなり異なります。一番の違いはサーバへ自動送信されるかです。
| 観点 | Web ストレージ | Cookie |
|---|---|---|
| サーバへの送信 | 送られない(クライアント専用) | 同じサイト宛に自動で付く |
| 容量の目安 | 数 MB 程度と大きめ | 1 件 4 KB 程度と小さい |
| 有効期限 | local は永続 / session はタブ閉じまで | 属性で指定(無指定はセッション Cookie) |
| 主な用途 | UI 設定・下書き・キャッシュ等 | 認証・サーバ側セッションの ID 運搬 |
| JS からの読み取り | 常に可能 | HttpOnly を付ければ不可 |
Cookie はリクエストごとに自動で送られるため、**サーバが知る必要のある情報(セッション ID など)**に向きます。逆に Web ストレージは送られないので、クライアントだけで完結する情報に向きます。
ログイン後も保持したい設定や下書きは localStorage。入力ウィザードの途中状態など「そのタブの一時的な作業」は sessionStorage。タブごとに独立させたいかどうかで選ぶと迷いません。
主な用途
サーバに送る必要がなく、文字列で表せるデータの保存に向きます。
- UI / 表示設定:ダークモード、言語、サイドバーの開閉状態。
- 入力の下書き:フォームの一時保存、書きかけのコメント。
- 軽いキャッシュ:再取得が高コストなデータの一時保持。
- タブ単位の作業状態(sessionStorage):複数ステップ入力の途中経過。
注意点
手軽な一方、設計を誤ると不具合や事故になります。
- 機密を入れない:JavaScript から誰でも読めるため、XSS が起きるとまるごと盗まれる。トークンやパスワードは保存しない。
- 同期 API:読み書きはメインスレッドを止める同期処理。大量データの頻繁な読み書きは避ける。
- 文字列だけ・容量制限あり:数値やオブジェクトは変換が必要。上限(数 MB 程度)を超えると例外になる。
- 構造化データには不向き:大量・検索が要るデータは IndexedDB の方が適している。
「Cookie は CSRF があるから localStorage の方が安全」という話を見かけますが、localStorage は JavaScript から読めるため XSS で盗まれます。認証トークンは原則 HttpOnly 属性付きの Cookie に置き、Web ストレージには見られて困らない情報だけを入れてください。
認証情報の置き場所のトレードオフは Cookie とセッション で、オリジンの考え方は CORS で詳しく扱っています。
Web/フロントエンド Article
Web ストレージ(localStorage / sessionStorage)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
Web ストレージ
比較で見る軸
難易度: basic / カテゴリ: Web/フロントエンド / タグ数: 4
導入後に効く点
Cookie と違ってリクエストに自動で付かない(サーバへ送られない)ため、純粋なクライアント側の保存に向く。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- basic
- カテゴリ
- Web/フロントエンド
- タグ数
- 4
判断チェックリスト
- 自社の用途が「Web ストレージ / localStorage」に近いか確認する。
- 強みである「Web ストレージはブラウザ内にキーと値(文字列)を保存する仕組みで、localStorage と sessionStorage がある。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。