概述
- http协议是应用层的超文本传输协议,用于客户端和服务器之间的通信,是无状态的,不能识别用户身份和状态
场景需求
- 需要对用户的登录状态进行验证,如果用户已经登录,允许此用户进行操作,如果用户没有登录,则必须登录后才可操作
cookie技术分析
- 针对这种需求,cookie和session技术(session基于cookie,下文统称cookie)已经可以满足,但是cookie技术是针对web浏览器–服务器架构的,这项技术的简单原理是:当用户登录某个系统时,服务器会记录此用户的登录状态并产生一个记录,大致是:{‘xxx-xxx’:‘用户信息’},并发送一个’sessionid:xxx-xxxx’给浏览器,浏览器会将sessionid存储在本地中,当再次想服务器发送请求时,会将这个sessionid一起发送给服务器,服务器则根据sessionid查找到相应的用户信息并查看登录状态,作出判断
- 可以看出,cookie技术是基于浏览器的,如果不通过浏览器访问服务器则不能使用,比如当手机的app访问服务器时,就不能使用cookie技术,此时token就来啦,值得注意的是:token几乎能用于包括浏览器、app(android,ios系统)在内的应用访问服务器
token知识点讲解
token原理
- token工作原理与cookie原理相似:
-
- 用户发送登录请求时,服务端处理并同意用户登录后,生成一个jwt结果,结果中包含过期时间,并返回给客户端,客户端进行存储
-
- 当用户发送请求时,会将之前服务器发送过来的token再和请求一起发给服务端,服务端会很据token中的信息重新生成一个token,两者比对,如果符合判定条件,则允许用户操作,如果不符合判定条件,让用户登录即可
-
- 此处token使用jwd计算
token结构:
header + payload + sigin
- header
-
- 常见格式:{‘alg’:‘HS256’, ‘typ’:‘JWT’},alg表示使用的算法,这一部分采用base64加密,但是base64很容易解密,所以这部分相当于明文,对base64加密感兴趣的小伙伴可自行了解,并不难哦
- payload
-
- 分为公有声明和私有声明,公共声明和私有声明均在同一个字典中,转成json串并用base64加密
-
- 常见公有声明:
{
'exp':xxx, # Expiration Time 此token的过期时间的时间戳
'iss':xxx,# (Issuer) Claim 指明此token的签发者
'iat':xxx, # (Issued At) Claim 指明此创建时间的时间戳
'aud':xxx, # (Audience) Claim 指明此token签发面向群体
}
** 私有声明可根据业务需求,自行决定,如:
{'username': 'wangxiaoer'}
- signature签名–token中用于识别的最重要部分,使用hash散列加密,
-
- 根据header中的alg确定 具体算法,以下以HS256为例:
HS256(自定义的key , base64后的header + ‘.’ + base64后的payload
解释:用自定义的key, 对base64后的header + ‘.’ + base64后的payload进行hmac计算
- 根据header中的alg确定 具体算法,以下以HS256为例:
jwt结果:
base64(header) + ‘.’ + base64(payload) + ‘.’ + base64(sign)
如:
b’eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c’
有兴趣的小伙伴可以自行前往jwt官网