Cookie、Session和Token鉴权
Http协议和TCP协议
HTTP(HyperText Transfer Protocol,超文本传输协议)是Web 的基础通信协议,用于客户端(通常是浏览器)和服务器之间的数据交换。它是一种无状态的、基于请求-响应模型的应用层协议。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为"一次连接"。
TCP(Transmission Control Protocol,传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去,服务器和客户端均可主动发起断开连接的请求。
HTTP 是基于 TCP 实现的应用层协议
对比维度 | HTTP | TCP |
---|---|---|
所属层级 | 应用层 | 传输层 |
作用 | 定义网页请求/响应的规则 | 提供可靠传输通道 |
是否建立连接 | 不需要自己建立连接(依赖 TCP) | 通信前需三次握手建立连接 |
是否可靠传输 | 不保证(由 TCP 负责) | 保证可靠、有序、无差错传输 |
是否面向连接 | 否 | 是 |
协议端口 | 默认 80(HTTPS 是 443) | 没有固定端口(由应用指定) |
示例应用 | 浏览器访问网页 | HTTP、FTP、SMTP 等都依赖 TCP |
建立连接:三次握手(Three-Way Handshake)
- 客户端发送 SYN,表示请求连接(Seq=x)
- 服务器回复 SYN+ACK(Ack=x+1, Seq=y)
- 客户端回复 ACK(Ack=y+1)
断开连接:四次挥手(Four-Way Handshake)
- 客户端发送 FIN,表示断开连接
- 服务端回复 ACK,确认接收
- 服务端再发送 FIN,表示它也准备断开
- 客户端回复 ACK,连接正式断开
SYN
😦Synchronize Sequence Numbers
,同步序列编号)
ACK
😦Acknowledgement Number
,确认编号)
FIN
:结束标志
请求报文和相应报文
请求报文组成部分:
- 请求行:方法 + URL + 协议版本
- 请求头(Headers):如 Host、User-Agent、Accept
Content-Type:请求的报文格式
Accept:客户端接受的数据类型
User-Agent:发送请求的客户端类型
X-Requested-with:Ajax请求,异步请求
Cookie:请求携带的Cookie信息 - 空行
- 请求体(Body):通常用于 POST 请求提交数据,如表单、JSON
相应报文组成部分:
- 状态行:协议版本 + 状态码 + 状态消息
- 响应头(Headers):如 Content-Type、Set-Cookie
Set-Cookie:服务器反映给客户端的Cookie信息 - 空行
- 响应体(Body):服务器返回的实际内容
特点:简单、快捷、无状态、无连接
特点 | 说明 |
---|---|
无状态(Stateless) | 每次请求之间没有记忆能力,服务器不会保留之前的请求信息。可以通过 Cookie、Session 等机制弥补 |
应用层协议 | 建立在 TCP(传输层)之上,用于数据的实际传输 |
请求-响应模式 | 客户端发送请求,服务器返回响应 |
灵活性强 | 支持多种数据格式(HTML、JSON、图片等) |
常见状态码
类别 | 范围 | 含义 |
---|---|---|
1xx | 信息响应 | |
2xx | 成功:如 200 OK , 201 Created | |
3xx | 重定向:如 301 Moved Permanently , 302 Found | |
4xx | 客户端错误:如 400 Bad Request , 404 Not Found , 403 Forbidden | |
5xx | 服务器错误:如 500 Internal Server Error , 502 Bad Gateway |
Https=http+SSl安全传输协议,默认端口443
基本工作流程
- 客户端与服务器建立 TCP 连接(通常使用端口 80,HTTPS 是 443)
- 客户端发送 HTTP 请求
- 服务器处理请求并返回 HTTP 响应
- 客户端接收并处理响应内容
Cookie
cookie不是缓存,是服务器产生的并且保存在客户端的一小段信息,键值型数据,用于在客户端和服务器之间“维持状态”。
类型 | 说明 |
---|---|
会话 Cookie | 保存在内存,不设置过期时间,关闭浏览器即失效 |
持久 Cookie | 保存在硬盘,设置 Expires 或 Max-Age ,在指定时间后失效 |
结构
字段 | 含义 |
---|---|
name=value | 键值对内容(必须) |
Expires / Max-Age | 过期时间 |
Path | 生效路径(默认当前路径) |
Domain | 生效域名(支持子域共享) |
鉴权流程
1.客户端(浏览器)第1次访问服务器的时候,服务器会生成Cookie,并且通过响应头的Set-Cookie保存相应信息传输给客户端
2.客户端第2-N次访问服务器时,请求头都会自动携带Cookie中的信息传输到服务器以实现鉴权
Session
session指会话,通过cookie传输
鉴权流程
1.客户端登录访问服务器是,服务器会生成Session-id(保存在服务器)保存在session中,并且通过cookie返回给客户端,所有session都属于会话级cookie
2.客户端后续访问服务器端时,都会携带session-id信息,用于服务器端鉴权
Token
Token(令牌)是用户登录成功后,由服务端生成并返回给客户端的一段字符串,用于标识该用户的身份。它是一种无状态的身份认证机制。
鉴权流程
1.客户端第一次登录访问服务器端后,会自动生成token,保存在服务器端的硬盘或数据库中,
2.之后的所有请求,都会由客户端保存token在请求头或者请求参数中,实现鉴权
token一般都是经过加密的,并且由生命周期
加密方式:
- 对称加密算法:DES,AES,Base64
- 双钥加密:RSA
- MD5,SHA。。。
JWT就是一种最常见的token,他的结构
- Header:令牌头部,说明签名算法等
- Payload:载荷,包含用户 ID、角色、过期时间等
- Signature:签名,防篡改
Token 鉴权流程详解(以 JWT 为例)
- 用户发送账号 + 密码给服务器
- 服务端验证通过后,生成 JWT(包含用户信息 + 过期时间)并签名
- 服务端将 JWT 返回给客户端
- 客户端存储在本地(如
localStorage
、sessionStorage
) - 后续请求中,客户端在 Header 中携带:
Authorization: Bearer <token>
- 服务端通过公钥 / 密钥验证 Token 是否有效,并解析其中的用户信息
- 返回用户请求的数据
特性 | Cookie | Session | JWT(Json Web Token) |
---|---|---|---|
存储位置 | 浏览器端(客户端) | 服务器端 | 浏览器或本地存储 |
安全性 | 中等,易被窃取 | 高,服务器控制 | 高,但需保护私钥 |
扩展性 | 差(依赖浏览器) | 中(占服务器资源) | 强(无状态,适合分布式) |
状态保存 | 客户端保存状态 | 服务器保存 Session 状态 | Token 本身携带状态信息 |
是否支持跨域 | ❌ | ❌ | ✅(通过 Header) |
LocalStorage和sessionStorage
localStorage 和 sessionStorage 是现代 Web 前端提供的强大本地存储手段,适用于非敏感信息的持久或临时存储,但在安全性设计上需特别小心。
特性 | localStorage | sessionStorage |
---|---|---|
生命周期 | 永久保存,除非主动删除 | 当前标签页会话,关闭页面就清除 |
跨标签页共享 | ✅ 同源的所有标签页共享 | ❌ 不共享,每个标签页有独立存储 |
存储大小限制 | 一般为 5~10 MB | 同样是 5~10 MB |
与 Cookie 比较 | 不随请求发送,更大容量 | 不随请求发送,更大容量 |
访问方式 | JS 脚本直接访问 | JS 脚本直接访问 |