ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
Web Storage API とは
Web Storage API はブラウザに用意されたキー/値ストレージです。JavaScript から手軽にデータを読み書きでき、リロードしても残ります。Cookie より大容量で、サーバーに自動送信されないためクライアント側の状態保存に最適です。
2 つのストレージが用意されており、保持期間とスコープが異なります。
| 項目 | localStorage | sessionStorage |
|---|---|---|
| 保持期間 | 永続 (明示削除まで) | タブ / ウィンドウを閉じるまで |
| 共有範囲 | 同一オリジンの全タブ | 同一タブのみ |
| 容量 | 約 5MB | 約 5MB |
Cookie との比較
| 項目 | Web Storage | Cookie |
|---|---|---|
| 容量 | 約 5MB | 約 4KB |
| サーバー送信 | 送信しない | 毎リクエスト送信 |
| 有効期限 | 明示削除まで (local) / タブ閉じまで (session) | Expires / Max-Age で個別指定 |
| JS からの読み書き | 常に可能 | HttpOnly 指定で不可 |
| 主な用途 | UI 状態 / オフラインキャッシュ | ログインセッション |
基本操作 (API)
// 保存 (キー / 値 とも文字列)
localStorage.setItem("theme", "dark");
sessionStorage.setItem("tab", "1");
// 読み出し (なければ null)
const theme = localStorage.getItem("theme");
// 削除
localStorage.removeItem("theme");
// 全削除 (現オリジンのみ)
localStorage.clear();
// 件数とキー列挙
console.log(localStorage.length);
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
console.log(key, localStorage.getItem(key));
}
オブジェクトを保存する
Web Storage の値は文字列のみなので、オブジェクトは JSON 変換します。
const user = { id: 1, name: "Alice", roles: ["admin"] };
// 保存
localStorage.setItem("user", JSON.stringify(user));
// 取得
const raw = localStorage.getItem("user");
const obj = raw ? JSON.parse(raw) : null;
// 失敗に強い読み出し
function safeGet(key) {
try {
return JSON.parse(localStorage.getItem(key) ?? "null");
} catch {
return null;
}
}
storage イベント — 他タブとの同期
同じオリジンの他のタブで localStorage が変更されると storage イベントが発火します (自タブには通知されません)。
window.addEventListener("storage", (e) => {
console.log(e.key, e.oldValue, "→", e.newValue);
if (e.key === "theme") {
applyTheme(e.newValue);
}
});
容量制限と例外処理
容量を超えると QuotaExceededError が投げられます。シークレットウィンドウや一部 OS の制限でも投げられるので、書き込みはtry / catch が無難です。
try {
localStorage.setItem("big", giantString);
} catch (e) {
if (e.name === "QuotaExceededError") {
// 古いキャッシュを掃除して再試行など
}
}
セキュリティ上の注意
- XSS で簡単に盗まれる: localStorage は JS から無制限アクセス可能
- JWT / アクセストークンは HttpOnly + Secure Cookie の方が安全な場合が多い
- 個人情報・支払い情報を平文で置かない
- オリジンが異なるサブドメインとは共有されない (例:
a.example.comとb.example.com) - サードパーティ Cookie 規制と同様、第三者コンテキストでは制限される傾向
FAQ
Q: localStorage と IndexedDB の使い分け
A: 小さいキー値は localStorage、構造化された大量データは IndexedDB。後者は非同期で容量も数百 MB 〜 GB クラス。
Q: 暗号化して保存すれば安全?
A: 鍵自体が JS から見える限り、本質的なセキュリティ向上は限定的。機密データはサーバー / HttpOnly Cookie が原則です。
Q: シークレットウィンドウでも使える?
A: 使えますが、ウィンドウを閉じると消える挙動。永続性に依存しないでください。
Q: 動作確認はどこで?
A: ブラウザの開発者ツール > Application > Storage セクションでオリジン別に閲覧・編集・削除が可能です。
Q: SSR (サーバーサイドレンダリング) で参照したい
A: Web Storage はブラウザ専用。Next.js などでは useEffect 内などクライアント実行時のみアクセスする必要があります。SSR 側では window is not defined エラーになるので注意。
典型的なユースケース
| 用途 | 適切なストレージ |
|---|---|
| テーマ (dark / light) | localStorage |
| サイドバー開閉状態 | localStorage |
| カート (未ログイン時) | localStorage |
| フォームの一時保存 (タブ固有) | sessionStorage |
| ログイントークン | HttpOnly Cookie (Web Storage 非推奨) |
| 大容量画像キャッシュ | IndexedDB / Cache API |
まとめ
Web Storage API はブラウザに小〜中量のキー値データを残したいときの最も手軽な選択肢です。Cookie より大容量、IndexedDB より単純で、UI 状態の永続化や軽量キャッシュに最適。ただしXSS リスクと容量制限を理解し、機密情報は置かない・try/catch で書き込みエラーに備える・他タブとは storage イベントで同期する、という基本を押さえれば実用上ほぼ困りません。
関連
- Cookie — サーバー送信されるストレージ
- IndexedDB — 構造化データの非同期ストレージ
- Cache API — Service Worker と組み合わせるレスポンスキャッシュ
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
- Canvas API
- Drag and Drop API
- History API
- WebStorage API
- File API
- System Information API
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?