JSON Web Token(JWT)是一个开放的标准(RFC 7519),它定义了一个紧凑且自包含的方式,用于在各方之间做为 JSON 对象安全地传输信息。因为此信息是通过数字签名的,所以能够被验证和信任。java
今天咱们就来简单的认识一下 JSON Web Token。算法
首先须要说明 JSON Web Token 是能够用于认证的,那么就先来对比一下 JSON Web Token 认证和 传统的 session 认证的区别,传统的 session 认证是有状态的,也就是说咱们须要在服务端保存用户的认证信息,若是服务端从新或者换一台服务器,那么这个认证就失效了,而且传统的 session 的认证方式扩展起来不是那么的容易。安全
基于 JSON Web Token 的鉴权机制相似于 http 协议,是一种无状态的,服务器不须要保存用户的认证信息或者会话信息,这也就意味着 JWT 认证机制的应用不须要去考虑用户在哪一台服务器登陆了,这就为应用的扩展提供了便利,也是因为这个特性,JWT 在微服务架构中应用普遍。服务器
一个 JSON Web Token 实际上就是一个字符串,它由三部分组成:头部、载荷与签名,以下图所示:微信
头部用于描述关于该 JSON Web Token 的最基本的信息,例如其类型以及签名所用的算法等,一般以下所示:session
{ "alg": "HS256", "typ": "JWT" }
头部通常使用 base64 加密,加密后密文:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9架构
载荷是 JSON Web Token 的主体内容部分,里面存放一些有效信息,JSON Web Token 标准定义中定义了如下 5 个字段:微服务
除了标准定义中的字段外,咱们还能够自定义字段,好比在 JWT 中,咱们的载荷信息可能以下:学习
{ "sub": "1234567890", "name": "pingtouge", "admin": true }
咱们须要注意,在默认状况下 JWT 是未加密的,每个人均可以读取其内容,所以在载荷中,不要存放私密信息,防止信息泄露。编码
签名是 JSON Web Token 中比较重要的一部分,前面两部分都是使用 Base64 进行编码的,signature 须要使用编码后的 header 和 payload 以及咱们提供的一个密钥,而后使用 header 中指定的签名算法(HS256)进行签名,签名的做用是保证 JWT 没有被篡改过。
为何须要签名?
对于加密算法来讲,碰撞几率仍是比较小的,通常而言,不一样的输入加密后的输出是不同的,不一样输入产生相同结果的几率仍是至关小的,因此能够利用加密算法的这个特性来判断 JWT 是否被篡改过。
假若有人篡改了载荷中的信息,再进行编码的话,那么新的头部和载荷的签名跟以前的签名是不同的,而且如何加密的密钥不同的话,得出来的签名结果也会不同。
这是使用JWT最多见的状况。 一旦用户登陆,每一个后续请求都将包含JWT,容许用户访问该令牌容许的路由,服务和资源。 单点登陆是当今普遍使用JWT的一项功能,由于它的开销很小,而且可以轻松地跨不一样域使用。
JSON Web Tokens是在各方之间安全传输信息的好方式。 由于JWT能够签名:例如使用公钥/私钥对,因此能够肯定发件人是他们自称的人。 此外,因为使用标头和有效载荷计算签名,所以您还能够验证内容是否未被篡改。
以上就是 JSON Web Token 相关知识,但愿这篇文章对您的学习或者工做有所帮助,若是您以为文章有帮助,欢迎帮忙转发,谢谢。
目前互联网上不少大佬都有 JSON Web Token 相关文章,若有雷同,请多多包涵了。原创不易,码字不易,还但愿你们多多支持。若文中有所错误之处,还望提出,谢谢。
欢迎扫码关注微信公众号:「互联网平头哥」,和平头哥一块儿学习,一块儿进步。