如何判断JWT是否到期?解决方案
2020-09-22 15:33 Dorisoy 阅读(4183) 评论(0) 编辑 收藏 举报首先,请注意,令牌过期和吊销是两个不同的过程。
- 到期仅发生在Web应用程序上,而不发生在本机移动应用程序上,因为本机应用程序永不到期。
- 仅当(1)使用单击网站或本机Apps上的注销按钮;(2)用户重设密码;以及 (3)用户在管理面板中明确撤销其令牌。
1.如何让JWT到期
如果JWT令牌被盗,那么永不过期的令牌是危险的,这样有人总是可以访问用户的数据。
引用JWT RFC:
“ exp”(到期时间)声明标识了在其上或之后不得接受JWT进行处理的到期时间。“ exp”声明的处理要求当前日期/时间必须早于“ exp”声明中列出的到期日期/时间。
因此答案很明显,exp
如果声明中的日期exp
早于当前日期,则在声明中设置到期日期并在服务器端拒绝令牌。
很容易,对吧?
问题是移动应用程序永不过期,例如,人们可以在一个月后重新打开该应用程序,而无需再次登录。
-
对于Web Apps:如果将到期时间设置为1周,则请勿在1周内使用令牌。请在不到一周的时间内使用它,并在旧令牌过期之前获取一个新令牌。例如,使浏览器在第六天发出交换新令牌的请求。这与会话和cookie的常规概念没有什么不同。
因此,在服务器端,创建一个名为Restful的API
/token/extend
,如果给定了有效的令牌,它将返回一个新的令牌。如果用户有一个星期不使用您的应用程序,那么下次他进入您的应用程序时,他将不得不再次登录,这很好并且被广泛接受。
-
对于本机移动应用程序:您可以使用上面说明的相同方法,但是现在这不是移动应用程序的工作方式,例如,用户可以在一个月不使用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。
有三种方法:
-
更改密钥。
这将撤消所有用户的所有令牌,这是不可接受的。
-
使每个用户都有自己的机密,只需更改指定用户的机密即可。
现在,RESTful后端不再是无状态的。每当请求进入服务器时,服务器都需要查询数据库以获取用户的秘密。
为了获得更好的性能,我们将对存储
(user, secret)
在Redis中而不是MySQL中,使用username
键作为键,secret
将值用作值。这种方式将撤消一个用户的所有令牌,虽然效果更好,但仍然不够好。
-
将已撤销的JWT令牌存储在Redis中。
使用令牌作为键,值始终为boolean
true
。令牌将仅存储特定时间段(即声明中的时间)
exp
,在到期时间之后将被从Redis中删除。这样一次只能撤销一个令牌,完美!
有关更多详细信息,请参阅此博客,使用Redis撤消从jsonwebtoken生成的令牌。
欢迎提出建议,如果我错了,请纠正我。
3.如何安全地使用JWT令牌
首先,始终使用HTTPS来确保通过网络传输JWT令牌是安全的。通过使用HTTPS,没有人可以通过网络嗅探用户的JWT令牌。
其次,确保JWT令牌安全地存储在用户的Android,iOS和浏览器上。
- 对于Android,将令牌存储在KeyStore中
- 对于iOS,将令牌存储在KeyChain中
- 对于浏览器,请使用
HttpOnly
和Secure
cookie。曲奇饼。该HttpOnly
标志可防止Cookie被JavaScript访问,并防止XSS攻击。该Secure
标志仅允许将cookie通过HTTPS连接发送到服务器。
只要我们确保浏览器,用户设备和令牌的传输安全,就不再需要令牌吊销机制,我们仍然可以使RESTful服务保持无状态。