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 + CSRF
或token
的身份验证。
我对令牌和会话的用例感到困惑。
编辑:
来自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 应用程序会话与令牌的安全性的主要内容,如果未能解决你的问题,请参考以下文章