JWT
JWT是什么?
Json web token (JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可以直接被用于认证,也可以加密。
传统的登录保持与接口权限是如何实现的?
- 用户向服务器发送用户名和密码。
- 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
- 服务器向用户返回一个session_id,写入用户Cookie。
- 用户随后的每一次请求,都会通过Cookie,将session_id传回服务器。
- 服务器收到session_id,找到前期保存的数据,由此得知用户的身份。
JWT的数据结构
![](http://upload-images.jianshu.io/upload_images/16624198-a474ab6d3214efba.png?imageMogr2/auto-orient/strip|imageView2/2/w/235/format/webp)
image.png
![](http://upload-images.jianshu.io/upload_images/16624198-0d09a4c34bfc1d04.png?imageMogr2/auto-orient/strip|imageView2/2/w/272/format/webp)
image.png
![](http://upload-images.jianshu.io/upload_images/16624198-ca31e8c658518a2e.png?imageMogr2/auto-orient/strip|imageView2/2/w/366/format/webp)
image.png
组成
![](http://upload-images.jianshu.io/upload_images/16624198-8ae24967702e6dc2.png?imageMogr2/auto-orient/strip|imageView2/2/w/283/format/webp)
image.png
JWT的特点
- JWT默认是不加密,但也是可以加密的。生成原始Token以后,可以用密钥在加密一次。
- JWT不加密的情况下,不能将秘密数据写入JWT。
- JWT不仅可以用于认证,也可以用于交换信息。有效使用JWT,可以降低服务器查询数据库的次数。
- JWT的最大缺点是,由服务器不保存session状态,因此无法在使用过程中废止某个token,或者更改token权限。也就是说,一旦JWT签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
- JWT本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
- 为了减少盗用,JWT不应该使用HTTP协议明码传输,要使用HTTPS协议传输。
RBAC权限模型
基于权限的关系通用模型
![](http://upload-images.jianshu.io/upload_images/16624198-b8a322f591edeb12.png?imageMogr2/auto-orient/strip|imageView2/2/w/766/format/webp)
image.png
RBAC模块功能
![](http://upload-images.jianshu.io/upload_images/16624198-eef78ed5007dc78d.png?imageMogr2/auto-orient/strip|imageView2/2/w/809/format/webp)
image.png
RBAC权限控制流程
![](http://upload-images.jianshu.io/upload_images/16624198-7b9d869c29f6f7e0.png?imageMogr2/auto-orient/strip|imageView2/2/w/512/format/webp)
image.png