三个概念:cookie、session、签名

  1. Cookie (存在于你的浏览器里)

    • 它就是一小段文本信息,由网站服务器生成。
    • 服务器通过 HTTP 响应头 (Set-Cookie) 把它发送给你的浏览器。
    • 你的浏览器收到后,会把它存储在本地(你的电脑或手机上)。
    • 之后,每次你访问同一个网站时,浏览器会自动通过 HTTP 请求头 (Cookie) 把这小段信息发送回服务器。
    • 内容例子: session_id=abc123; user_pref=dark_mode。可以存放一些简单的标识信息或偏好设置。
  2. Session (存在于网站服务器上)

    • 它是服务器上的一块存储区域(可以存在内存、数据库、文件等地方)。
    • 这个存储区域用来保存与该特定用户相关的、临时的、敏感或复杂的状态信息。
    • 内容例子: 用户是否登录(is_logged_in=true)、登录的用户是谁(user_id=456)、用户的购物车里有什么(cart_items=[item1, item2])、用户当前的权限等。
    • 最关键的区别: Session 数据本身永远不直接发送给你的浏览器!它只存在于服务器端。
  3. Session 和 Cookie 是如何配合工作的?

    • 当用户第一次访问网站(比如登录):
      1. 服务器为该用户创建一个新的 Session(在服务器内存/数据库中开辟一块地方),并生成一个唯一的、随机的字符串作为这个 Session 的标识符,称为 Session ID
      2. 服务器将这个 Session ID 放入一个 Cookie 中(比如 session_id=abc123)。
      3. 服务器通过 HTTP 响应 (Set-Cookie: session_id=abc123) 把这个 Cookie 发送给用户的浏览器。
    • 当用户下次再访问这个网站时:
      1. 用户的浏览器自动将该网站的 Cookie(包含 session_id=abc123) 通过 HTTP 请求 (Cookie: session_id=abc123发送给服务器。
      2. 服务器收到请求,取出 Cookie 中的 Session ID (abc123)。
      3. 服务器拿着这个 Session ID去它自己的存储(内存/数据库)中查找对应的 Session 数据块。
      4. 如果找到了,服务器就知道这个请求来自哪个用户了(user_id=456),也知道这个用户登录了(is_logged_in=true),也知道购物车里有啥(cart_items=[item1, item2])。
    • 简单说:
      • Cookie 是浏览器存储和自动发送的信息块(主要用来存 Session ID)。
      • Session 是服务器存储用户状态信息的地方(存 user_id、登录状态、购物车等)。
      • Session ID (存在 Cookie 里的那个字符串) 是连接两者的桥梁,让服务器知道浏览器请求对应的是哪个 Session。
  4. 签名是什么?(保护 Session ID 的安全)

    • 问题: 如果坏人拦截了网络请求,或者用户电脑被恶意软件感染,他们可能会窃取或篡改 Cookie 中的 Session ID。比如用户 A 的 Session ID 是 abc123(对应他的购物车和账户),坏人偷到这个值,把自己的 Cookie 改成 session_id=abc123,服务器就会把坏人当作用户 A 来处理!这叫 Session Hijacking (会话劫持)。
    • 解决办法:签名 (Signing)
      • 服务器在生成 Session ID (比如 abc123) 后,不会直接把这个值放到 Cookie 里。
      • 服务器会用一个只有它自己知道的秘密字符串(密钥) 对这个 Session ID 进行一个特殊的数学计算(比如 HMAC)。这个计算的结果就叫签名(Signature)。
      • 服务器把这个 Session ID 和 计算出来的 Signature 一起放进 Cookie 发给浏览器(比如 session_id=abc123; signature=xyz789)。
      • 下次浏览器带着这个 Cookie 来时:
        1. 服务器取出 Cookie 中的 Session ID (abc123) 和 Signature (xyz789)。
        2. 服务器再次用自己的同一个秘密密钥,对 Cookie 里传来的 Session ID (abc123执行同样的数学计算,得到一个新的签名。
        3. 服务器将这个新计算出的签名 与 Cookie 里传来的 Signature (xyz789进行严格比较。
          • 如果两者完全一致: 说明 Cookie 里的 Session ID 没有被任何人篡改过(因为篡改 Session ID 会导致新计算出的签名和原签名不同),是合法的 Session ID
          • 如果两者不一致: 说明 Cookie 里的 Session ID 或 Signature 被改动过(或者这是伪造的),服务器立即认定这个 Session 无效(通常会让用户重新登录,生成新的 Session ID)。
    • 简单说:签名就是用服务器自己的密钥给 Session ID 打上一个“防伪码”。服务器每次收到都重新计算这个防伪码进行比对,以保证 Session ID 的完整性和真实性,防止被篡改冒充。

终极总结:

  • Cookie: 浏览器端存储的小数据片(文本),会自动发送给服务器。主要用来传递 Session ID
  • Session: 服务器端存储的用户状态数据(不是 Cookie!)。用户的重要临时数据都存在这里。
  • Session ID: 一个随机字符串,存在 Cookie 中。它是浏览器用来告诉服务器“我是谁”的钥匙。
  • 签名: 服务器用自己的密钥给 Session ID 计算的“防伪标记”,也存 Cookie 里。用来验证 Session ID 是否被篡改过,保证安全。

流程回顾(无签名简化版):

  1. 用户登录 -> 服务器:创建 Session (存用户数据),生成 Session ID abc123
  2. 服务器 -> 浏览器:Set-Cookie: session_id=abc123
  3. 浏览器访问 -> 服务器:Cookie: session_id=abc123
  4. 服务器:找到 abc123 对应的 Session 数据 -> 知道用户是谁。

流程回顾(带签名安全版):

  1. 用户登录 -> 服务器:创建 Session (存用户数据),生成 Session ID abc123
  2. 服务器:用密钥计算 abc123 的签名 xyz789
  3. 服务器 -> 浏览器:Set-Cookie: session_id=abc123; signature=xyz789
  4. 浏览器访问 -> 服务器:Cookie: session_id=abc123; signature=xyz789
  5. 服务器:用密钥重新计算收到的 abc123 的签名,得到 new_signature
  6. 服务器:比较 new_signature 和收到的 xyz789
    • 相同:找到 abc123 对应的 Session -> 知道用户是谁。
    • 不同:拒绝请求,要求重新登录(防止坏人用篡改的 Session ID 冒充)。
posted @ 2025-07-18 13:30  星辰……  阅读(51)  评论(0)    收藏  举报