Web 应用程序会话与令牌的安全性

Posted

技术标签:

【中文标题】Web 应用程序会话与令牌的安全性【英文标题】:security for web applications session vs token 【发布时间】:2020-02-17 18:24:37 【问题描述】:

背景: 我正在开发一个Web应用程序,计划使用spring-mvc和spring security。我的计划是使用基于表单的身份验证,其中 Spring Security 对凭据进行身份验证并设置会话 JSESSIONID,以便后续请求将根据请求标头中存在的 cookie 进行身份验证。

我的理解

Web 应用程序请求应该有状态。这种状态可以通过使用会话来完成。

纯基于会话的身份验证容易受到 CSRF 攻击。由于 Spring Security 提供 CSRF 保护,我没有发现任何使用 session + CSRF 保护的安全漏洞。

access-tokens 仅用于授予对第三方应用程序公开的 API 的访问权限。

我的问题: 但是当我在这个站点上看到很多问题时,人们正在使用基于令牌(OAuth2/JWT)的 Web 应用程序身份验证。但我认为令牌仅用于提供对 API 的访问权限。

但是当我看到人们将令牌用于 Web 应用程序时,我就得到了这个问题。假设基于令牌的 Web 应用程序不使用会话,但在每个请求的标头中都需要令牌。

    我们何时应该在 Web 应用程序中进行基于令牌的身份验证

    就安全性而言,哪一个好?基于Session + CSRFtoken 的身份验证

我对令牌和会话的用例感到困惑。

编辑:

来自momo的评论

大多数情况下,这取决于您的客户。 例如,对于移动客户端(例如JSON 有效载荷超过HTTP),没有Session 这样的东西。 JWT 有工作 cross-origin 的优势。相比之下,带有Cookies基于会话的 身份验证方法仅适用于相同的(子)域)并且扩展性不太好。 但是,使Session 失效比JWT 更容易。由于您无论如何都使用Spring-MVC,而且我认为可扩展性并不重要,选择您更舒服的那个


结论: 会话仅支持来自同源的请求,基于令牌的身份验证首选用于验证跨源请求

【问题讨论】:

大多数情况下,这取决于您的客户。例如,对于移动客户端(例如 HTTP 上的 JSON 有效负载),没有 Session 之类的东西。 JWT 具有跨域工作的优势。相比之下,带有 Cookie 的基于会话的身份验证方法仅适用于相同的(子)域)并且扩展性不太好。但是,使 Session 失效比 JWT 更容易。既然你无论如何都使用 Spring MVC,而且我认为可伸缩性并不重要,那就选择你更舒服的那个。 @momo 非常感谢。我的疑惑澄清了。 小评论中的广泛描述。请考虑我的写作请求作为未来访问者的答案。 【参考方案1】:

大多数情况下,这取决于您的客户。例如,对于移动客户端(例如 HTTP 上的 JSON 有效负载),没有 Session 这样的东西。

JWT

JWT 具有跨域跨域工作的优势 因此,基于 JWT 的身份验证规模更好 在单页应用程序 (SPA)/Web API 时代非常流行 通过使用签名或 MAC 来注意完整性保护。不允许使用不安全的 JWT:"alg":"none"

会话

主要与网络浏览器结合使用 更容易使会话无效(删除)。 JWT 只有一个过期日期,在过期之前一直有效 请注意以下 cookie 属性:安全; HttpOnly 并提供一些针对跨站点请求伪造攻击的保护:SameSite=Strict 或 SameSite=Lax

其他方法: 像 Keycloak 这样的开源身份提供者,例如traefik 作为负载均衡器已经非常流行。这带来了优势,新路由可以在不重新启动任何服务的情况下上线。此外,在某些情况下,它还可以节省由于 API 调用率过高而导致的应用程序停机时间。

总结: 许多道路通向罗马。这总是取决于团队的具体要求、环境和技能。既然你无论如何都使用 Spring MVC,而且我认为可伸缩性并不重要,那就选择你更舒服的那个吧..

【讨论】:

【参考方案2】: 对于无状态应用程序使用 JWT 对于第三方应用程序,请使用 OAuth2 对于有状态的应用程序使用 Session + CSRF

【讨论】:

以上是关于Web 应用程序会话与令牌的安全性的主要内容,如果未能解决你的问题,请参考以下文章

在哪里存储 JWT 令牌 Laravel 5.6 应用程序?

用于 Web 用户身份验证的 Java 选项

用于 Web 用户身份验证的 Java 选项

codeigniter 中的会话令牌更改

web安全学习-攻击会话管理

如何从外部应用程序安全地使用json web令牌,与wordpress rest api对话