三个概念:cookie、session、签名
-
Cookie (存在于你的浏览器里)
- 它就是一小段文本信息,由网站服务器生成。
- 服务器通过 HTTP 响应头 (
Set-Cookie) 把它发送给你的浏览器。 - 你的浏览器收到后,会把它存储在本地(你的电脑或手机上)。
- 之后,每次你访问同一个网站时,浏览器会自动通过 HTTP 请求头 (
Cookie) 把这小段信息发送回服务器。 - 内容例子:
session_id=abc123; user_pref=dark_mode。可以存放一些简单的标识信息或偏好设置。
-
Session (存在于网站服务器上)
- 它是服务器上的一块存储区域(可以存在内存、数据库、文件等地方)。
- 这个存储区域用来保存与该特定用户相关的、临时的、敏感或复杂的状态信息。
- 内容例子: 用户是否登录(
is_logged_in=true)、登录的用户是谁(user_id=456)、用户的购物车里有什么(cart_items=[item1, item2])、用户当前的权限等。 - 最关键的区别: Session 数据本身永远不直接发送给你的浏览器!它只存在于服务器端。
-
Session 和 Cookie 是如何配合工作的?
- 当用户第一次访问网站(比如登录):
- 服务器为该用户创建一个新的 Session(在服务器内存/数据库中开辟一块地方),并生成一个唯一的、随机的字符串作为这个 Session 的标识符,称为
Session ID。 - 服务器将这个
Session ID放入一个 Cookie 中(比如session_id=abc123)。 - 服务器通过 HTTP 响应 (
Set-Cookie: session_id=abc123) 把这个 Cookie 发送给用户的浏览器。
- 服务器为该用户创建一个新的 Session(在服务器内存/数据库中开辟一块地方),并生成一个唯一的、随机的字符串作为这个 Session 的标识符,称为
- 当用户下次再访问这个网站时:
- 用户的浏览器自动将该网站的 Cookie(包含
session_id=abc123) 通过 HTTP 请求 (Cookie: session_id=abc123) 发送给服务器。 - 服务器收到请求,取出 Cookie 中的
Session ID(abc123)。 - 服务器拿着这个
Session ID,去它自己的存储(内存/数据库)中查找对应的 Session 数据块。 - 如果找到了,服务器就知道这个请求来自哪个用户了(
user_id=456),也知道这个用户登录了(is_logged_in=true),也知道购物车里有啥(cart_items=[item1, item2])。
- 用户的浏览器自动将该网站的 Cookie(包含
- 简单说:
- Cookie 是浏览器存储和自动发送的信息块(主要用来存
Session ID)。 - Session 是服务器存储用户状态信息的地方(存
user_id、登录状态、购物车等)。 Session ID(存在 Cookie 里的那个字符串) 是连接两者的桥梁,让服务器知道浏览器请求对应的是哪个 Session。
- Cookie 是浏览器存储和自动发送的信息块(主要用来存
- 当用户第一次访问网站(比如登录):
-
签名是什么?(保护
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 来时:
- 服务器取出 Cookie 中的
Session ID(abc123) 和Signature(xyz789)。 - 服务器再次用自己的同一个秘密密钥,对 Cookie 里传来的
Session ID(abc123) 执行同样的数学计算,得到一个新的签名。 - 服务器将这个新计算出的签名 与 Cookie 里传来的
Signature(xyz789) 进行严格比较。- 如果两者完全一致: 说明 Cookie 里的
Session ID没有被任何人篡改过(因为篡改Session ID会导致新计算出的签名和原签名不同),是合法的Session ID。 - 如果两者不一致: 说明 Cookie 里的
Session ID或Signature被改动过(或者这是伪造的),服务器立即认定这个 Session 无效(通常会让用户重新登录,生成新的 Session ID)。
- 如果两者完全一致: 说明 Cookie 里的
- 服务器取出 Cookie 中的
- 服务器在生成
- 简单说:签名就是用服务器自己的密钥给
Session ID打上一个“防伪码”。服务器每次收到都重新计算这个防伪码进行比对,以保证Session ID的完整性和真实性,防止被篡改冒充。
- 问题: 如果坏人拦截了网络请求,或者用户电脑被恶意软件感染,他们可能会窃取或篡改 Cookie 中的
终极总结:
- Cookie: 浏览器端存储的小数据片(文本),会自动发送给服务器。主要用来传递
Session ID。 - Session: 服务器端存储的用户状态数据(不是 Cookie!)。用户的重要临时数据都存在这里。
- Session ID: 一个随机字符串,存在 Cookie 中。它是浏览器用来告诉服务器“我是谁”的钥匙。
- 签名: 服务器用自己的密钥给
Session ID计算的“防伪标记”,也存 Cookie 里。用来验证Session ID是否被篡改过,保证安全。
流程回顾(无签名简化版):
- 用户登录 -> 服务器:创建 Session (存用户数据),生成 Session ID
abc123。 - 服务器 -> 浏览器:
Set-Cookie: session_id=abc123。 - 浏览器访问 -> 服务器:
Cookie: session_id=abc123。 - 服务器:找到
abc123对应的 Session 数据 -> 知道用户是谁。
流程回顾(带签名安全版):
- 用户登录 -> 服务器:创建 Session (存用户数据),生成 Session ID
abc123。 - 服务器:用密钥计算
abc123的签名xyz789。 - 服务器 -> 浏览器:
Set-Cookie: session_id=abc123; signature=xyz789。 - 浏览器访问 -> 服务器:
Cookie: session_id=abc123; signature=xyz789。 - 服务器:用密钥重新计算收到的
abc123的签名,得到new_signature。 - 服务器:比较
new_signature和收到的xyz789。- 相同:找到
abc123对应的 Session -> 知道用户是谁。 - 不同:拒绝请求,要求重新登录(防止坏人用篡改的 Session ID 冒充)。
- 相同:找到

浙公网安备 33010602011771号