【发布时间】: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 + CSRF或token的身份验证。
我对令牌和会话的用例感到困惑。
编辑:
大多数情况下,这取决于您的客户。
例如,对于移动客户端(例如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