抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

JWT

概念

JWT全称 Json web token,是目前最流行的跨域认证解决方案,它是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准,该token被设计为紧凑且安全,特别适合用户分布式站点的单点登录场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以被直接用于认证和加密。

compact(紧凑):由于JWT生成的token比较小,它可以通过URL,POST参数或者HTTP头部字段间发送。

self-contained(自包含):有效载荷(Playload)包含有关用户的所有必需信息,避免了多次查询数据库。

使用场景

  1. Authentication(鉴权):这是JWT最常见的情况。一旦用户登录、每个后续的请求都将包含JWT,允许用户访问该令牌允许的路由、服务、资源。
  2. 单点登录:是当今广泛使用JWT的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。
  3. Information Exchange(信息交换):JSON Web Tokens是在各方之间安全传输信息的好方式。

jwt和token的区别

token需要查库验证其是否有效,而JWT不用查库或者少查库,直接在服务端进行校验。

jwt和session

前面了解到了JWT的优点:无状态可扩展性好等,但他的缺点也很明显,例如:安全性、性能、一次性(签发了一个jwt后,在其有效期内无法被废除)、续签等问题。不同的会话认证技术都有其适合的使用场景,我个人认为JWT不适合用在单点登录和会话管理

  • 基于Session的认证,是指在客户端存储一个Session Id。认证时,请求携带Session Id,并由服务器从Session数据存储中找到对应的Session。

  • 基于Token的认证,是指将所有认证相关的信息在服务器端编码成一个Token,并由服务器签名,以确保不被篡改。

img

关于Session认证的优点好处我们也是很熟悉了,下面来了解一下Session的缺点吧。

  • CSRF代表Crossing Site Resource Forge,就是跨站域请求伪造,主要就是利用了浏览器访问对应站点会自动携带上对应站点的Cookie的问题。
  • 占用服务器端资源,服务端需要去维护用户的登录状态。
  • session是存服务器本机的,多服务器之间无法共享session状态

因此有些人为了解决这些问题引入了JWT,如果按照传统的JWT设计,它具有可扩展性无状态等优点。但老是有人使用JWT作为用户会话管理来使用,我个人觉得这个是不对的,为了实现会话管理你又把token存进服务端里,这跟session又有什么区别呢。所以下面来说一下我认为JWT适合的使用场景。

jwt的使用场景

  • 一次性验证:例如用户注册后,发送邮箱给用户激活账户,这个链接需要具备以下特性:时效断,能够标识用户,不能够篡改其信息,这里的使用场景就很适合JWT。
  • 使用 jwt 来做 restful api 的身份认证也是值得推崇的一种使用方案。客户端和服务端共享 secret;过期时间由服务端校验,客户端定时刷新。

总结

  1. 在Web应用中,别再把JWT当做session使用,绝大多数情况下,传统的cookie-session机制工作得更好。
  2. JWT适合一次性的命令认证,颁发一个有效期极短的JWT,即使暴露了危险也很小,由于每次操作都会生成新的JWT,因此也没必要保存JWT,真正实现无状态。

参考资料

JWT (JSON WEB Token)正确使用场景 - 一步之 - 博客园 (cnblogs.com)

JWT 优缺点和适合场景 - 知乎 (zhihu.com)

(8条消息) 深入理解JWT的使用场景和优劣_爱琴孩的博客-CSDN博客_jwt适用场景

JWT 续期机制 - 这,看不懂 - 博客园 (cnblogs.com)

(8条消息) JWT token过期自动续期解决方案_chen子健-CSDN博客