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可以进行跨域认证