代码改变世界

如何判断JWT是否到期?解决方案

2020-09-22 15:33  Dorisoy  阅读(4183)  评论(0编辑  收藏  举报

首先,请注意,令牌过期和吊销是两个不同的过程。

  1. 到期仅发生在Web应用程序上,而不发生在本机移动应用程序上,因为本机应用程序永不到期。
  2. 仅当(1)使用单击网站或本机Apps上的注销按钮;(2)用户重设密码;以及 (3)用户在管理面板中明确撤销其令牌。

1.如何让JWT到期

如果JWT令牌被盗,那么永不过期的令牌是危险的,这样有人总是可以访问用户的数据。

引用JWT RFC

“ exp”(到期时间)声明标识了在其上或之后不得接受JWT进行处理的到期时间。“ exp”声明的处理要求当前日期/时间必须早于“ exp”声明中列出的到期日期/时间。

因此答案很明显,exp如果声明中的日期exp早于当前日期,则在声明中设置到期日期并在服务器端拒绝令牌

很容易,对吧?

问题是移动应用程序永不过期,例如,人们可以在一个月后重新打开该应用程序,而无需再次登录。

  1. 对于Web Apps:如果将到期时间设置为1周,则请勿在1周内使用令牌。请在不到一周的时间内使用它,并在旧令牌过期之前获取一个新令牌。例如,使浏览器在第六天发出交换新令牌的请求。这与会话和cookie的常规概念没有什么不同。

    因此,在服务器端,创建一个名为Restful的API /token/extend ,如果给定了有效的令牌,它将返回一个新的令牌。

    如果用户有一个星期不使用您的应用程序,那么下次他进入您的应用程序时,他将不得不再次登录,这很好并且被广泛接受。

  2. 对于本机移动应用程序:您可以使用上面说明的相同方法,但是现在这不是移动应用程序的工作方式,例如,用户可以在一个月不使用Facebook应用程序之后打开它,而下次打开他不需要的应用程序时重新登录。

    一种解决方案是添加命名aud为JWT令牌的受众声明,例如,使用有效负载,例如{"sub": "username", "exp": "2015-11-18T18:25:43.511Z", "aud":"iPhone-App"}在服务器端,如果令牌具有一个aud具有值字段,iPhone-App则忽略exp声明,以使令牌iPhone-App永不过期。但是,您仍然可以使用第2节中描述的方法来撤销此类令牌。

    另一个解决方案是使用永不过期的刷新令牌来获取确实过期的新JWT令牌。由于刷新令牌永不过期,如果您的手机被盗怎么办?同样,刷新令牌仍然是有效的JWT令牌,您可以使用第2节中介绍的方法撤消刷新令牌。

    通常,为了区分一个用户的不同刷新令牌,一个好的做法是将特定的设备名称放入刷新令牌中,例如{"sub": "username", "exp": "2015-11-18T18:25:43.511Z", "device":"Frank's iPhone"},这样,当用户想要撤消刷新令牌时,他可以知道正在使用此刷新令牌。在他的iPhone上。

2.如何撤销JWT令牌

有时,用户需要撤消令牌,例如,单击注销按钮或更改密码。

假设每个用户都有多个设备,例如一个浏览器,一个本机iPhone APP和一个本机Android APP。

有三种方法:

  1. 更改密钥。

    这将撤消所有用户的所有令牌,这是不可接受的。

  2. 使每个用户都有自己的机密,只需更改指定用户的机密即可。

    现在,RESTful后端不再是无状态的。每当请求进入服务器时,服务器都需要查询数据库以获取用户的秘密。

    为了获得更好的性能,我们将对存储(user, secret)在Redis中而不是MySQL中,使用username键作为键,secret将值用作值。

    这种方式将撤消一个用户的所有令牌,虽然效果更好,但仍然不够好。

  3. 将已撤销的JWT令牌存储在Redis中。

    使用令牌作为键,值始终为boolean true

    令牌将仅存储特定时间段(即声明中的时间)exp,在到期时间之后将被从Redis中删除。

    这样一次只能撤销一个令牌,完美!

    有关更多详细信息,请参阅此博客,使用Redis撤消从jsonwebtoken生成的令牌。

欢迎提出建议,如果我错了,请纠正我。

3.如何安全地使用JWT令牌

首先,始终使用HTTPS来确保通过网络传输JWT令牌是安全的。通过使用HTTPS,没有人可以通过网络嗅探用户的JWT令牌。

其次,确保JWT令牌安全地存储在用户的Android,iOS和浏览器上。

  • 对于Android,将令牌存储在KeyStore中
  • 对于iOS,将令牌存储在KeyChain中
  • 对于浏览器,请使用HttpOnlySecurecookie。曲奇饼。HttpOnly标志可防止Cookie被JavaScript访问,并防止XSS攻击。Secure标志仅允许将cookie通过HTTPS连接发送到服务器。

只要我们确保浏览器,用户设备和令牌的传输安全,就不再需要令牌吊销机制,我们仍然可以使RESTful服务保持无状态。

参考

  1. RFC 7519-JSON Web令牌(JWT)
  2. 使用Redis撤销从jsonwebtoken生成的令牌
  3. 我看不到将JWT撤销或列入黑名单的要点
  4. JSON Web令牌| 黑客新闻
  5. 将JSON Web令牌API密钥列入黑名单
  6. 单页应用程序(SPA)的基于令牌的身份验证