ブラウザ保存の3つの違い|CookieとStorage入門
この記事でわかること
- localStorage、sessionStorage、Cookieの役割の違い
- ブラウザを閉じたとき、タブを閉じたときに残るデータの違い
- Cookieがサーバーへ送られる点と、Web Storageが主にブラウザ内で使われる点
- ログイン情報や入力途中の内容を、どこへ保存するべきかの考え方
- 初学者が避けたいセキュリティ上の誤解
結論・重要ポイント
- localStorageは同じオリジンで共有され、明示的に削除しない限りブラウザを閉じても残る保存領域です。
- sessionStorageは同じオリジンでもタブごとに分かれ、タブを閉じると基本的に消える保存領域です。
- CookieはHTTPリクエストと一緒にサーバーへ送られるため、ログイン状態やサーバー側の判定に使われます。
- localStorageやsessionStorageへ機密性の高いトークンを安易に保存すると、JavaScriptから読めるリスクがあります。
- 迷ったら、画面表示の一時設定はsessionStorage、長めに残したい表示設定はlocalStorage、サーバーと連動する認証や状態管理は適切な属性を付けたCookieを候補にします。
対象読者と前提知識
この記事は、JavaScriptでWeb画面を作り始めて、ブラウザへデータを保存する方法に迷っている初学者向けです。
JavaScriptの変数、オブジェクト、文字列の基本が分かれば読み進められます。ここでは仕組みの理解を優先し、実務での認証設計はサーバー側の仕様やフレームワークの推奨も合わせて確認する前提で説明します。
MAO先生と学ぶブラウザ保存の違い
生徒うみちゃん
入力途中の内容って、ブラウザに保存すればいいんだよね?localStorageもsessionStorageもCookieも、全部同じ保存箱ってこと?
MAO先生
似ていますが、役割が違うのです。結論から言うと、localStorageは長く残すブラウザ内保存、sessionStorageはタブ単位の一時保存、Cookieはサーバーへ送られる保存情報として考えると整理しやすいです。
生徒うみちゃん
じゃあ、ログイン中かどうかもlocalStorageに入れておけば簡単じゃん!
MAO先生
そこは注意が必要です。localStorageはJavaScriptから読めるため、機密性の高いトークンを置くと、画面内のスクリプトに読まれるリスクがあります。認証では、サーバー側の設計とCookie属性を含めて考えるのです。
生徒りくちゃん
sessionStorageはタブを閉じると消えるのですね。ページを再読み込みしただけでも消えてしまうのでしょうか?
MAO先生
よく気づきましたね!sessionStorageはページを再読み込みしても同じタブのページセッション内では残ります。ただし、タブやウィンドウを閉じると、そのセッションのデータは消えるという理解が基本です。
生徒うみちゃん
じゃあ、問い合わせフォームの途中入力はsessionStorageに入れれば、閉じたら消えてちょうどいいってこと?
MAO先生
その用途には向いている場合があります。例えば、同じタブ内で戻ったときに入力を復元したいけれど、翌日まで残す必要がないならsessionStorageが候補です。長く残す下書きなら、保存期限や削除方法も一緒に決めます。
生徒りくちゃん
Cookieはサーバーへ送られるということですが、毎回すべてのCookieが送信されると通信量や安全性に影響しませんか?
MAO先生
その通りです。Cookieは対象のドメインやパス、SameSite、Secureなどの属性で送信範囲を絞ります。不要に大きな値を入れないこと、機密情報をそのまま入れないことも大切です。
生徒うみちゃん
表示テーマはlocalStorage、一時入力はsessionStorage、サーバーが必要なログイン状態はCookieまわりを慎重に、って分けると覚えやすいじゃん!
生徒りくちゃん
保存できるかだけでなく、誰が読めるか、いつ消えるか、サーバーへ送られるかを確認するということですね!
コード・操作手順・具体例
1. localStorageは同じオリジンで長く残す
表示テーマやサイドバーの開閉状態など、次回訪問時にも使いたい軽い設定に向いています。
localStorage.setItem("theme", "dark");
const theme = localStorage.getItem("theme");
if (theme === "dark") {
document.documentElement.dataset.theme = "dark";
}
localStorageのキーと値は文字列として保存されます。オブジェクトを保存したい場合は、JSON.stringifyとJSON.parseを使います。
const settings = {
compactMode: true,
itemsPerPage: 20,
};
localStorage.setItem("settings", JSON.stringify(settings));
const savedSettings = JSON.parse(localStorage.getItem("settings") ?? "{}");
console.log(savedSettings.compactMode);
2. sessionStorageはタブ単位の一時保存に使う
入力途中の検索条件や、同じタブで戻ったときだけ復元したい値に向いています。
const input = document.querySelector("#inquiry-message");
input.addEventListener("input", () => {
sessionStorage.setItem("draftMessage", input.value);
});
const savedDraft = sessionStorage.getItem("draftMessage");
if (savedDraft) {
input.value = savedDraft;
}
※この例は考え方を示すサンプルです。実際のフォームでは、個人情報や機密情報を保存するかどうか、保存期限、削除タイミングを先に決めてください。
3. Cookieはサーバーとのやり取りに関係する
サーバーはレスポンスのSet-CookieヘッダーでCookieを設定できます。JavaScriptだけで完結する保存箱ではなく、HTTP通信と関係する点が大きな違いです。
Set-Cookie: session_id=abc123; Path=/; Secure; HttpOnly; SameSite=Lax
この例では、主に次の意味があります。
- Secure: HTTPS接続で送信する
- HttpOnly: JavaScriptのdocument.cookieから読めないようにする
- SameSite=Lax: 外部サイトからのリクエストでCookieが送られる場面を抑える
4. 使い分けの目安
| 保存したいもの | 候補 | 理由 |
|---|---|---|
| ダークモード、表示件数 | localStorage | 次回訪問時も使いたいが、サーバー送信は不要なため |
| 入力途中の一時メモ | sessionStorage | 同じタブ内だけで復元したいことが多いため |
| ログイン状態の判定 | Cookie | サーバーがリクエスト時に状態を確認するため |
| 大きなデータ、複雑な構造 | IndexedDBなど | Web Storageは同期APIで、大量データには向きにくいため |
よくある誤解や失敗
「ブラウザに保存できるなら安全」と考える
ブラウザ内に保存できることと、安全に保存できることは別です。localStorageやsessionStorageはJavaScriptから扱いやすい反面、画面内で実行されるスクリプトから読めます。
ログイントークン、個人情報、決済情報などは、保存場所だけで判断せず、サーバー側の認証方式、Cookie属性、XSS対策、保存期限を含めて設計します。
「sessionStorageはページ移動で必ず消える」と考える
sessionStorageはタブやウィンドウのページセッションに紐づきます。単なる再読み込みでは残る場合があるため、「再読み込みしたら必ず消える保存場所」と覚えると誤解します。
「Cookieに何でも入れればサーバーで使えて便利」と考える
Cookieは条件に合うリクエストへ送られるため、大きな値や不要な値を入れると通信量や管理が悪化します。サーバーに必要な最小限の識別子にし、値そのものへ機密情報を詰め込まない設計が基本です。
Q&A
localStorageとsessionStorageはサーバーへ自動送信されますか?
自動送信されません。JavaScriptで読み出し、必要なら明示的にリクエストへ含めます。サーバーへ自動的に送られる性質を持つのは、条件に合うCookieです。
CookieはJavaScriptから必ず読めますか?
必ず読めるわけではありません。HttpOnly属性が付いたCookieは、document.cookieから読めません。認証用Cookieでは、この性質が重要になることがあります。
どれを使えば一番安全ですか?
保存対象と脅威によって変わります。推測ですが、初学者が迷う場面では「長く残す画面設定はlocalStorage」「タブ内だけの一時値はsessionStorage」「サーバー認証はCookie属性を含めてサーバー側で設計」と分けると、大きな事故を避けやすいです。
localStorageに保存した値はいつ消えますか?
明示的にremoveItemやclearで削除する、ユーザーがブラウザのサイトデータを削除する、ブラウザ側の保存制限やプライベートブラウズの終了などで消えることがあります。永続的なデータ保管庫として過信しない方が安全です。
要点まとめ
- localStorageは、同じオリジンで長く残したい軽い表示設定に向いています。
- sessionStorageは、同じタブ内だけで使いたい一時データに向いています。
- Cookieは、サーバーへ送られる性質があり、ログイン状態などサーバー側の判定に関係します。
- 機密性の高い値は、保存できる場所ではなく、誰が読めるか、どの通信で送られるか、いつ無効化するかで判断します。
- 迷ったときは、保存期間、送信先、JavaScriptからの可読性、削除方法の4点を先に決めると整理しやすくなります。
公式資料・参考資料
- Web Storage API - MDN
- Window: localStorage property - MDN
- Window: sessionStorage property - MDN
- Document: cookie property - MDN
- Set-Cookie header - MDN
- HTML Standard: Web storage - WHATWG
※MDNとWHATWG HTML Standardを2026年7月9日に確認して作成しています。ブラウザ実装やCookie関連の制限は変わることがあるため、実務では対象ブラウザと利用中のフレームワーク資料も確認してください。
内容に合うCTA
ブラウザ保存は小さな機能に見えて、ログイン、入力復元、問い合わせ導線、個人情報管理に影響します。Webアプリや業務フォームで「どこに何を保存するべきか」を整理したい場合は、MAO工房へご相談ください。
授業に登場する3人については、MAO先生のIT授業 キャラクター紹介で確認できます。
MAO工房に相談できます
Webアプリの保存設計を相談できます
ログイン状態、入力途中の下書き、設定保存など、ブラウザとサーバーのどちらへ保存するべきかを整理し、安全な実装を支援します。
- ✓ 保存場所と期限を整理
- ✓ Cookie属性と認証まわりを確認
- ✓ 小規模Webアプリにも対応