如果我有一个app
和一个api
。如果app
通过授权服务器登录并随每个请求发送authorization: Bearer xxx
标头,则api
可以在本地验证令牌。
当用户(通过身份验证服务器)注销但token
尚未过期时(如果有人检索到此token
,他们将能够发出请求(如果令牌的身份验证是在本地完成的)服务器),对吗?如果是这样,为什么这样的注销流程被认为是安全的?
编辑:澄清主要问题:如果用户注销其访问令牌仍然有效(为什么我们进行本地令牌验证),为什么PKCE流程被认为是安全的
答案 0 :(得分:1)
行为概述
与较旧的独立网络应用程序相比,使用OAuth可以将关注点分离的程度更大:
注销时:
令牌存储
令牌应存储在专用存储器或受保护的存储器中,以使攻击者无法轻松访问它们。然后,您的应用会在注销过程中删除令牌,以使攻击者无法再使用令牌。
威胁
OAuth Threat Model的一节中有一个关于被盗令牌的部分,在该部分中,我们建议使用以上存储空间并使令牌短暂存在。行业最常见的访问令牌默认值为60分钟。
恶意方窃取令牌的主要风险是通过跨站点脚本编写。 XSS风险与注销无关。应该定期进行安全测试,以确保减轻XSS风险。
安全与性能之间的平衡
UI可能会告诉授权服务器吊销了令牌。但是,API然后需要在每个API请求上调用授权服务器以检查令牌吊销。这会导致性能不佳。
API体系结构
我一直希望在OAuth安全的API中使用Claims Caching和自省功能,因为它可以提供对实际API的最佳控制以及良好的可扩展性和性能。
有了这个功能,如果您真的想使注销后的访问令牌不可用,而又不影响性能,那么您的UI可以在注销过程中执行以下操作:
答案 1 :(得分:0)
Okta / introspect可以告诉您active是否为true或false,如果您不对API https://developer.okta.com/docs/reference/api/oidc/#introspect进行抨击,则可以针对每个请求进行检查
答案 2 :(得分:0)
很难访问令牌,这可能是一个很好的理由,说明它并不是每个定义都不安全。
但是,提供注销选项是一个好主意。 OAuth2具有“吊销”功能,以确保吊销令牌:
https://tools.ietf.org/html/rfc7009
并非每个服务器都支持此功能。