当前位置: 首页 > news >正文

会话技术之<Cookie>和<Session>的区别联系

目录

1、会话追踪分类

2、功能与对比

2.1、存储位置

2.2、数据大小

2.3、安全性

2.4、生命周期与控制

2.5、可扩展性/性能

2.6、常见用途

3、基于 cookie 的 session

4、Cookie 的详细介绍

4.1、工作过程

4.2、分类

4.3、常用属性

4.4、cookie下发和请求携带

4.5、 如何提高 Cookie 的安全性

5、session

5.1、定义

5.2、工作原理

5.2、常用属性

5.3、组织形式

6、安全注意事项


前言

        在 Web 开发中,Cookie 和 Session 都用于存储用户状态,解决 HTTP 协议的无状态性问题(即每次请求都是独立的,不会记住之前的状态)。

如下所示:

        但它们在 存储位置、数据安全性、使用场景 等方面存在明显区别。


1、会话追踪分类

1、Cookie:

        浏览器端存储的小片数据(键值对),由服务器通过 Set-Cookie 下发或由前端写入,随每次请求由浏览器携带到对应域名(Cookie 会自动在 HTTP 请求头里发送)。

2、Session:

        服务器端存储会话数据(如登录状态、购物车),浏览器通常只保存一个 session id(通常用 cookie 存放 session id),每次请求带上该 id,服务器根据 id 查到对应 session 数据。


2、功能与对比

2.1、存储位置

  • Cookie:存储在客户端(浏览器),可设置失效时间(持久 cookie)或会话结束即失效(Session cookie)。
  • Session:存储在服务器(内存、文件、数据库、Redis 等);客户端只保存 session id(通常在 cookie 中)。

2.2、数据大小

  • Cookie:受限(通常每个 cookie ≤ 4KB,浏览器与域总数也有限制)。
  • Session:服务器端存储,理论上能存更多数据(受服务器内存/存储限制)。

2.3、安全性

  • Cookie:容易被窃取(XSS),因此敏感数据不应直接存 cookie;可通过 HttpOnly、防止 JS 访问;Secure 要求 HTTPS;SameSite 减少 CSRF。
  • Session:数据在服务器,不直接暴露给客户端,但 session id 若被窃取仍可冒充用户(需防范会话劫持/固定)。

2.4、生命周期与控制

  • Cookie:客户端和服务器都可设置过期时间;浏览器负责过期处理。
  • Session:服务器可控制过期(如超时时间、手动销毁),通常更易于统一管理(例如强制退出、立即失效)。

2.5、可扩展性/性能

  • Cookie:分布式环境下无需额外存储(但每次请求会增加网络传输开销)。
  • Session:服务器保存会话会增加服务器负担,分布式时需考虑:
    • 粘性会话(sticky session)把同一用户请求路由到同一后端(简单但不利于均衡与故障切换)。
    • 分布式 session 存储(Redis/数据库)在多实例环境常用。
    • 或用无状态 token(如 JWT)替代 session,避免服务器存储但有其它风险。

2.6、常见用途

  • Cookie:记住偏好(theme)、跟踪(analytics)、保存 session id、持久化小量信息。
  • Session:保存用户登录状态、临时购物车、服务端敏感数据等。


3、基于 cookie 的 session

如下所示:

1、用户登录 -> 服务器生成 session(含用户 id 等),并生成一个随机 session id。

2、服务器在响应头中返回 Set-Cookie: SESSIONID=abc123; Path=/; HttpOnly; Secure; SameSite=Strict

3、浏览器保存 cookie,并在后续对该域的请求中自动带上 Cookie: SESSIONID=abc123

4、服务器根据 SESSIONID 在 session 存储中查到对应数据,完成鉴权/续会话。


4、Cookie 的详细介绍

4.1、工作过程

1、响应中: 

服务器通过 Set-Cookie 字段返回 Cookie 给浏览器。

        此时 Cookie 中包含各个字段, 如 Domain, Path, HttpOnly 等, 这是服务器让浏览器知道什么时候才能使用这些 Cookie.

