JWT加密及认证

因此需要对访问的客户端进行识别,常用的做法是通过机制:
客户端在服务端登陆成功之后,服务端会生成一个,返回给客户端,客户端将保存到中,再次发起请求的时候,携带中的到服务端,服务端会缓存该(会话),当客户端请求到来的时候,服务端就知道是哪个用户的请求,并将处理的结果返回给客户端,完成通信 。
通过上面的分析,可以知道存在以下问题:
1、保存在服务端,当客户访问量增加时,服务端就需要存储大量的会话,对服务器有很大的考验;
2、当服务端为集群时,用户登陆其中一台服务器,会将保存到该服务器的内存中,但是当用户的访问到其他服务器时,会无法访问,通常采用缓存一致性技术来保证可以共享,或者采用第三方缓存来保存,不方便 。
1.2 Json Web Token是怎么做的?
客户端通过用户名和密码登录服务器;
服务端对客户端身份进行验证;
服务端对该用户生成Token,返回给客户端;
客户端发起请求,需要携带该Token;
服务端收到请求后,首先验证Token,之后返回数据 。
【JWT加密及认证】客户端将Token保存到本地浏览器,一般保存到中 。
服务端不需要保存Token,只需要对Token中携带的信息进行验证即可;
无论客户端访问后台的那台服务器,只要可以通过用户信息的验证即可 。
1.3 JWT 的原理
JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样 。
{ “姓名”: “张三”, “角色”: “管理员”, “到期时间”: “2018年10月31日0点0分”}
以后,用户与服务端通信的时候,都要发回这个 JSON 对象 。服务器完全只靠这个对象认定用户身份 。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文) 。
服务器就不保存任何数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展 。
1.4 JWT 的数据结构
实际的 JWT 大概就像下面这样 。
它是一个很长的字符串,中间用点( . )分隔成三个部分 。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行 。
JWT 的三个部分依次如下 。
(头部)
(负载)

JWT加密及认证

文章插图
(签名)
写成一行,就是下面的样子 。
1.4.1
部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子 。
{ “alg”: “HS256”, “typ”: “JWT”}
上面代码中,alg属性表示签名的算法(),默认是 HMAC (写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌固定写为JWT 。
最后,将上面的 JSON 对象使用算法(详见后文)转成字符串 。
1.4.2
部分也是一个 JSON 对象,用来存放实际需要传递的数据 。JWT 规定了7个官方字段,供选用 。
iss ():签发人
exp ( time):过期时间
sub ():主题
aud ():受众
nbf (Not ):生效时间
iat ( At):签发时间
jti (JWT ID):编号
除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子 。
{ “sub”: “”, “name”: “John Doe”, “admin”: true}
注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分 。
这个 JSON 对象也要使用算法转成字符串 。
1.4.3
部分是对前两部分的签名,防止数据篡改 。
首先,需要指定一个密钥() 。这个密钥只有服务器才知道,不能泄露给用户 。然后,使用里面指定的签名算法(默认是 HMAC ),按照下面的公式产生签名 。