
在上一篇文章中,我讨论了JWT
的基础知识。 如果您动手,那么这只是我们打开私人资源之门的钥匙。 但是,如果这个钥匙被偷了(更确切地说,他们将复制一个钥匙)。 然后,其他人将能够使用您的名字登录服务器,而我们甚至可能不知道它。 我们不想允许这种情况。 但是该怎么办?
增加安全性
我建议读者在独立进行之前,先考虑一下我们可以利用安全性做什么。
这里有一些可以提高安全性的方法。 您可以在评论中写下其他方法的存在-我将添加它们。
- 使用
https
协议,可保护Internet上的数据通道。 实际上,这是对http
的包装,它附加了其他加密协议SSL
和TLS
- 将
IP
信息添加到payload
。 这样,其他IP
的令牌将无法通过验证。 但是IP
可能是伪造的,以及如何处理动态IP
地址或当用户从咖啡馆或地铁中的电话进行连接时是伪造的。 因此,我们将不会使用这种方法。 - 使用
RS256
。 这确保了私钥本身的安全性。 但是使用令牌,一切都将保持绝对不变。 当我们害怕将密钥传递给其他服务器时,我们需要RS256
,这可能是不可靠的。 我们仅向他们提供令牌身份验证工具,这对于攻击者绝对是无用的。 - 使用短期令牌。 但随后,用户将在每次到期时重新登录。 用户迟早会感到无聊,并且会离开我们的资源。
- 但是,如果您仍然使用短期令牌但又给了另一个令牌,而该令牌的目的只是在没有新授权的情况下获得新的短期令牌,该怎么办? 这样的令牌称为“刷新令牌”,并且只能使用一次。 这将是我的文章。
回想一下JWT是什么
JWT
利用了JWS
(签名)和JWE
(加密)编码JWE
。 签名不允许某人在没有有关秘钥的信息的情况下伪造令牌,并且编码可以防止第三方读取数据。
让我们看看它们如何帮助我们在网站上对用户进行身份验证和授权。
认证方式 在本例中,我们检查登录名+密码是否与用户数据数据库中的条目匹配。
授权 (英文授权-许可,授权)-向用户提供执行某些操作的权利; 以及尝试执行这些操作时检查(确认)这些权限的过程。
换句话说,身份验证检查用户的合法性,然后,如果一切正常,则该用户将被授权,即,他可以对数据库执行允许的操作。 通常,这两个过程结合在一起,因此存在众所周知的混乱。
代币类型
- 访问令牌(JWT)是可用于访问受保护资源的令牌。 它们是短暂的 ,但是可以重用 。 它们可能包含其他信息,例如生存期或请求来自的
IP
地址。 这完全取决于开发人员的需求。 - 刷新令牌(RT) -这些令牌仅执行一项特定任务-获取新的访问令牌。 这次您将离不开授权服务器。 它们是长寿的 ,但可以丢弃 。
主要用例是这样的:旧的JWT
过期后,我们将不再能够接收它的私有数据,然后我们发送RT
并收到一对新的JWT+RT
。 有了新的JWT
我们可以再次使用私有资源。 当然,刷新令牌也可能会变坏,但不会很快发生,因为他的寿命比哥哥长得多。

令牌分离的关键思想是, 一方面 ,授权令牌使我们能够简单地通过比较签名来轻松验证没有授权服务器的用户。
const validateToken = token => { const [ header, payload, signature ] = token.split('.'); return signature === HS256(`${header}.${payload}`, SECRET_KEY); }
另一方面 ,我们可以进行
,从而无需输入用户密码即可更新访问令牌,但是在这种情况下,我们仍然需要执行昂贵的访问授权服务器的操作。
总结
通过这种方法,我们减少了访问latency
服务器的时间延迟,并且服务器逻辑本身变得更加简单。 从安全的角度来看,如果访问令牌被盗,我们将只能在有限的时间内使用它-不会超过其使用寿命。 为了使攻击者能够使用更长的时间,他还需要窃取刷新,但随后,真正的用户将知道自己已被黑客入侵,因为他将被扔出系统。 这样的用户再次登录后,将收到更新的JWT+RT
对,被盗的用户将变成南瓜。
有用的链接
- 如果我有访问令牌,为什么需要刷新令牌?
- 刷新令牌:何时使用它们以及它们如何与JWT交互
- 更多OAuth 2.0惊喜:刷新令牌