如下所示:

2、浏览器接收到 Cookie 后存储下来

3、再次发送请求时使用 Cookie 字段, 将 Cookie 发送给 服务器。

4、单看请求中的 Cookie 就是:

        以键值对的形式, 只有 key 和 value, 没有其他字段, 其他字段只是辅助浏览器判断什么时候在请求中使用 Cookie 的.

        服务器接收到包含 Cookie 的请求后,会解析 Cookie 并根据其中的信息执行相应的操作,例如,验证用户身份、提供个性化内容或记录用户活动等。

4.2、分类

        Cookie总时由用户客户端进行保存的(一般是浏览器),按其存储位置可分为:内存式Cookie硬盘式Cookie。

1、内存式Cookie:

        存储在内存中,浏览器关闭后就会消失,由于其存储时间较短,因此也被称为非持久Cookie或会话Cookie。

2、硬盘式Cookie:

        保存在硬盘中,其不会随浏览器的关闭而消失,除非用户手工清理或到了过期时间。由于硬盘式Cookie存储时间是长期的,因此也被称为持久Cookie。

4.3、常用属性

如下所示:

安全与行为相关。

  • Domain / Path:作用域
  • Expires / Max-Age:过期时间(持久 cookie)
  • HttpOnly:浏览器 JS 无法访问(防 XSS 窃取)
  • Secure:仅在 HTTPS 下发送
  • SameSite(Lax / Strict / None):控制跨站点请求是否携带 cookie(减轻 CSRF)
  • SameSite=None 要配合 Secure

代码示例:

Cookie cookie = new Cookie("username","helloweenvsfei"); // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE);  // 设置生命周期为MAX_VALUE
cookie.setDomain(".helloweenvsfei.com");       // 设置域名
cookie.setPath("/");                           // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE);           // 设置有效期
cookie.setSecure(true);              // 设置安全属性
response.addCookie(cookie);          // 输出到客户端

4.4、cookie下发和请求携带

        下面给出常见的 Set-Cookie(服务器下发)和 Cookie(浏览器随请求携带)示例头,并对各属性做简要说明和注意事项。

常见示例(服务器返回响应时下发 cookie,用多行 Set-Cookie)

1、会话型 session cookie(浏览器关闭即失效,HttpOnly + Secure + 严格 SameSite)

Set-Cookie: SESSIONID=abc123DEF456; Path=/; HttpOnly; Secure; SameSite=Strict

2、持久化偏好 cookie(带过期时间)

Set-Cookie: theme=light; Expires=Wed, 09 Jun 2026 10:18:14 GMT; Path=/; SameSite=Lax

3、跨子域共享 cookie(注意 domain 前面的点,可被子域访问)

Set-Cookie: SESS=xyz; Domain=.example.com; Path=/; HttpOnly; Secure; SameSite=Lax

4、跨站点(第三方或跨域 API)需要发送 cookie 的情况(SameSite=None 必须配合 Secure)

Set-Cookie: CSRF=token123; Path=/; HttpOnly; Secure; SameSite=None

5、存放 JWT 的 cookie(通常不建议直接把敏感数据放在 cookie,若放请配合 HttpOnly + Secure)

Set-Cookie: AUTH_TOKEN=eyJhbGci...; Path=/; HttpOnly; Secure; SameSite=Lax; Expires=Tue, 19 Aug 2025 12:00:00 GMT

6、删除/清除 cookie(使其过期)

Set-Cookie: SESSIONID=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0

7、在同一个响应中下发多个 cookie(每个 cookie 一行)

Set-Cookie: a=1; Path=/; HttpOnly

Set-Cookie: b=2; Path=/; Secure; SameSite=Lax

浏览器在后续请求中发送到服务器的 Cookie 请求头示例:

        对应上面的一次请求,浏览器会把属于该域/路径且符合 SameSite/secure 条件的 cookie 一起发送:Cookie: SESSIONID=abc123DEF456; theme=light; CSRF=token123。

