JWT
什么是JWT
Jwt(Json Web Tokern),一般用于用户认证(前后端分离/微信小程序/app开发)
用户登录,服务端给用户返回一个token(服务端不保存)。以后用户再来访问,服务端获取token后,再做token校验
优势:相较于传统的token,它无需在服务端保存token
JWT 实现
注意,jwt生成token是由三段字符串组成,并且连接起来。
后台生成token过程
-
第一段字符串,HEADER,内容包含算法和token类型
json转成成字符串后,然后做base64url加密,注意base64Url是可以解密的
{ "alg": "HS256", "typ": "JWT" } # base64Url加密后 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
-
第二段字符串,payload,自定义值
-
载荷主要分为三个部分
-
标准中注册的声明
iss: jwt签发者 sub: 面向的用户(jwt所面向的用户)
aud: 接收jwt的一方
exp: 过期时间戳(jwt的过期时间,这个过期时间必须要大于签发时间)
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
-
公共的声明
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.
-
私有的声明
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
-
payload的json转化成字符串,然后做base64Ur加密,注意base64是可以解密的,所以不要传敏感信息
{ "sub": "1234567890", #用户id "name": "John Doe", #用户名 "iat": 1516239022 #签发时间 } # base64Url加密后 eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
-
-
第三段字符串
-
第一步,第一部分和第二部分密文拼接起来
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
第二步,对前两部分密文进行HS256加密+加盐
第三步,对第二步生成的密文进行Base64url加密生成value1
-
携带token访问校验token过程
-
以后用户再来访问的时候,需要携带token,后端需要对token进行校验
获取token
-
第一步,对token进行切割
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
-
第二步,对第二段进行base64Url解密,并获取payload信息,检测token是否已经超时
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
第三步,把前两段进行拼接,并对拼接部分进行Hash256进行加密+加盐处理获取值value2
-
第四步,判断value2==base64解密(value1)
- 如果相等,则token未被修改过,认证通过
JWT缺点
JWT不仅可以用于认证,还可用于信息交换.善用JWT有助于减少服务器请求数据库的次数
生产的token可以包含基本信息,比如ID,用户昵称,头像等信息,避免再次查询数据库
存储在客户端,不占用客户端的内存资源
JWT默认不加密,但是可以加密,生成原始令牌以后,可以再次对其进行加密
当JWT未加密时,一些私密的数据无法通过JWT传输
JWT最大的缺点是服务器不会保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限,也就是说,一旦jwt签发,在有效期内将会一直有效
为了减少盗用,JWT的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证。
不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输。