首页 > 其他分享 >Cookie、Session、LocalStorage 和 SessionStorage 的区别详解

Cookie、Session、LocalStorage 和 SessionStorage 的区别详解

时间:2024-06-15 13:03:15浏览次数:30  
标签:存储 SessionStorage Session LocalStorage Cookie 客户端

前言

在前端开发中,数据存储和状态管理是非常重要的内容。常用的存储方式有 Cookie、Session、LocalStorage 和 SessionStorage。本文将详细介绍这四者的区别,帮助开发者更好地理解和选择合适的存储方案。

一、Cookie 和 Session 的区别

1. 什么是 Cookie?

Cookie 是由服务器生成并发送到客户端的一小段数据,客户端会将其存储并在后续请求中携带,帮助服务器识别用户。Cookie 主要用于以下场景:

  • 用户身份认证(如记住登录状态)
  • 存储用户偏好设置
  • 跟踪用户行为(如广告点击记录)

示例代码:

// 设置 Cookie
document.cookie = "username=John Doe; expires=Fri, 31 Dec 2024 12:00:00 UTC; path=/";

// 读取 Cookie
console.log(document.cookie);
2. 什么是 Session?

Session 是存储在服务器端的用户会话信息。每个用户会话都有一个唯一的 Session ID,服务器通过这个 ID 来识别不同的用户。客户端通过 Cookie 将 Session ID 发送给服务器,从而实现用户识别。

示例代码(Node.js):

// 使用 Express 和 express-session 中间件
const express = require('express');
const session = require('express-session');
const app = express();

app.use(session({
  secret: 'my secret',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: false }
}));

app.get('/', (req, res) => {
  if (req.session.views) {
    req.session.views++;
    res.send(`Number of views: ${req.session.views}`);
  } else {
    req.session.views = 1;
    res.send('Welcome to the session demo. Refresh!');
  }
});

app.listen(3000);
3. 区别总结
  • 存放位置不同:Cookie 存放在客户端,Session 存放在服务器端。
  • 安全性不同:Cookie 存储在浏览器中,容易被篡改和截取;Session 存放在服务器端,安全性更高。
  • 对服务器的压力不同:Cookie 存放在客户端,对服务器没有压力;Session 存放在服务器端,会占用服务器资源。
  • 有效期不同:Cookie 可以设置过期时间,分为会话 Cookie 和持久 Cookie;Session 一般在用户关闭浏览器或会话超时后失效。
  • 跨域支持:Cookie 支持跨域名访问,可以通过设置 domain 值实现;Session 不支持跨域。
4. 安全性分析
  • Cookie:由于 Cookie 存储在客户端,可能会被用户篡改或盗取,导致安全风险。例如,攻击者可以通过 XSS 攻击获取 Cookie。
  • Session:Session ID 存储在服务器端,通过加密的方式传输和验证,安全性较高。即使攻击者获取了 Session ID 也无法直接篡改服务器上的会话数据。

二、Web Storage:LocalStorage 和 SessionStorage

Web Storage 是 HTML5 引入的一种新的本地存储方案,主要包括 LocalStorage 和 SessionStorage。它们相比 Cookie 有以下优点:

  • 存储空间更大,通常为 5MB。
  • API 简单易用,封装了常用方法(如 setItemgetItemremoveItemclear)。
  • 数据只存储在客户端,不会随每次请求发送到服务器。
1. LocalStorage

LocalStorage 是持久化的本地存储方式,数据除非手动清除,否则会一直保留,即使浏览器关闭和重启也不会丢失。

示例代码:

// 设置 LocalStorage
localStorage.setItem('username', 'John Doe');

// 读取 LocalStorage
console.log(localStorage.getItem('username'));

// 删除 LocalStorage
localStorage.removeItem('username');

// 清空 LocalStorage
localStorage.clear();

SessionStorage 是会话级别的存储方式,数据只在当前会话中有效,一旦用户关闭浏览器窗口或标签页,数据就会被清除。

示例代码:

