大家好,我是IT修真院武汉分院第12期学员,一枚正直善良的JAVA程序员。
今天给大家分享一下,修真院官网JAVA任务5中,所用到的JWT生成Token
一、背景介绍
由于HTTP协议是无状态的协议,因此用户登陆后保持登陆状态就是第一个需要解决的问题
在传统的用户登录认证中,因为http是无状态的,所以都是采用session方式。当用户登录成功,服务端会保存一个session,会给客户端一个sessionId客户端会把sessionId保存在cookie中,每次请求都会携带这个sessionId。
cookie+session这种模式通常是保存在内存中,而且服务从单服务到多服务会面临的session共享问题,随着用户量的增多,开销就会越大。而JWT不是这样的,只需要服务端生成token,客户端保存这个token,每次请求携带这个token,服务端认证解析就可
二.知识剖析
1. JWT的构成
由,header(头部),payload(载荷),signature(签证)
header(头部)
jwt的头部承载两部分信息:
{' typ': 'JWT', 'alg': 'HS256'}
payload(载荷)
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
signature(签证)
header (base64后的)
payload (base64后的)
secret
这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。
JWT的流程:
①首先用户通过用户名密码向认证服务器发起请求②认证服务器核实用户身份之后,生成一个Token返回到客户端,这个生成过程如下:首先构造称为header的JSON对象:{"typ":"JWT",
"alg":"HS256}
这个JSON包含两个字段,typ表示Token的类型,一般情况下为JWT,alg表示签名算法,这里我们使用HMACSHA256算法。
接着是payload部分,认证服务器验证密码后找到用户的ID,将其放入payload,并且给定一个过期时间:接着我们把header和payload分别使用base64算法编码,然后用点号连接起来,并且使用私钥和HS256算法进行签名。
通过以上的过程,认证服务器将jwt返回的客户端,格式如下:aaaa.bbbb.cccc
3.常见的问题
1.JWT可以放在那里?2.JWT的适用场景
4.解决办法
1.JWT可以放在那里?
1.html5存储:localStorage or sessionStorage (Web Storage)
2.放置cookies中
相同对比:
相同点:都是无状态的,因为api所需要的验证信息都在token中<br>
不同点:1.前者可使用跨站点脚本(XSS)进行攻击,cross-site scripting (XSS) attacks。所以,Web存储在传输过程中不执行任何安全标准
2.Cookie与HttpOnly cookie标志一起使用时,不能通过JavaScript访问,并且不受XSS影响。但是传统的cookies不符合RESTful最佳实践,因为需要服务器存储。cookies+JWT不需要将状态存储在服务器上
JWT的适用场景
5.编码实战
6.扩展思考
1。jwt token防止泄露1.每次请求刷新 jwt
2.只要快要过期的时候刷新 jwt