Java web应用程序会话与令牌的安全性
背景:Java web应用程序会话与令牌的安全性,java,spring,spring-mvc,jakarta-ee,spring-security,Java,Spring,Spring Mvc,Jakarta Ee,Spring Security,背景: 我正在开发一个web应用程序,计划使用SpringMVC和SpringSecurity。我的计划是使用基于表单的身份验证,其中spring security对凭据进行身份验证,并设置会话JSESSIONID,以便根据请求头中存在的cookie对后续请求进行身份验证 我的理解: Web应用程序请求应具有状态。此状态可以通过使用会话来完成 纯粹基于会话的身份验证容易受到CSRF攻击。由于spring security提供了CSRF保护,我使用session+CSRF保护时没有发现任何安全循
我正在开发一个web应用程序,计划使用
SpringMVC
和SpringSecurity。我的计划是使用基于表单的身份验证,其中spring security对凭据进行身份验证,并设置会话JSESSIONID
,以便根据请求头中存在的cookie对后续请求进行身份验证
我的理解:- Web应用程序请求应具有状态。此状态可以通过使用会话来完成
- 纯粹基于会话的身份验证容易受到CSRF攻击。由于spring security提供了CSRF保护,我使用
保护时没有发现任何安全循环漏洞session+CSRF
- 访问令牌仅用于授予对已向第三方应用程序公开的API的访问权
但当我在这个网站上看到很多问题时,人们正在使用基于令牌(OAuth2/JWT)的web应用程序身份验证。但我认为令牌只用于访问API 但当我看到人们在web应用程序中使用令牌时,我就有了这个问题。假设基于令牌的web应用程序不使用会话,但在每个请求的头中都需要令牌
令牌
基于身份验证来自momo的评论 大多数情况下,这取决于您的客户
例如,对于移动客户端(例如
JSON
通过HTTP
的有效负载),没有会话这样的东西JWT
具有跨原点工作的优势。相比之下,基于会话的
身份验证方法和Cookies仅适用于相同的(子域)并且扩展性不太好但是,
会话
比JWT
更容易失效。既然您使用的是springmvc
,而且我想可伸缩性并不重要,那么就选择您更喜欢的那种吧。结论:会话只支持来自同一来源的请求,首选基于令牌的身份验证来验证跨来源请求
通常,这取决于你的客户。例如,对于移动客户端(例如HTTP上的JSON有效负载),没有会话这样的东西 JWT
- JWT在跨不同领域跨源工作方面具有优势
- 因此,基于JWT的认证规模更好
- 在单页应用程序(SPA)/Web API的时代非常流行
- 请注意使用签名或MAC进行完整性保护。不允许使用不安全的JWT:{“alg”:“none”}
- 主要与web浏览器结合使用
- 更容易使会话无效(删除)。JWT只有一个到期日,并且在到期前有效
- 请注意以下cookie属性:安全;HttpOnly和提供一些针对跨站点请求伪造攻击的保护:SameSite=Strict或SameSite=Lax
- 对于无状态应用程序,请使用JWT
- 对于第三方应用程序,请使用OAuth2
- 对于状态完整的应用程序,请使用会话+CSRF