如何使用 PKCE 授权流程注销?
How to log out using PKCE authorization flow?
如果我有一个 app
和一个 api
。如果 app
通过授权服务器登录并在每个请求中发送 authorization: Bearer xxx
header,则 api
可以在本地验证令牌。
当用户注销(通过身份验证服务器),但 token
尚未过期时,如果有人检索到此 token
他们将能够发出请求(如果令牌的身份验证是在本地完成的服务器),对吗?如果是这样,为什么这样的注销流程被认为是安全的?
编辑:澄清主要问题:如果用户注销时他们的访问令牌仍然有效(假设我们进行本地令牌验证),为什么 PKCE 流程被认为是安全的
Okta /introspect 可以告诉你 active 是真还是假,如果你没有猛击 API https://developer.okta.com/docs/reference/api/oidc/#introspect
,你可以检查每个请求
很难访问令牌,这可能是它不符合定义的不安全的一个很好的理由。
但是,提供注销选项是个好主意。 OAuth2 有一个 'revoke' 功能来确保令牌被撤销:
https://www.rfc-editor.org/rfc/rfc7009
不是每个服务器都支持这个。
行为概述
与旧的独立 Web 应用程序相比,OAuth 的关注点分离度更高:
- 您登录 UIs
- 这是授权服务器的外部化
- 访问令牌以固定/短生命周期发布
- 访问令牌用作API消息凭证
- 访问令牌可能会被发送到其他组件并从那里使用
当您注销时:
- 您从您的应用程序中删除令牌
- 你重定向告诉授权服务器用户不再登录任何 UI
- 这不会使访问令牌失效
令牌存储
令牌应存储在私有内存或受保护的存储中,以便攻击者无法轻易访问它们。然后,您的应用会在注销过程中删除令牌,这样攻击者就无法再尝试访问这些令牌。
威胁
OAuth Threat Model 有一个关于被盗代币的部分,其中推荐上述存储并使代币短暂存在。访问令牌最常见的行业默认值是 60 分钟。
恶意方窃取令牌的主要风险是通过跨站点脚本。 XSS 风险与注销无关。应定期执行安全测试以确保降低 XSS 风险。
安全与性能之间的平衡
UI 可能会告诉授权服务器令牌已被撤销。但是,API 然后需要在每个 API 请求上调用授权服务器来检查令牌撤销。这会导致性能不佳。
API 架构
我一直致力于在 OAuth 安全 API 中使用 Claims Caching 和自省,因为它提供了实际的 API 最佳控制,以及良好的可扩展性和性能。
有了这个,如果你真的想让访问令牌在注销后不可用,而不破坏性能,你的 UI 可以在注销过程中执行这些操作:
- 在授权服务器上撤销访问令牌(如果支持)
- 致电 APIs 要求他们删除缓存的访问令牌声明
如果我有一个 app
和一个 api
。如果 app
通过授权服务器登录并在每个请求中发送 authorization: Bearer xxx
header,则 api
可以在本地验证令牌。
当用户注销(通过身份验证服务器),但 token
尚未过期时,如果有人检索到此 token
他们将能够发出请求(如果令牌的身份验证是在本地完成的服务器),对吗?如果是这样,为什么这样的注销流程被认为是安全的?
编辑:澄清主要问题:如果用户注销时他们的访问令牌仍然有效(假设我们进行本地令牌验证),为什么 PKCE 流程被认为是安全的
Okta /introspect 可以告诉你 active 是真还是假,如果你没有猛击 API https://developer.okta.com/docs/reference/api/oidc/#introspect
,你可以检查每个请求很难访问令牌,这可能是它不符合定义的不安全的一个很好的理由。
但是,提供注销选项是个好主意。 OAuth2 有一个 'revoke' 功能来确保令牌被撤销:
https://www.rfc-editor.org/rfc/rfc7009
不是每个服务器都支持这个。
行为概述
与旧的独立 Web 应用程序相比,OAuth 的关注点分离度更高:
- 您登录 UIs
- 这是授权服务器的外部化
- 访问令牌以固定/短生命周期发布
- 访问令牌用作API消息凭证
- 访问令牌可能会被发送到其他组件并从那里使用
当您注销时:
- 您从您的应用程序中删除令牌
- 你重定向告诉授权服务器用户不再登录任何 UI
- 这不会使访问令牌失效
令牌存储
令牌应存储在私有内存或受保护的存储中,以便攻击者无法轻易访问它们。然后,您的应用会在注销过程中删除令牌,这样攻击者就无法再尝试访问这些令牌。
威胁
OAuth Threat Model 有一个关于被盗代币的部分,其中推荐上述存储并使代币短暂存在。访问令牌最常见的行业默认值是 60 分钟。
恶意方窃取令牌的主要风险是通过跨站点脚本。 XSS 风险与注销无关。应定期执行安全测试以确保降低 XSS 风险。
安全与性能之间的平衡
UI 可能会告诉授权服务器令牌已被撤销。但是,API 然后需要在每个 API 请求上调用授权服务器来检查令牌撤销。这会导致性能不佳。
API 架构
我一直致力于在 OAuth 安全 API 中使用 Claims Caching 和自省,因为它提供了实际的 API 最佳控制,以及良好的可扩展性和性能。
有了这个,如果你真的想让访问令牌在注销后不可用,而不破坏性能,你的 UI 可以在注销过程中执行这些操作:
- 在授权服务器上撤销访问令牌(如果支持)
- 致电 APIs 要求他们删除缓存的访问令牌声明