Web 术语
Cookie
Cookie 是一种浏览器的缓存机制,在不同的域名下存储了不同的 cookie,当发送请求的时候会将该域名下的 cookie 存储的信息一起发送到服务器之之中。下面是一张浏览器存储 Cookie 的截图:
Cookie 存储的一些元数据信息可以参考下表:
字段名 | 是否必须 | 示例值 | 说明 |
---|---|---|---|
Name=Value | ✅ 是 | login_user=Tomatos | Cookie 的键值对内容,必须有,值是字符串 |
Path | ❌ 否 | / | 表示此 Cookie 对哪个路径有效,默认为当前路径 |
Domain | ❌ 否 | .example.com | 指定可以接收此 Cookie 的域名,默认是当前域 |
Expires | ❌ 否 | Wed, 01 May 2025 12:00:00 GMT | 设置 Cookie 的过期时间(绝对时间) |
Max-Age | ❌ 否 | 86400 (单位:秒) | 设置 Cookie 的有效期(相对时间),优先于 Expires |
Secure | ❌ 否 | 无值(只要写上即可) | 表示此 Cookie 只会在 HTTPS 请求中发送 |
HttpOnly | ❌ 否 | 无值 | 表示此 Cookie 无法被 JavaScript 访问(如 document.cookie ) |
SameSite | ❌ 否 | Strict / Lax / None | 控制跨站请求时是否携带 Cookie,用于防范 CSRF |
**注:**Cookie 存储在浏览器(客户端)之中
Session
Session 是一种用于维持客户端与服务端会话的机制。
Session 的工作流程
- 客户端浏览器向服务端发起登录请求。
- 登录成功后,服务端将用户信息存储在服务器端,并生成一个唯一的 Session 标识符(由服务器决定是否唯一)。
- 服务端将该 Session 标识符返回给客户端,通常通过 Cookie 存储在客户端浏览器中。
- 客户端在后续请求中会携带该 Session 标识符,服务端通过标识符找到对应的会话信息。
TIP
Session 可以通过 Cookie 实现,也可以通过其他手段实现。
每个用户对应一个 Session,会话信息存储在服务端。
Cookie 与 Session 的对比
特性 | Cookie | Session |
---|---|---|
存储位置 | 客户端浏览器 | 服务器内存 |
安全性 | 较低,可被客户端查看和修改 | 较高,存储在服务器 |
生命周期 | 可持久化存储 | 默认为会话级,可配置超时时间 |
存储容量 | 有限(通常 4KB) | 较大(受服务器内存限制) |
性能 | 每次请求都会传输 | 只传输会话标识符 |
适用场景 | 记住用户名、主题偏好等非敏感信息 | 用户认证状态、购物车等敏感数据 |
Token
Token 是一种身份验证机制,常用于无状态的认证场景。它通过生成一个唯一的字符串来标识用户身份,避免了在每次请求中都需要存储和验证用户的会话信息。
Token 的工作流程
- 用户通过用户名和密码向服务器发起登录请求。
- 服务器验证用户信息,验证成功后生成一个 Token 并返回给客户端。
- 客户端将 Token 存储在本地(如 LocalStorage 或 SessionStorage)。
- 客户端在后续的每次请求中将 Token 放入请求头中(通常是
Authorization
字段)。 - 服务器通过解析 Token 验证用户身份并返回相应的资源。
Token 的特点
- 无状态:服务器不需要存储用户的会话信息,减少了服务器的内存开销。
- 跨平台:Token 可以在不同的客户端(如 Web、移动端)之间通用。
- 安全性:通过加密算法生成,难以伪造,但需要注意 Token 的存储和传输安全。
常见的 Token 类型
- JWT(JSON Web Token):一种常见的 Token 格式,由三部分组成:Header、Payload 和 Signature。它是自包含的,包含了用户的基本信息和签名。
- OAuth Token:用于授权的 Token,常用于第三方应用访问用户资源。
Token 与 Session 的对比
特性 | Token | Session |
---|---|---|
存储位置 | 客户端 | 服务器内存 |
状态 | 无状态 | 有状态 |
安全性 | 依赖加密和传输安全 | 较高,存储在服务器 |
生命周期 | 通常有过期时间 | 会话级,可配置超时时间 |
适用场景 | 分布式系统、跨平台认证 | 单一服务器的用户会话管理 |
**注:**Token 的存储需要注意安全性,避免被恶意获取。
CSRF
跨站请求伪造(Cross-Site Request Forgery)
一个经典的 CSRF 例子如下:
用户 A 登录了银行相关网站,关闭了网站但是并没有退出用户
用户 A 访问了另一个钓鱼网站,其中有一个按钮伪装了一个段表单,表单指向你之前访问的银行相关网站
点击按钮后会携带你刚刚保存了 cookie,拿到 cookie 后可以通过里面存储的 session 唯一标识成功访问你之前登录的银行相关网站进行敏感的高危操作。