背景:我正在开发一个计划使用spring-mvc
和spring安全性的Web应用程序。我的计划是使用基于表单的身份验证,其中spring安全性对凭据进行身份验证并设置会话JSESSIONID
,以便随后的请求将基于请求标头中存在的cookie进行身份验证。
我的理解:
Web应用程序请求应具有状态。可以通过使用会话来实现此状态。
纯粹基于会话的身份验证容易受到CSRF攻击。由于spring security提供了CSRF保护,因此我没有使用session + CSRF
保护找到任何安全漏洞。
access-tokens仅用于授予对第三方应用程序公开的API的访问。
我的问题:但是,当我在该站点中看到很多问题时,人们正在使用基于令牌(OAuth2 / JWT)的Web应用程序身份验证。但是我相信令牌只是用来授予对API的访问权限。
但是,当我看到人们在Web应用程序中使用令牌时,我才遇到这个问题。假设基于令牌的Web应用程序不使用会话,但是希望每个请求的标头中都包含令牌。
当我们应该在Web应用程序中进行基于令牌的身份验证时。
就安全性而言,哪个好? [基于Session + CSRF
或token
的身份验证。
我对令牌和会话的用例感到困惑。
[通常,这取决于您的客户。例如,对于移动客户端(例如,HTTP上的JSON有效负载),没有会话之类的东西。
JWT
会话
其他方法:开源身份提供者(例如Keycloak),例如traefik作为负载均衡器已经非常流行。这样带来的优点是,新路由可以上线而无需重新启动任何服务。另外,在某些情况下,它可以节省由于API调用率过高而导致的应用程序停机时间。
总结:通往罗马的道路很多。它始终取决于特定的要求,环境和团队的技能。因为无论如何,您都使用Spring MVC,并且我认为可伸缩性并不关键,所以选择一个您更舒适的选择即可。