OAuth 2.0定义了客户端在请求中发送的状态参数,以防止跨站请求攻击。在OpenID规范中也提到了"nonce“。除了在ID标记中返回"nonce“而不是查询参数之外,它们似乎服务于完全相同的目的。如果有人能解释为什么他们是分开的
发布于 2017-10-21 11:50:44
State和nonce似乎是相似的。但如果你深入挖掘,你会发现它们服务于不同的目的。
CSRF用于保护终端用户免受跨站点请求伪造()攻击。它是从OAuth 2.0协议RFC6749引入的。协议规定,
从最终用户获得授权后,授权服务器使用“”参数中包含的所需绑定值将最终用户的用户代理重定向回客户端。绑定值使客户端能够通过将绑定值与用户代理的身份验证状态进行匹配来验证请求的有效性
这是在授权请求中使用的。它使客户端能够验证授权响应是否未更改,并由进行身份验证的原始服务器发送。请求已发送。简而言之,它允许客户端交叉检查授权请求和响应。
(更多细节:要接受授权码响应,客户端需要接受来自授权服务器的响应(例如:-在web应用程序中,这可以通过重定向和到后端的表单post来完成)。这意味着,我们的客户端应用程序有一个打开并接受请求的端点。状态参数通过将原始授权请求绑定到响应来保护此终结点。这是CSRF保护。)
Nonce有不同的用途。它将令牌与客户端绑定。它用作令牌验证参数,是从OpenID Connect specification引入的。
nonce -用于将客户端会话与ID令牌相关联并减少重播攻击的字符串值。该值将未经修改地从身份验证请求传递到ID令牌。如果存在于ID令牌中,客户端必须验证随机数声明值是否等于身份验证请求中发送的随机数参数的值。如果存在于身份验证请求中,则授权服务器必须在ID令牌中包含一个随机数声明,该声明值是在身份验证请求中发送的随机数值。授权服务器不应对使用的nonce值执行任何其他处理。nonce值是区分大小写的字符串
正如您所看到的,nonce值来自授权请求,并由客户端生成。如果包含nonce,它将出现在令牌中。因此,客户端可以根据初始授权请求验证它收到的令牌,从而确保令牌的有效性。
此外,根据流类型的不同,随机数可以是一个强制参数。隐式流和混合流要求现时值。这两个值都是由客户端应用程序生成的生成的和验证的。
为什么不能重用状态?
如果捕获了授权请求,则恶意方可以伪造授权响应。这可以通过改变状态参数来避免。
发布于 2019-11-21 21:27:01
随机数回答浏览器的问题:这个ID令牌是对我最初请求的响应吗?
状态回答后端服务器:同意真的来自我认为是谁吗?
因此,他们回答了类似的问题,但针对不同的实体。
发布于 2019-09-22 21:12:50
我从他们的RFC中陈述了一个解释。解释很简单。
状态
客户端用来维护请求和回调之间状态的不透明值。当将用户代理重定向回客户端时,授权服务器包括此值。该参数应用于防止跨站请求伪造
随机数
随机数参数值需要包含每个会话的状态,并且攻击者无法猜到。对于Web Server客户端,实现这一点的一种方法是将加密随机值存储为HttpOnly会话cookie,并使用该值的加密散列作为随机数参数。在这种情况下,将返回的ID令牌中的nonce与会话cookie的散列进行比较,以检测第三方重放的ID令牌。适用于JavaScript客户端的相关方法是将加密随机值存储在HTML5本地存储中,并使用该值的加密散列。
引用链接:状态:https://datatracker.ietf.org/doc/html/rfc6749
随机数:https://openid.net/specs/openid-connect-core-1_0-17_orig.html
希望这能回答你的问题。
https://stackoverflow.com/questions/46844285
复制相似问题