Javascript本地存储的方式有哪些?区别及应用场景?
方式容量持久性是否自动发到服务器数据类型特点适合场景Cookie~4KB可设置过期✅ 是(每次请求携带)字符串可设置 Domain/Path,支持 HttpOnly/Secure身份验证、用户跟踪~5~10MB永久(手动删)❌ 否字符串同源共享,长期保存用户偏好、缓存配置~5~10MB标签页级(关闭即删)❌ 否字符串仅当前标签页可用当前页面临时数据很大(几十MB+)永久❌ 否对
在 JavaScript 中,本地存储(Local Storage) 是指浏览器提供给前端开发者用来在用户设备上持久化存储数据的几种机制。它们允许你在不依赖后端服务的情况下,在浏览器中长期或临时保存数据,常用于用户偏好设置、登录状态保持、缓存数据等场景。
✅ 一、JS 本地存储的常见方式
1. Cookie
Cookie
,类型为「小型文本文件」,指某些网站为了辨别用户身份而储存在用户本地终端上的数据。是为了解决 HTTP
无状态导致的问题
✅ 特点:
-
存储在浏览器中,每次 HTTP 请求都会自动携带(在请求头
Cookie
字段中)。如果不使用HTTPS
并对其加密,其保存的信息很容易被窃取,导致安全风险。举个例子,在一些使用cookie
保持登录态的网站上,如果cookie
被窃取,他人很容易利用你的cookie
来假扮成你登录网站,标记为Secure
的Cookie
只应通过被HTTPS
协议加密过的请求发送给服务端 -
容量较小:每个 Cookie 通常不超过 4KB,一个域名下一般限制在 20~50 个 Cookie。
-
有过期时间:可以设置过期时间(Expires / Max-Age 优先级更高)。
-
Expires 用于设置 Cookie 的过期时间
-
Max-Age 用于设置在 Cookie 失效之前需要经过的秒数
-
可设置作用域:通过
Domain
和Path
控制哪些路径/域名可以访问。 -
✅ 用途:
-
传统用于身份验证(如 Session ID)、用户跟踪。
-
但不适合存储大量数据,且有隐私和安全问题(如 CSRF)。
📌 示例:
// 设置 cookie
document.cookie = "username=JohnDoe; expires=Thu, 18 Dec 2024 12:00:00 UTC; path=/";
// 读取 cookie(需自己解析)
console.log(document.cookie); // username=JohnDoe; otherKey=value...
// 删除 cookie(设置过期时间为过去)
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
2. LocalStorage(本地存储)
✅ 特点:
生命周期:持久化存储,数据不会随着浏览器关闭而消失,除非手动删除。
-
当本页操作(新增、修改、删除)了
localStorage
的时候,本页面不会触发storage
事件,但是别的页面会触发storage
事件。 -
存储容量较大:一般为 5MB~10MB(不同浏览器可能略有差异)。
-
仅支持字符串类型,存储对象需用
JSON.stringify()
和JSON.parse()
转换。 -
同源策略:只能在相同协议、域名、端口下访问。
-
不自动发送到服务器,仅在客户端使用。
-
localStorage
也不是完美的,它有两个缺点: - 无法像
Cookie
一样设置过期时间 - 只能存入字符串,无法直接存对象
✅ 用途:
-
保存用户主题设置、语言偏好、表单草稿、缓存数据等。
-
适合存储非敏感、长期保存的数据。
📌 示例:
// 存数据
localStorage.setItem('username', 'Alice');
// 取数据
const user = localStorage.getItem('username'); // 'Alice'
// 删除某个 key
localStorage.removeItem('username');
// 清空所有 localStorage
localStorage.clear();
3. SessionStorage(会话存储)
✅ 特点:
-
sessionStorage
和localStorage
使用方法基本一致,唯一不同的是生命周期,一旦页面(会话)关闭,sessionStorage
将会删除数据 -
容量与 LocalStorage 类似(约 5MB)。
-
同样仅支持字符串,同源策略限制。
-
不同标签页之间不能共享(即使域名一样)。
-
✅ 用途:
-
适合存储当前会话的临时数据,比如表单填写中途的数据、当前页面状态等。
📌 示例:
// 存数据
sessionStorage.setItem('tempData', '12345');
// 取数据
const data = sessionStorage.getItem('tempData');
// 删除 / 清空 同 localStorage
sessionStorage.removeItem('tempData');
sessionStorage.clear();
4. IndexedDB(索引数据库)
✅ 特点:
-
是浏览器提供的低级、异步、事务型数据库,基于 NoSQL(键值对或对象存储)。
-
存储容量大(一般几十MB甚至更多),适合存储大量结构化数据。
-
支持索引、事务、查询等高级功能,类似小型数据库。
-
异步 API(使用 Promise 或回调),不会阻塞主线程。
-
同源策略限制。
✅ 用途:
-
适合存储大量结构化数据,如离线应用数据、用户生成的文件、复杂缓存等。
-
比 LocalStorage 更强大,但使用较复杂。
📌 示例(简化,实际通常封装或使用库如 idb、Dexie.js):
// 打开或创建数据库
const request = indexedDB.open('myDatabase', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains('users')) {
db.createObjectStore('users', { keyPath: 'id' });
}
};
request.onsuccess = (event) => {
const db = event.target.result;
const tx = db.transaction('users', 'readwrite');
const store = tx.objectStore('users');
store.add({ id: 1, name: 'Alice' });
};
5. Cache API(Service Worker 缓存)
✅ 特点:
-
主要用于离线缓存,和 Service Worker 配合使用。
-
可以缓存请求和响应,实现离线访问(PWA 的关键技术之一)。
-
存储的是网络请求资源,如 HTML、JS、CSS、图片等。
-
一般不直接用来存普通业务数据。
✅ 用途:
-
实现离线网页、渐进式 Web 应用(PWA)
-
缓存 API 请求、静态资源,提升二次访问速度
✅ 二、扩展
0.关于localStorage的几个小tips
LocalStorage 能跨浏览器共享吗? |
❌ 不能,LocalStorage 是浏览器级别的隔离,不同浏览器(Chrome/Firefox/Safari)之间无法共享 |
LocalStorage 能跨标签页共享吗? |
✅ 可以,只要是在同一个浏览器、同一个源(协议+域名+端口)下的标签页,就能共享 |
LocalStorage 会过期吗? |
❌ 不会自动过期,除非手动删除、调用 clear(),或用户清除浏览器数据 |
LocalStorage 和 Cookie 有什么区别? |
容量、是否自动发送到服务器、生命周期、安全性等都不同(可展开对比表) |
如何实现跨浏览器或跨设备的数据同步? |
不能依赖 LocalStorage,一般要通过 后端数据库 + 用户登录态 + 前端同步机制(如登录后拉取用户配置) |
1. Cookie、LocalStorage、SessionStorage 的区别是什么?
特性 |
Cookie |
LocalStorage |
SessionStorage |
---|---|---|---|
容量 |
~4KB |
~5~10MB |
~5~10MB |
生命周期 |
可设置过期时间,否则随浏览器关闭(但通常用于会话) |
永久存储,除非手动删除 |
当前标签页关闭后自动清除 |
是否自动发送到服务器 |
✅ 每次 HTTP 请求都会带上(在 Cookie 头中) |
❌ 仅在客户端 |
❌ 仅在客户端 |
作用域 |
可设置 Domain / Path,可跨标签页共享 |
同源下共享,跨标签页共享 |
同源下共享,但不同标签页不共享 |
数据类型 |
字符串 |
字符串(需手动 JSON 序列化) |
字符串(需手动 JSON 序列化) |
典型用途 |
身份验证(Session ID)、用户跟踪 |
用户偏好、缓存数据 |
当前页面临时数据 |
2. Cookie 为什么不适合存大量数据?有什么安全问题?
-
容量限制:每个 Cookie 一般不超过 4KB,且每个域名下的 Cookie 数量也有限制(约 20~50 个)。
-
性能问题:每次 HTTP 请求都会携带 Cookie,如果 Cookie 太多或太大,会增加请求头大小,影响性能。
-
安全风险:
-
CSRF(跨站请求伪造):攻击者诱导用户在已登录的网站上执行恶意操作。
-
XSS(跨站脚本攻击):如果网站有 XSS 漏洞,Cookie 可能被窃取(尤其是没有设置
HttpOnly
的 Cookie)。
-
🔐 安全相关属性:
-
HttpOnly
:无法通过 JS 访问,防止 XSS 攻击窃取 Cookie。 -
Secure
:只在 HTTPS 连接下传输。 -
SameSite
:控制跨站时是否发送 Cookie,防止 CSRF。
3. LocalStorage 和 SessionStorage 适合存储哪些数据?为什么不存储敏感信息?
-
适合存储:用户主题、语言偏好、表单草稿、缓存的数据(如 JSON 配置)。
-
不适合存储:用户的密码、Token(尤其长期有效的)、身份信息等敏感数据。
🔐 原因:
-
任何 JS 代码(包括恶意脚本、XSS 攻击)都能读取它们,没有 HttpOnly 保护。
-
如果网站存在 XSS 漏洞,攻击者可以轻松通过
localStorage.getItem()
获取你的数据。
4. 什么时候用 IndexedDB?和 LocalStorage 有什么区别?
特性 |
LocalStorage |
IndexedDB |
---|---|---|
容量 |
较小(5~10MB) |
更大(几十MB甚至更多) |
数据类型 |
只能存字符串 |
可存对象、二进制、结构化数据 |
查询能力 |
无,只能按键存取 |
支持索引、事务、复杂查询 |
API |
同步(简单易用) |
异步(使用 Promise / 回调,较复杂) |
用途 |
简单配置、偏好存储 |
大量数据、离线应用、复杂缓存 |
🔧 什么时候用 IndexedDB?
-
当你需要存储大量结构化数据(如离线博客文章、用户笔记、文件缓存等)。
-
需要查询、排序、分页等能力,类似小型数据库。
5. 如何实现本地存储的数据加密?
-
不要存储明文的敏感信息(如密码、token)。
-
如果一定要存,可以对数据进行加密处理(如使用 AES、RSA 等加密算法,通过 crypto.subtle API)。
-
但注意:密钥管理仍是难点,一旦 JS 被 XSS 攻击,密钥和数据都可能泄露。
6. 如何实现本地存储的自动过期?
LocalStorage 本身没有过期机制,但你可以手动实现,例如:
// 存储时带上时间戳
const data = { value: 'hello', expires: Date.now() + 1000 * 60 * 60 }; // 1小时后过期
localStorage.setItem('myData', JSON.stringify(data));
// 取的时候判断是否过期
const stored = JSON.parse(localStorage.getItem('myData'));
if (stored && stored.expires > Date.now()) {
console.log(stored.value); // 未过期
} else {
localStorage.removeItem('myData'); // 已过期,删除
}
7. Service Worker 和 Cache API 怎么配合做离线缓存?
-
Service Worker 是运行在浏览器后台的脚本,可以拦截网络请求。
-
Cache API 可以缓存请求和响应,实现资源离线可用。
-
一般流程:
-
注册 Service Worker
-
在 Service Worker 的
install
事件中预缓存关键资源 -
在
fetch
事件中优先返回缓存内容,若无缓存再请求网络
-
✅ 三、总结:JS 本地存储方式速查
方式 |
容量 |
持久性 |
是否自动发到服务器 |
数据类型 |
特点 |
适合场景 |
---|---|---|---|---|---|---|
Cookie |
~4KB |
可设置过期 |
✅ 是(每次请求携带) |
字符串 |
可设置 Domain/Path,支持 HttpOnly/Secure |
身份验证、用户跟踪 |
LocalStorage |
~5~10MB |
永久(手动删) |
❌ 否 |
字符串 |
同源共享,长期保存 |
用户偏好、缓存配置 |
SessionStorage |
~5~10MB |
标签页级(关闭即删) |
❌ 否 |
字符串 |
仅当前标签页可用 |
当前页面临时数据 |
IndexedDB |
很大(几十MB+) |
永久 |
❌ 否 |
对象/二进制/结构化 |
异步、支持事务/索引/查询 |
大量结构化数据、离线应用 |
Cache API |
大 |
永久 |
❌ 否 |
请求/响应 |
用于缓存网络资源 |
离线网页、PWA、资源缓存 |
✅ 四、一句话总结:
JavaScript 提供了多种本地存储方式,包括 Cookie(小数据、会话/身份相关)、LocalStorage(较大、永久、简单数据)、SessionStorage(会话级临时数据)、IndexedDB(大量结构化数据)和 Cache API(网络资源缓存),它们各有特点,适用于不同场景,面试中常会对比它们的区别、安全性及使用方式。
更多推荐
所有评论(0)