刷新令牌有何帮助?

信息安全 移动的 安卓 oauth 授权 api
2021-08-29 00:44:38

我有一个基本的疑问,或者显然错过了一些基本的东西。在谈论使用 API 与后端通信的 Android 应用程序时,对资源/API 的访问受到访问令牌和刷新令牌的保护(很像 OAuth 2.0)。

据我了解,这是它的工作原理:

  1. 用户打开应用程序并提供他的登录凭据。
  2. 应用程序向服务器发出 POST 请求,服务器向应用程序发出访问令牌(随机的、不可猜测的令牌)。
  3. 该应用程序将此访问令牌安全地存储在本地存储(sqlite db/shared 首选项等)上,并使用将此令牌与所有其他 API 调用一起发送,以让服务器知道它已被授权访问该资源。
  4. 现在这个访问令牌也有一个到期时间。因此,即使访问令牌被泄露,攻击窗口也会以某种方式变小。
  5. 现在,当这种情况发生时,它将要求用户租用他的登录凭据并再次获得授权的访问令牌,至少在移动应用程序的情况下,这是一种糟糕的(不可接受的)用户体验。
  6. 因此,为了解决这个问题,首先将刷新令牌与访问令牌一起发布给应用程序。这个刷新令牌是一个很长寿命的特殊令牌,它确保一旦访问令牌过期,它就会向服务器请求一个新的访问令牌,从而无需用户重新输入他的登录凭据来检索一个新的授权访问令牌。

现在我的问题是:

这如何解决我们最初的防止未经授权访问 API 的问题?在我看来,它实际上进一步促进了它。

如果访问令牌被泄露,刷新令牌很可能也会以同样的方式被泄露,不是吗?并且由于刷新令牌是一个很长寿命的令牌,攻击者将能够使用它(直到刷新令牌没有过期)来继续生成新的授权访问令牌。那是对的吗 ?

请帮助我理解这一点。

1个回答

刷新令牌的主要优点是更容易检测它是否被泄露。

考虑以下两种情况:

  1. 使用单个持久的身份验证令牌。
  2. 使用短期身份验证令牌,并且一旦前一个身份验证令牌过期,长期刷新令牌会定期请求新的身份验证令牌。

在场景 1 中,如果身份验证令牌被泄露,任何人都很难检测到这一点,并且未经授权的访问可能会无限期地继续下去。

在场景 2 中,如果只有 auth 令牌被破坏(刷新令牌也没有被破坏),它只能持续到令牌过期。

在场景 2 中,如果刷新令牌遭到破坏,一旦调用了刷新令牌,使用该刷新令牌生成的所有其他身份验证令牌都将失效,因此一次只能有 1 方使用 api(每个刷新令牌)。这会导致多个用户通过生成新的身份验证令牌反复使彼此的身份验证令牌无效。api 可以检测到违规,因为在 auth 令牌到期之前进行了刷新,并且知道立即撤销刷新令牌。