token的引入:token是客户端频繁地向服务端请求数据,服务端频繁地向数据库查询用户名和密码并判断是否正确,由此token应运而生。
token的好处:减少服务器的压力,减少频繁向数据库查询数据,使服务器更加健壮。
什么是token?
token是服务端生成的一串字符串,用作客户端请求数据的令牌。当登陆验证通过后,服务端生成一个token返回给客户端,接下来客户端只需带着这个token请求数据即可,无需再用用户名和密码了。
token验证流程:
1.客户端用用户名和密码请求登陆。
2.服务端收到请求,对用户名和密码进行验证。
3.验证通过,服务端会生成一个token,并返回给客户端。
4.客户端收到token后可以把它存储在cookie里或Local Storage里。
5.客户端每次向服务端请求数据时都要带着这个token。
6.服务端收到请求后就去验证客户端请求里带的token是否正确,验证通过就返回给客户端请求数据。
token原理:
1.什么时JWT?
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
header:
jwt的头部承载两部分信息:
声明类型,这里是jwt,
声明加密的算法 通常直接使用 HMAC SHA256
playload:
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
signature:
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
header (base64后的)
payload (base64后的)
secret
优点
1.因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
2.因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
3.便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
4.它不需要在服务端保存会话信息, 所以它易于应用的扩展
安全相关
不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
保护好secret私钥,该私钥非常重要。
如果可以,请使用https协议。
1.将荷载payload,以及Header信息进行Base64加密,形成密文payload密文,header密文。
2.将形成的密文用句号链接起来,用服务端秘钥进行HS256加密,生成签名.
3.将前面的两个密文后面用句号链接签名形成最终的token返回给服务端。
注意:
1.用户请求时携带此token(分为三部分,header密文,payload密文,签名)到服务端,服务端解析第一部分(header密文),用Base64解密,可以知道用了什么算法进行签名,此处解析发现是HS256。
2.服务端使用原来的秘钥与密文(header密文+"."+payload密文)同样进行HS256运算,然后用生成的签名与token携带的签名进行对比,若一致说明token合法,不一致说明原文被修改。
3.判断是否过期,客户端通过用Base64解密第二部分(payload密文),可以知道荷载中授权时间,以及有效期。通过这个与当前时间对比发现token是否过期。