4.5、 如何提高 Cookie 的安全性

1、对 Cookie 中的信息加密.

2、HttpOnly 设为 true, 那么该 Cookie 将只能通过 HTTP 或 HTTPS 协议访问,而不能通过 JavaScript 或其他客户端脚本访问, 防止其他恶意脚本访问 Cookie 盗取信息.

3、Secure 设为 true, 只通过 HTTPS 等安全连接发送时才会被浏览器发送到服务器, 防止其他恶意网站窃取 Cookie 信息.

4、设置 Cookie 过期时间.

5、给 Cookie 设置 IP 戳和 时间 戳, 设置 Cookie 在同个 IP 下多长时间失效.

⚠️注意:

        上面这些设置都是服务器设置的, 因为 Cookie 本身就是 服务器返回给浏览器, 浏览器只是简单的进行了存储.


5、session

5.1、定义

        令牌通常就是服务器以 Cookie 形式返回给浏览器, 服务器存储的用户信息对应的就是 Session。

通常情况下,一个用户关联一个 Session (会话)。

举个栗子: 这个过程和去医院看病很相似.

1、到了医院先挂号. 挂号时需提供身份证, 同时得到了一张 “就诊卡”, 这个就诊卡就相当于患者的 “令牌”. 同时医院的系统中会记录用户的看病信息。

2、后续去各个科室进行检查, 诊断, 开药等操作, 都不必再出示身份证了, 只要凭就诊卡即可识别出当前患者的身份,知道患者的病史。

3、看完病了之后, 不想要就诊卡了, 就可以注销这个卡. 此时患者的身份和就诊卡的关联就销毁了. (类似于网站的注销操作)

4、又来看病, 可以办一张新的就诊卡, 此时就得到了一个新的 “令牌”。

5、就诊卡就是 Cookie, 但是 Cookie 存储的数据是有限的,且易丢失,关键信息都存储在服务器上,以 会话(Session)的形式。

服务器这边就需要记录令牌信息, 以及令牌对应的用户信息, 这个就是 Session 机制所做的工作.

5.2、工作原理

如下所示:

响应中返回的 sessoinId

