我正在使用 spring 并通过 HttpSessionCsrfTokenRepository 启用 csrf,我清楚地知道客户端是否将 csrf token 作为请求的 _csrf 参数或 X-CSRF-TOKEN header 发送,spring 拾取 token 并使用 token 进行验证使用generateToken(HttpServletRequest request)生成
但我的问题是 spring 在内部是如何做到这一点的。
我提出这个问题的原因是:
1.我有一个 Rest POST 调用,它获取凭据并验证 用户的身份。但是因为我想添加一个 csrf token 休息调用作为安全层我想将其添加到帖子正文中 以防止 csrf token 泄漏。
因此,如果我知道 spring security 如何在内部过滤这些 token ,那将会很有帮助。我修改了 spring 文档,但这主要是我们如何在带有隐藏字段或元标记的表单中使用 CSRF token 以及带有 header 的 Ajax 调用。
而且我也想听到对我的设计的任何评论,如果将 token 放在 body 中是好的(我确信它不是一个简单的 url 参数来泄漏 token ),或者我应该将它放在 header 。我只是不想仅仅因为它简单就倾向于使用 header 。寻找最佳解决方案。
请透露一些信息。
最佳答案
如果您想研究一下,Spring 中 CsrfTokenRepository 有多种实现。例如:
IMO 将 token 保留在标题上很好(更安全 - 可能是?),因为我能想到的几个原因..
您无法在 GET 请求的正文上设置 token 。您希望所有端点保持一致(您今天可能不需要它,但事情变化得很快)
明天如果您想更改您的身份验证模型,您不想更改您的请求正文。当请求正文发生更改时,您就违反了与客户的契约(Contract)
如果你将你的认证模型改为授权服务器,你可以在你的服务之前添加代理服务器(比如ngnix?),我们称之为auth-proxy。您可以将所有与安全相关的事情留给此身份验证代理,它会检查 header 并为您进行验证。您不希望代理查看您的请求正文,您可以专注于业务实现
- 请求正文与您的业务完全相关,因此您可以专注于它,而不是处理正文中与安全相关的事务。
- 每次为新端点创建新请求时,您都不希望在所有请求中继续添加 token
这只是我根据我的经验得出的意见。
关于java - spring如何在内部使用_csrf参数或X-CSRF-TOKEN header 验证csrf token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52068250/