Oauth 2.0 用于csrf保护的OAuth 2.0状态参数

Oauth 2.0 用于csrf保护的OAuth 2.0状态参数,oauth-2.0,authorization,csrf,csrf-token,Oauth 2.0,Authorization,Csrf,Csrf Token,我对授权码授权流程有一些疑问。 我知道oauth2的第一部分是发送https://auth.server/oauth2/auth?scope= &重定向\u uri=https://app.example.com/oauth2/callback &响应类型=代码和客户id=123和状态=af0ifjsldkj 我对状态参数感到困惑。我知道状态参数是为了防止csrf的攻击。但是我应该在哪里保存这个参数呢?如果将其保存到auth server的会话中,如何在以下步骤中验证状态 https://app

我对授权码授权流程有一些疑问。 我知道oauth2的第一部分是发送
https://auth.server/oauth2/auth?scope= &重定向\u uri=https://app.example.com/oauth2/callback &响应类型=代码和客户id=123和状态=af0ifjsldkj

我对状态参数感到困惑。我知道状态参数是为了防止csrf的攻击。但是我应该在哪里保存这个参数呢?如果将其保存到auth server的会话中,如何在以下步骤中验证状态

https://app.example.com/oauth2/callback?
code=MsCeLvIaQm6bTrgtp7&state=af0ifjsldkj

如何验证app.example.com中的状态参数,但状态参数保存在auth server的会话中?

您的技术堆栈的安全库应该为您管理此功能,并且状态将保存在您的应用程序中:

  • 对于单页应用程序,通常将状态保存到本地存储
  • 对于服务器端web应用程序,通常使用仅限HTTP的临时cookie
身份验证服务器的唯一任务是确保它在对应用程序的响应中返回与从应用程序的请求中接收到的状态相同的状态。任何现成的身份验证服务器都可以为您完成此任务

在中直观地总结了行为。在我的例子中,我使用SPA,OIDC客户端库管理验证响应状态

因此,我的应用受到CSRF攻击的保护。如果有人将此粘贴到浏览器地址栏中,我的应用程序将不会尝试处理授权代码:


但正如您提到的cookie,为什么不使用会话呢?根据OAuth标准,状态将保存在客户端/UI中,并在那里进行验证,以防止某种类型的替换攻击。在某些情况下,身份验证服务器确实会在其会话中存储状态,例如用于PKCE保护,尽管这可以防止不同的攻击。本文将更详细地讨论这些方面。