图中的 ZTZiMGRkY2YtYjQzYi00MWM3LTlhZjUtNTNkZmVkN2Q0MzM0 便是 sessionId

        浏览器收到 Cookie 后, 进行存储,再次发送请求时便携带着这个 sessionId, 从而服务器能识别出来用户信息。

                // request 是 HttpServletRequest 实例HttpSession session = request.getSession(true); // 参数为 true, 没有 session 就创建// 存入键值对session.setAttribute("username", "zhangsan");session.setAttribute("age", 18);session.setAttribute("password", "123456");// request 是 HttpServletRequest 实例HttpSession session = request.getSession(false); // 参数为 false, 没有 session 返回 null, 通常用来验证用户是否已经登录时用// 获取键值对, 注意要转换类型, 因为 返回值类型是 ObjectString username = (String) session.getAttribute("username");int age = (int) session.getAttribute("username");String password = (String)session.getAttribute("password");
    

    5.2、常用属性

    Session中包括各种方法,使用起来要比Cookie方便得多。

    HttpSession的常用方法如表所示。

    代码示例:

    HttpSession session = request.getSession();       // 获取Session对象
    session.setAttribute("loginTime", new Date());     // 设置Session中的属性
    out.println("登录时间为:" +(Date)session.getAttribute("loginTime"));    // 获取Session属性

    5.3、组织形式

    如下所示:

            HttpSession 这个对象本质也是一个 “键值对” 结构每个 HttpSession 有其唯一的 ID,同时又包含若干键值对,里面的 key 和 value 由自己定义,允许往 HttpSession 对象中存储任意的键值对数据。

    ⚠️注意:

            但是 key 必须是 String , value 可以任意。HttpSession 的每个键值对又称为属性(Attribute).


    6、安全注意事项

    • 永远通过 HTTPS 传输敏感 cookie(使用 Secure)。
    • 使用 HttpOnly 防止脚本读取 session id。
    • 登录后重新生成 session id(防止 session fixation)。
    • 设置合理超时时间并在登出时销毁 session(服务器端)。
    • 使用 SameSite 或 CSRF Token 防护跨站请求伪造(尤其是敏感操作的 POST)。
    • 若使用 JWT,注意不要把敏感信息写入可被篡改的 token,使用签名/加密并设置短失效期与刷新策略。
    • 监控 session 数量与过期策略,避免内存/存储压力。

    总结

            Cookie通过在客户端记录信息确定用户身份Session通过在服务器端记录信息确定用户身份


    参考文章:

    1、Cookie和Session详解_cookie session-CSDN博客文章浏览阅读2.4w次,点赞63次,收藏221次。本文深入讲解Cookie和Session的工作原理,包括Cookie的属性设置、Session的常用方法及生命周期管理,对比两者在安全性和性能上的差异。 https://blog.csdn.net/swadian2008/article/details/104267034?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522144cb9a4f7568f8c3a0227fcc2f59b34%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=144cb9a4f7568f8c3a0227fcc2f59b34&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-104267034-null-null.142^v102^control&utm_term=session%E5%92%8Ccookie&spm=1018.2226.3001.4187

    2、【HTTP】Cookie 和 Session 详解_cookie和session请求-CSDN博客文章浏览阅读1.8k次,点赞3次,收藏12次。本文详细介绍了Cookie和Session在Web开发中的作用、组成、传输机制以及它们在用户身份验证、数据存储和安全方面的应用,对比了两者的特点和常见场景 https://blog.csdn.net/m0_61832361/article/details/133021177?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522144cb9a4f7568f8c3a0227fcc2f59b34%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=144cb9a4f7568f8c3a0227fcc2f59b34&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-133021177-null-null.142^v102^control&utm_term=session%E5%92%8Ccookie&spm=1018.2226.3001.4187

    http://www.dtcms.com/a/340073.html

    相关文章:

  1. “数据权限”的道和术
  2. 从 SGD 到梯度累积:Epoch、Batch、Step 的关系全解析
  3. 使用redis读写锁实现抢券功能
  4. Hive 存储管理测试用例设计指南
  5. 力扣(最小栈)
  6. Android逆向工程:Smali语法解析完整指南
  7. [ Maven 开发工具 ] 环境搭建及配置
  8. DRM驱动架构浅析-上(DRM基础概要与U-Boot阶段驱动解析)
  9. 基于 OpenMV 的矩形识别与 STM32 串口通信(电子设计大赛实用教程)
  10. k8s运维实践:高可用Redis Cluster(三主三从)与Proxy部署方案
  11. 使用 Docker 安装长安链管理平台 + 部署区块链与示例合约
  12. daily notes[3]
  13. Eigen中Dense 模块简要介绍和实战应用示例(最小二乘拟合直线、协方差矩阵计算和稀疏求解等)
  14. 三极管驱动led灯搭配的电阻选取方法
  15. 跟随广州AI导游深度探寻广州历史底蕴​
  16. 如何做一次AIMD
  17. 农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
  18. [OWASP]智能体应用安全保障指南
  19. 英伟达显卡驱动怎么更新 详细步骤教程
  20. MySQL练习题50题(附带详细教程)
  21. Day13_【DataFrame数据组合concat连接】【案例】
  22. C5.5:VDB及后面的电路讨论
  23. 决策树(2)
  24. Yum使用时报错
  25. Spring Boot 全局异常处理
  26. 快速了解Anaconda系统
  27. 08.5【C++ 初阶】实现一个相对完整的日期类--附带源码
  28. implement libtime on Windows
  29. MyCAT基础概念
  30. Python函数总结