Session
1、为什么有session?
 因为HTTP是无状态协议,每次请求服务器并不知道历史请求的记录,Session和Cookie主要就是为了弥补无状态的特性
2、Session是什么
 客户端请求时,服务端开辟一块内存空间存放Session对象,存储结构为ConcurrentHasMap
3、如何判断是同一会话
 服务器第一次收到请求时创建了Session对象,生成了一个seesionId,通过响应头的Set-Cookie:JESSIONID=XXXX命令,告知客户端要求设置Cookie
客户端收到后,在本机设置JSESSIONID=XXX的Cookie,该Cookie的过期时间为浏览器会话结束

 接下来,客户端每次向服务端发送请求时都会带上该Cookie信息,包含seesionId,服务器读取该Cookie即可获得此次请求的sessionId
4、Session有什么缺点
 A服务器存储了Session,进行负载均衡后,请求转发到了B,此时B没有A的Session,会导致Session失效
Cookies
主要用于判断两个请求是否来自于同一个浏览器,例如用户保持登录状态
Cookie主要用于下面三个目的
1、会话管理
 登录、购物车、游戏得分或者服务器应该记住的其它内容
2、个性化
 用户偏好、主题或者其他设置
3、追踪
 记录和分析用户行为
JWT和Seesion Cookies的对比

 没有保存状态时,无法进行单点登录
 JWT和Session Cookies都是用来处理不同页面切换时用户登录信息能够保存下来的机制

 使用seeionId来单点登录
什么是JWT?
通常也称为JSON令牌
 JWT主要用于下面两点
1、认证 (Authorization) 这是使用JWT最常见的一种情况,一旦用户登录,后面每个请求都会包含JWT,从而允许用户访问该令牌所允许的路由、服务和资源。单点登录时当今广泛使用JWT的一项功能,因为它的开销很小
2、信息交换 JWT是能够安全传输信息的一种方式,通过使用公钥、私钥对JWT进行签名认证
JWT的格式
Header
 Payload
 Signature

 Header:JWT的标头,一般由令牌的类型和使用的签名算法组成
{
	"alg":"HS256",
	"typ":"JWT"
}
PayLoad
Token的第二部分是PayLoad,PayLoad中包含一个声明,声明是有关实体(通常是用户)和其他数据的声明,共有三种类型的声明:
 registered,public,privatre声明
- registered声明 包含一组建议使用的预定义声明,主要包括
  
- public声明
 公共的声明,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加敏感信息
- private声明
 自定义声明,旨在在同一使用它们的各方之间共享信息,既不是注册声明也不是公共声明
 如
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
signature:
 JWT的第三个部分是一个签证信息,由三个部分组成
 header (base64后的)
 payload (base64后的)
 secret
例如
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
签名用于验证消息在此过程中没有更改
 上面的信息拼凑在一起,就得到了token
JWT和Session Cookies的不同
1、密码签名
 JWT有加密签名 Session Cookies则没有
2、JSON是无状态的
 JWT是无状态的,因为声明被存储在客户端,而不是服务端内存中
身份验证可以在本地进行,而不是在请求必须通过服务器数据库或类似位置中进行
3、可扩展性
 JWT是无状态的,可以节省服务器资源
4、JWT支持跨域认证
 Session Cookies只能用在单节点的域或者它的子域中有效,使用JWT可以进行跨域认证







![OSError: [WinError 126] 找不到指定的模块。 Error loading \torch\lib\fbgemm.dll“](https://i-blog.csdnimg.cn/direct/82138de6793b4879ba852f8b6537e4c5.png)











