【问题标题】:security for web applications session vs tokenWeb 应用程序会话与令牌的安全性
【发布时间】: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 应用程序不使用会话,但在每个请求的标头中都需要令牌。

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

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

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

编辑:

来自momo的评论

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


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

【问题讨论】:

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

标签: java spring spring-mvc jakarta-ee spring-security


【解决方案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

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 2020-04-17
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2011-07-04
      • 2020-04-09
      • 2018-08-12
      相关资源
      最近更新 更多