JWT 简介

以JWT 代替传统Token

JSON Web Token (JWT)是由Auth0所提构出的一个新Token想法,这并不是一套软件、也不是一个技术,如果你在做网站时有用Token验证使用者身份的习惯,那么这个方法你应该很快就能上手。我们先来讲一讲为什么JWT会比传统Token要好。

JWT 简介

在传统网站中我们会以Session 来判定使用者是否有登入,由于Session 只会被服务端知道,所以我们就可以Session 中存放一些重要数据并且供之后验证用。

 

为什么不用Session了?

随着网络的扩展,Session 有个问题,那就是具状态性(Stateful)还有容易受跨网域请求伪造攻击(CSRF Attack)。 先让我们先以具状态性的问题为例。

 

极具状态性

假设今天有两台服务器通过负载均衡来分派使用者的请求,由于Session是储存在服务端上的,第一次使用者登入时是由Server 1处理,那么这个Session自然也就储存在Server 1 。

JWT 简介

但下次负载平衡指派使用者到Server 2 的时候呢? 这个Session也就不存在 ,所以使用者就需要重新登入一次(虽然有办法可解决,但暂不讨论)。

 

易受跨站请求伪造攻击

由于Session是储存在服务端的,这意味着客户端在发送请求时几乎不用提供什么数据,对吧? 如果今天有人发送了一个删除文章的链接给你,然后你在不知情的情况下就按下去的时候会发生什么事情? 你的文章会这样被删除掉。

为此,有人想出了Token 来解决这个问题,并且能够在多个服务器上跨域使用。

 

Token解决了什么?

当使用者登入成功时,他会得到一串看起来毫无意义的乱数字串,但这个字串实际上会对应到数据库中使用者的身份,简单说就是另类的帐号,这也被叫做Token。

 

无状态性

Token本身是不携带数据的且无状态性的(Stateless),当服务器接收到Token时,会主动去数据库中找到使用者的数据表,接着就能够知道这个Token代表着哪个使用者,然后获取相关的数据来使用。

JWT 简介

由于多个服务器都是共享一个数据库的,所以我们的服务器现在不会有Session 那样的问题。 但需要注意的是Token 不可以让别人知道,否则别人就能够拥有你的身份、伪造成你。

 

安全性提高

由于使用者现在必须主动提供 Token,也顺带解决了跨网域请求伪造攻击,如果今天朋友再次给了你删除文章的链接,由于这个链接并不带有 Token,服务器也就不能知道是谁想要删除文章,所以这个动作自然就会变成无效。

 

为什么要用JWT 取代传统Token?

你能够直接在JWT 中存放数据,而不用额外的查询数据库。

当我们使用传统Token时,我们需要查询数据库并且比对这一个Token是谁的,然后我们才能够取得该使用者的数据。 当有大量使用者涌入时,这可能会让服务器负荷不堪。

而JWT解决了这个问题,因为我们可以直接把使用者数据存放在「Token」中,所以也就省去了额外的数据库开销。 且在微服务架构中也能够方便地获取使用者数据。

到这里你可能会开始想:「 这样不是很危险吗? 」、「 如果使用者自行修改了Token该怎么办? 」,而我们接下来就要讲一下什么是JWT。

 

什么是JSON Web Token(JWT)?

先看看JWT 的长相吧。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywsfs.html