这个 JWT 实现是不是可以防止 XSS 和 CSRF 攻击,同时仍然允许我访问有效负载?
Posted
技术标签:
【中文标题】这个 JWT 实现是不是可以防止 XSS 和 CSRF 攻击,同时仍然允许我访问有效负载?【英文标题】:Does this JWT implementation prevent XSS and CSRF attacks while still giving me access to payloads?这个 JWT 实现是否可以防止 XSS 和 CSRF 攻击,同时仍然允许我访问有效负载? 【发布时间】:2020-11-15 15:39:18 【问题描述】:我正在为我的网络应用程序实施 JWT 身份验证和授权,并且可以使用一些帮助来识别我的方法中的漏洞。我见过很多方法,只是简单地说将访问令牌设置为 httpOnly cookie,但是,我的访问令牌中有我的前端需要访问的声明。我想出了这种方法来解决这个问题。
登录时,用户提供用户名和密码以换取几项:
-
CSRF 令牌
JWT 访问令牌的标头和签名
JWT 访问令牌的负载
JWT 刷新令牌
在我的方法中,所有这些项目都设置为 cookie。 JWT 刷新令牌以及 JWT 访问令牌的标头和签名都存储在 httpOnly 安全 cookie 中。 JWT 访问令牌的有效负载只是存储为常规的旧 cookie,以便我的前端可以访问它(我没有在此令牌中存储任何个人/不安全信息)。
例如,如果我的 JWT 访问令牌是 header.payload.signature
,那么我将我的访问令牌拆分为 header.signature
和 payload
。这些值存储在各自的 cookie 中。
是时候发出一个需要授权的请求了,我的后端会抓取所有 JWT 访问令牌 cookie,将它们重新组合在一起,然后检查签名。
这种方法能否缓解 XSS 和 CSRF 攻击,同时仍提供对 JWT 有效负载的安全访问?
【问题讨论】:
我明白你想在这里放什么。您想使用 httpOnly 选项存储 cookie,但是您无法访问前面的令牌并解码有效负载,这就是 JWT 令牌有用的原因(提供额外的有效负载)。我面临同样的问题。我认为这是你必须做出的权衡。但只要您不存储任何敏感信息,我认为您的方法就足够了。 【参考方案1】:JWT Token 用于身份验证。它生成并存储在客户端中,当它过期时会发出新的令牌。
CSRF 可以是基于会话或基于请求的不同类型。
我不认为 JWT 可以替代 CSRF、XSS
【讨论】:
对不起,这个答案与提出的问题无关。【参考方案2】:听起来这行不通。从根本上说,您的代码可以访问的任何内容,攻击者代码也可以访问。所以,你不想要任何“我的前端可以访问”的东西。在我看来,唯一能提供最佳覆盖率的组合:
HttpOnly+Secure+SameSite cookie (Mozilla docs) 使用 CSRF 令牌保护 POST/PUT/DELETE 防止注入脚本的内容安全策略除此之外,越简单越好。试图推出一个聪明的解决方案是坏事的秘诀。
【讨论】:
以上是关于这个 JWT 实现是不是可以防止 XSS 和 CSRF 攻击,同时仍然允许我访问有效负载?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 防止 XSS 攻击或 Rest API JSON 中的不可信数据?