cookie (有状态,保存了用户的状态信息)
- 以明文形式存储再客户端含用户信息的文件
- 每次http请求都会带上cookie
- 服务端生成
- 不可跨域
cookie生成规则:
session(cookie升级版,有状态,服务端保存session信息判断用户登录状态)
- 服务器生成session信息,会传给客户端一个sessionId
- 客户端将sessionId放在cookie中传给服务端
- 会失效
- 存储内容变小(只存sessionId),提高带宽
- 不可跨域
- 数据信息需要存储在数据库中
session生成规则:
token(无状态,服务端不会保存身份认证信息)
- 客户端将加密信息(用户名、密码)和签名发送到服务端,服务端将数据加密返回token
- 每次http请求,客户端带上token进行解密,判断是否有效
- 无状态,服务端不存储token,只需解析token串获取用户信息,减轻查询数据库压力
token生成规则:
token可以低于csrf攻击,cookie和session不行
csrf攻击:跨站请求伪造,利用用户已经登陆的身份,构建了一个恶意请求。
cookie和session:每次请求浏览器会默认带上,所以每次请求的时候包含了用户信息,可以对伪造的请求进行访问。
token:浏览器不会默认带上
session和token怎么支持分布式
session是有状态的,在分布式情况下需要每台服务器都知道session。
session分布式情况下的常见策略:
- session保持:也叫会话保持,保证用户每次请求都打到具体的一台机器
- 案例:nginx提供了ip_hash。通过请求ip计算出一个hash值,映射到具体的一台服务器上。
- session复制:将session复制到所有服务器上。
- 案例:tomcat基于IP组播完成session复制
- session共享:session存数据库。
- 案例:存储在redis中。
token是无状态的,所以天然的支持分布式。服务端不会存储token信息,服务端通过客户端传来的token进行计算,判断请求是否合法。