在基于Web的单页应用(SPA)中使用OIDC/OAuth 2与授权码+ PKCE的用户认证的上下文中,可以生成随机数参数并将其发送到身份提供者以减轻重放攻击。
https://oa.dnc.global/-OpenID-Connect-Autorisation-via-un-code-Authorization-Code-Flow-.html
虽然nonce参数对于现在已经过时的隐式流是必需的,但对于授权代码流则是可选的。
如果不使用nonce参数,潜在的攻击向量是什么?
如果JWT中的nonce声明不匹配,SPA可以验证ID令牌无效,但是当攻击者可以向SPA发送有效但被盗的ID令牌时呢?
1条答案
按热度按时间3okqufwl1#
TLDR;
nonce
旨在提供针对授权代码注入攻击的保护,但在公共客户端(例如SPA)的情况下不提供这种保护。有关
nonce
参数提供的保护的说明,请查看此处:https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics#nonce_as_injection_protection
最后一段回答了您关于
nonce
专门为公共客户端(例如SPA)提供什么保护的问题:需要注意的是,nonce不保护公共客户端的授权码,因为攻击者不需要执行授权码注入攻击。相反,攻击者可以使用窃取的授权代码直接调用令牌端点。
https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics#section-4.5.3.2-4
下一节将讨论下一个问题,即“如果
nonce
参数不为公共客户端提供保护,那么我应该使用什么?“PKCE是OAuth客户端最明显的解决方案,因为它现在可用(最初用于OAuth原生应用程序),而nonce适用于OpenID Connect客户端。
https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics#section-4.5.3.3-2
现在,如果你问PKCE和
nonce
之间的区别是什么,为什么PKCE可以保护公共客户端,而nonce
不能,区别在于OAuth/OIDC流程的不同步骤。随机数由客户端生成,并与授权请求一起发送,类似于PKCE中的
code_challenge
和code_challenge_method
(可选)。OP存储值并返回authorization code
。然而,接下来的情况有所不同。使用
nonce
:authorization code
发送到OP。nonce
放入(ID
)令牌中,并返回令牌*客户端将令牌中的
nonce
值与会话存储中的值进行核对使用PKCE:
authorization code
和code_verifier
结束到OP*OP检查
code_verifier
,将其与code_challenge_method
进行转换,并检查其是否与之前接收的code_challenge
匹配。我加粗了每一个“保护发生”的步骤。使用
nonce
,客户端的负担更重,需要验证令牌中的nonce
值是否与之前创建和存储的值匹配。使用PKCE,OP执行code_verifier
转换,并将其与早期的code_challenge
进行比较。如果恶意客户端能够窃取授权代码,则无法防止该客户端获取令牌并使用它。它不必检查
nonce
参数。它不在乎。但是,使用PKCE,恶意客户端需要拥有code_verifier
,否则OP将不会返回令牌。