JWT与权限认证

JWT与权限认证

JWT全称JSON Web Token。那么JWT是什么呢?根据官方的说法,JWT是一种开放标准(open standerd),这种标准是用来传输数据的,就像是HTTP协议一样。除此之外,JWT拥有紧凑自包含安全的特性。下面我们就来介绍一下JWT的基本结构,用途,以及它在权限认证方面与传统方式的区别。

JWT的基本组成

组成上,JWT分为三部分:头部(header),负载(payload),签名(signature),其中头部和负载部分都是JSON格式的字符串,这两部分主要用来传输数据。表现形式上,JWT就是一个超长的经过Base64编码的字符串。

JWT与权限认证

正如上图中所展示的JWT字串以.为分割符分割头部、负载与签名部分。其中头部信息主要用来阐述类型与加密算法,负载部分用来承载我们要传输的数据,签名部分用于校验。

上文中我们提到,这些字串是经过Base64编码得到的,我们知道Base64并不是一种加密算法,它是一种编码方式,所以JWT在传输中可以被任何接受方解码获取信息。所以在传输信息中,信息基本上算是明文传输的,并且官方也声称不推荐在JWT头部和负载部分传递敏感的信息

既然是明文传输,那么JWT信息的安全性是如何保障的呢?这就要说到JWT的签名部分了,JWT信息的安全性是靠签名部分来保障的。我们在生成JWT时,会将头部和负载进过Base64编码之后的内容放在一起做一个数字签名,并将其写入到JWT的签名部分。

JWT与权限认证

所以,如果有人截取了请求并修改了JWT的任何一部分,都会使JWT在校验时失败。所以经过签名的JWT可以理解为你可以任意地查看其中的内容,但是你不可以修改其中的任何一项。唯一能对JWT做更改的一方为JWT的签发方。通过这种方式就可以很好保障数据的安全性,防止被篡改。

JWT的用途

JWT的用途主要有两种,首先你可以利用JWT的安全特性来传输数据,使用JWT来传输数据可以防止数据在传输过程中被恶意篡改,从而达到安全传输的目的。其次,更常见的是你可以用JWT来做权限的验证。同时你也可以利用JWT的相关特性把它应用到一些其他的领域,这里不做过多的阐述。

JWT与权限验证

传统HTTP协议的Web应用中,在一些有特殊身份要求的资源访问中,我们需要明确请求的对象的身份信息。但是HTTP是一种无状态的请求协议。对于服务端来说,每次的请求都会被一视同仁,无差别的对待。

JWT与权限认证

但是无状态的特性不能很好的服务于一些对访问身份有限制的业务需求,所以我们需要给HTTP请求增加状态,最简单的方式就是在请求中增加Session的方式(Cookie也类似)。

JWT与权限认证

使用Session/Cookie的方式对HTTP请求进行状态标识的方法很适合一些小型的单体应用,但是一旦业务逻辑变得复杂,业务变得庞大时,我们不得不对服务进行分布式架构的拆分,那么这种基于Session/Cookie的方式还适合于分布式的架构中吗?其实有一点小问题,便是出现在Cookie/Seesion查询过程中,我们的用户信息是保存在内存中的,一旦服务拆分,不同的服务之间处于不同的进程中,进程之间又不能共享内存,所以会导致认证服务可以认证,其他服务无法获取的情况。为了解决这种情况我们可以利用一些中间件来解决,比如Redis,MemCache来作共享Session存储。

JWT与权限认证

我们在系统中引入一个共享的内存服务,就可以解决分布式系统中的Session/Cookie共享问题,但是这样的后果就是,所有需要验证的服务都需要依赖于Redis这样的中间件,而在分布式系统中,出现一个点的过度依赖是一种不好的表现,这表明被依赖的那部分将成为中心点,一旦中心点崩溃,所有依赖于中心点的服务都要歇菜。当然为了让中心点更健壮,你可以选在主从复制这样的备份设计。但是有没有更好的解决方式呢?下面就要JWT出场了。

JWT与权限认证