一.JWT是什么东西:

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

.简单地说,JWT是一个字符串,我们在发起网络请求时,将其放在header或者url中,这样可以保证传递的数据被篡改时能被我们发现,保证安全性。

二.什么时候需要用JWT:

  • Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。
  • Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWT可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。

三.jwt的结构组成:

1.JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:

  • Header  《jwt头部信息》
  • Payload  《有效载荷,包含主体信息(用户信息)》。
  • Signature  《签名哈希 ,防伪标签》

 一个典型的jwt字符串就是这样:

aaaaa.bbbbb.ccccc

样式实例:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ5YW5nLXVzZXIiLCJpYXQiOjE2NTE2Mjk3NDAsImV4cCI6MTY1MTcxNjE0MCwidWlkIjozLCJ1c2VybmFtZSI6IueniyJ9.u3jH-a3xmwChLfVKWRTxkw2ZkJUPZn306Q2NGBRE2xkC0QNMDPGAVf6ShM1PZzMh9YO8cpJGoBUvOoqWKzyjzg

以  “.”  区分三个部分的间断

四.JSON Web Tokens是如何工作的:

在认证的时候,当用户用他们的凭证成功登录以后,一个JSON Web Token将会被返回。此后,token就是用户凭证了,你必须非常小心以防止出现安全问题。一般而言,你保存令牌的时候不应该超过你所需要它的时间。

无论何时用户想要访问受保护的路由或者资源的时候,用户代理(通常是浏览器)都应该带上JWT,典型的,通常放在Authorization header中,用Bearer schema。

header应该看起来是这样的:

Authorization: Bearer

服务器上的受保护的路由将会检查Authorization header中的JWT是否有效,如果有效,则用户可以访问受保护的资源。如果JWT包含足够多的必需的数据,那么就可以减少对某些操作的数据库查询的需要,尽管可能并不总是如此。

如果token是在授权头(Authorization header)中发送的,那么跨源资源共享(CORS)将不会成为问题,因为它不使用cookie。

 

2. token验证方式:

认证流程:
首先前端将用户名和密码发送到服务端, 登录成功服务端将用户的id和其他信息作为JWT的负载,将其与头部分别进行base64编码拼接后签名, 形成一个token,返回到前端
前端保存token,并在每次发送请求时在Http请求头中加入Authorization请求头即可(axios可以统一配置)
后端拦截请求, 并通过验证签名在判断token是否是服务端签发的,如果不是则不会处理, 否则进行正常的业务逻辑,正常返回数据

 用Token的好处 :

无状态和可扩展性:Tokens存储在客户端。完全无状态,可扩展。我们的负载均衡器可以将用户传递到任意服务器,因为在任何地方都没有状态或会话信息。 - 安全:Token不是Cookie。(The token, not a cookie.)每次请求的时候Token都会被发送。而且,由于没有Cookie被发送,还有助于防止CSRF攻击。即使在你的实现中将token存储到客户端的Cookie中,这个Cookie也只是一种存储机制,而非身份认证机制。没有基于会话的信息可以操作,因为我们没有会话!

还有一点,token在一段时间以后会过期,这个时候用户需要重新登录。这有助于我们保持安全。还有一个概念叫token撤销,它允许我们根据相同的授权许可使特定的token甚至一组token无效。token过期实现将会在java代码中具体实现。