// 设置 SessionStorage
sessionStorage.setItem('username', 'John Doe');

// 读取 SessionStorage
console.log(sessionStorage.getItem('username'));

// 删除 SessionStorage
sessionStorage.removeItem('username');

// 清空 SessionStorage
sessionStorage.clear();
  • 有效期不同:LocalStorage 是持久化存储,除非手动清除;SessionStorage 是会话级别存储,浏览器关闭后数据失效。
  • 应用场景不同:LocalStorage 适用于长期存储数据,如用户偏好设置;SessionStorage 适用于临时存储数据,如页面状态、表单数据等。

三、四者的详细对比

1. 存储位置
  • Cookie:存储在客户端,浏览器内。
  • Session:存储在服务器端。
  • LocalStorage:存储在客户端,浏览器内。
  • SessionStorage:存储在客户端,浏览器内。
2. 有效期
  • Cookie:可以设置为持久性(通过 expires 或 max-age)或会话级别(浏览器关闭后失效)。
  • Session:会话级别,浏览器关闭或会话超时后失效。
  • LocalStorage:持久性存储,除非手动删除,否则永久有效。
  • SessionStorage:会话级别,浏览器关闭或标签页关闭后失效。
3. 存储大小
  • Cookie:每个 Cookie 大小约为 4KB,浏览器对单个域名下的 Cookie 总数有限制。
  • Session:服务器端存储,大小取决于服务器配置。
  • LocalStorage:一般为 5MB,各浏览器可能不同。
  • SessionStorage:一般为 5MB,各浏览器可能不同。
4. 传输数据
  • Cookie:每次请求都会携带 Cookie 数据,影响性能。
  • Session:仅在初始会话时传输 Session ID,后续请求不再携带全部会话数据。
  • LocalStorage:不随请求发送,仅在客户端存储和访问。
  • SessionStorage:不随请求发送,仅在客户端存储和访问。
5. 安全性
  • Cookie:容易被窃取和篡改,需注意 XSS 攻击。
  • Session:相对安全,通过加密的 Session ID 进行识别和验证。
  • LocalStorage:易受 XSS 攻击,数据存储在客户端。
  • SessionStorage:易受 XSS 攻击,数据存储在客户端。

四、应用场景

1. Cookie
  • 用户登录状态保持:用于记住用户的登录状态,实现自动登录。
  • 用户偏好设置:存储用户的语言、主题等偏好信息。
  • 广告跟踪:用于记录用户的广告点击行为,实现精准广告投放。
2. Session
  • 用户会话管理:用于存储用户的会话信息,如购物车数据、用户权限等。
  • 高安全性场景:适用于需要保护敏感数据的场景,如在线银行、支付系统等。
3. LocalStorage
  • 长期数据存储:适用于存储长期有效的数据,如用户偏好设置、浏览历史等。
  • 前端缓存:用于缓存大量数据,提高应用性能和用户体验。
4. SessionStorage
  • 临时数据存储:适用于存储会话级别的数据,如表单数据、页面状态等。
  • 多标签页数据隔离:在同一域名下的不同标签页之间实现数据隔离,防止数据污染。

五、总结

Cookie、Session、LocalStorage 和 SessionStorage 各有优缺点,适用于不同的场景。开发者应根据实际需求选择合适的存储方案:

  • Cookie:适用于需要跨域访问或持久化存储少量数据的场景。
  • Session:适用于需要高安全性、临时存储用户会话数据的场景。
  • LocalStorage:适用于需要持久化存储较大数据的场景。
  • SessionStorage:适用于需要临时存储较大数据且不需要跨页面的数据的场景。

希望本文对你理解和选择合适的存储方案有所帮助。如果你有其他更好的解决方法或建议,欢迎在评论区留言分享。

参考资料

关注我

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏和关注我,获取更多前端开发的干货分享。

版权声明: 本文为博主原创文章,转载请附上原文出处链接和本声明。

