JSON Web Token(简称JWT),是一个开放安全的行业标准,可以用于多个系统之间传递安全可靠的信息(也包括本文中将要用到的传递身份认证信息的场景)。
一个JWT的token字符串组成如下:
1)红色的为Header:指定token类型与签名类型;
2)紫色的为载荷(playload):存储用户id等关键信息;
3)蓝色的为签名:保证整个信息的完整性、可靠性(这个签名字符串,相当于是一段被加密了的密文文本,安全性就是由它来决定的)。
JWT的头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。
这可以被表示成一个JSON对象:
{
"typ": "JWT",
"alg": "HS256"
}
▲ 在这个头信息里,标明了这是一个JWT字符串,并且所用的签名算法是HS256算法
在载荷(playload)中可以定义以下属性:
1)iss: 该JWT的签发者;
2)sub: 该JWT所面向的用户;
3)aud: 接收该JWT的一方;
4)exp(expires): 什么时候过期,这里是一个Unix时间戳;
5)iat(issued at): 在什么时候签发的。
上面的信息也可以用一个JSON对象来描述,将上面的JSON对象进行base64编码,可以得到下面的字符串。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询
JWT的签名部分,在官方文档中是如下描述的:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
上述伪码的意义,即如下操作:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIyOWZmMDE5OGJlOGM0YzNlYTZlZTA4YjE1MGRhNTU0NC1XRUIiLCJleHAiOjE1MjI0OTE5MTV9
▲ 将上面的两个base64编码后的字符串都用句号‘.’连接在一起(头部在前),就形成了如下字符串
最后,我们将上面拼接完的字符串用HS256算法进行加密。在加密的时候,我们还需要提供一个密钥(secret)。
那么,按照RFC7519上描述的方法,就可以得到我们加密后的内容:
P-k-vIzxElzyzFbzR4tUxAAET8xT9EP49b7hpcPazd0
▲ 这个就是我们需要的JWT的签名部分了
生成JWT的token字符串的最后一步签名过程,实际上是对头部以及载荷内容进行加密。
一般而言:加密算法对于不同的输入产生的输出总是不一样的。所以,如果有人对头部以及载荷的内容解码之后进行修改,再进行编码的话,那么新的头部和载荷的签名和之前的签名就将是不一样的。而且,如果不知道服务器加密的时候用的密钥的话,得出来的签名也一定会是不一样的。
换句话说:你的JWT字符串的安全强度,基本上就是由这个签名部分来决定的。
使用时:服务器端在接受到JWT的token字符串后,会首先用开发者指明的secret(可以理解为密码)对头部和载荷的内容用同一算法再次签名。那么服务器应用是怎么知道我们用的是哪一种算法呢?别忘了,我们在JWT的头部中已经用alg字段指明了我们的加密算法了。
如果服务器端对头部和载荷再次以同样方法签名之后发现,自己计算出来的签名和接受到的签名不一样,那么就说明这个Token的内容被别人动过的,我们应该拒绝这个JWT Token,返回一个HTTP 401 Unauthorized响应。
JWT的整个技术原理,就是一个很典型的对称加密应用过程,通俗的说也就是用开发者在服务端保存的密码,对用户的id等信息进行加密并按照JWT的规则(见5.1节)组成字符串返回给用户。用户在使用时将这个字符串提交给对应的服务端,服务端取出JWT字串的头信息、载荷,用开发者指明的密码试着进行加密并得到一个字符串(即合法的JWT token),两相比较,相同则认为用户提交上来的JWT合法,否则不合法。这就是JWT的全部原理,相当简单易懂。
JWT技术的价值不在于具体的技术实现,而在于它的思想本身,尤其在异构系统、分布式系统方面,可以极大的简化安全认证的成本,包括简化架构复杂性、降低使用门槛等,因为JWT的技术原理决定了认证的过程不需要其它系统的参与,由当前实例自已就可以完成,而成认证代码极小(就是一个加密字符串的比较而已)。
当然,我们之所以选择JWT技术,主要看重的还是它简单易用,但或许正因为如此,某种程度上来说这也恰是居致它的缺点的原因所在。
JWT技术的缺点及建议的解决方法主要有:
1)JWT的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消token或更改token的权限。也就是说,一旦JWT签发,在有效期内将会一直有效;
2)JWT本身包含认证信息(即你在第5.1节中看到的头信息、负载信息),因此一旦信息泄露,任何人都可以获得token的所有权限。为了减少盗用,JWT的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证;
3)为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS(SSL)协议进行传输。
网友评论