我有一个基本的疑问,或者显然错过了一些基本的东西。在谈论使用 API 与后端通信的 Android 应用程序时,对资源/API 的访问受到访问令牌和刷新令牌的保护(很像 OAuth 2.0)。
据我了解,这是它的工作原理:
- 用户打开应用程序并提供他的登录凭据。
- 应用程序向服务器发出 POST 请求,服务器向应用程序发出访问令牌(随机的、不可猜测的令牌)。
- 该应用程序将此访问令牌安全地存储在本地存储(sqlite db/shared 首选项等)上,并使用将此令牌与所有其他 API 调用一起发送,以让服务器知道它已被授权访问该资源。
- 现在这个访问令牌也有一个到期时间。因此,即使访问令牌被泄露,攻击窗口也会以某种方式变小。
- 现在,当这种情况发生时,它将要求用户租用他的登录凭据并再次获得授权的访问令牌,至少在移动应用程序的情况下,这是一种糟糕的(不可接受的)用户体验。
- 因此,为了解决这个问题,首先将刷新令牌与访问令牌一起发布给应用程序。这个刷新令牌是一个很长寿命的特殊令牌,它确保一旦访问令牌过期,它就会向服务器请求一个新的访问令牌,从而无需用户重新输入他的登录凭据来检索一个新的授权访问令牌。
现在我的问题是:
这如何解决我们最初的防止未经授权访问 API 的问题?在我看来,它实际上进一步促进了它。
如果访问令牌被泄露,刷新令牌很可能也会以同样的方式被泄露,不是吗?并且由于刷新令牌是一个很长寿命的令牌,攻击者将能够使用它(直到刷新令牌没有过期)来继续生成新的授权访问令牌。那是对的吗 ?
请帮助我理解这一点。