标签:存储,SessionStorage,Session,LocalStorage,Cookie,客户端
From: https://blog.csdn.net/m0_65084430/article/details/139700357

相关文章

  • flask路由系统、偏函数、CBV、模板、请求响应、session、请求扩展
    路由系统1代码演示23fromflaskimportFlask45app=Flask(__name__)67app.debug=True8#路由基本使用9#@app.route('/',methods=['GET'])10#@app.get()11#@app.post()12defindex(name):13print(name)14return&......
  • 解决@LocalStorageProp值同步问题的详细指南
    在华为鸿蒙操作系统(HarmonyOS)的开发中,@LocalStorageProp是一个关键的装饰器,用于在页面级别的UI状态存储中实现数据的单向同步。然而,开发者在使用@LocalStorageProp时可能会遇到值未按预期同步的问题。本文将详细介绍如何正确使用@LocalStorageProp,并通过父组件的状态更新来......
  • 分布式session和本地session区别
    分布式会话(DistributedSession)和本地会话(LocalSession)是两种会话管理方式,它们在存储位置、可扩展性和数据共享方面存在区别。存储位置:本地会话:存储在服务器本地内存中。每个服务器都维护自己的会话信息。分布式会话:会话信息存储在共享的存储介质中,例如Redis、数据库等。多......
  • D-Bus——DBUS_SESSION_BUS_ADDRESS 环境变量为空
            DBUS_SESSION_BUS_ADDRESS环境变量通常在用户会话环境中定义,用于指示会话总线的地址。在root用户环境下,这个环境变量可能为空,原因如下:原因分析会话总线与用户会话相关:        会话总线(sessionbus)是与特定用户会话相关的总线,每个用户登录后都会......
  • D-Bus——session bus调用机制
            当D-Bus会话总线(sessionbus)客户端拿到环境变量DBUS_SESSION_BUS_ADDRESS的值后,它会按照以下步骤来连接和与会话总线进行通信:1.获取环境变量        首先,D-Bus客户端程序会读取环境变量DBUS_SESSION_BUS_ADDRESS。这个环境变量包含了会话总线的......
  • 爬虫 | 处理cookie的基本方法——session
    很多网页要求登录后,才能查看对应的信息,整个流程是:客户端服务器玩家登录返回cookie获得cookie后继续访问其他页面根据cookie查验身份,返回对应内容session会话,理解为可以连续请求,先提交data换来cookie,然后可以带着cook......
  • 【简写Mybatis-02】注册机的实现以及SqlSession处理
    前言注意:学习源码一定一定不要太关注代码的编写,而是注意代码实现思想:通过设问方式来体现代码中的思想;方法:5W+1H源代码:https://gitee.com/xbhog/mybatis-xbhog;https://github.com/xbhog/mybatis-xbhog;交个朋友,有价值欢迎star。回顾&分析上一局实现Mapper接口和映射器通......
  • ASP.NET第五章 Application、Session和Cookie对象
    第五章Global全局的1.包含所有应用程序的配置设置2.存储所有事件的事件处理程序3.存储在应用程序的根目录下4.它的位置定义应用程序的限界Global.asax六大事件:1.Application_Start调用当前应用程序目录(或其子目录)下的第一个ASP.NET页面时触发2.ApplicationEnd......
  • Springboot 开发 -- Redis实现分布式Session
    一、引言在微服务架构和分布式系统中,会话管理(SessionManagement)成为了一个挑战。传统的基于Servlet容器的会话管理方式在分布式环境下无法有效工作,因为用户请求可能会被分发到不同的服务器上,导致会话数据无法共享。为了解决这个问题,SpringSession提供了一种基于外部存储(......
  • [GHCTF 2024 新生赛]理想国 flask session伪造
    忙着毕业论文几天没做题了。进入页面发现几个api接口,注册登录搜索登出4个。利用postman访问注册接口注册。可以看到返回了token,利用token访问login。尝试search页面传入file参数试试能不能目录穿越。得到secret-key,这里有个非预期解,访问/proc/1/environ直接得到flag。......