Spring 安全表单身份验证:如何跟踪会话?

Spring Security Form Authentication: How are sessions tracked?

我在 Spring Security 上使用表单身份验证。所以我进入我的登录表单,输入我的用户名和密码,然后我就可以访问我网站上受保护的资源。与基本身份验证不同,使用 form authentication,用户名和密码仅在第一次请求时发送。

我不明白的是 Spring Security Servlet 如何在后续请求中跟踪最终用户的目标?

我了解到 basic-authenticationServlet 可以在 header 中查找经过编码的用户名和密码。但这如何与 form authentication 一起工作?

我假设设置了某种 session 变量?如果是这样,它是什么?

Spring Security 是否有某种临时数据库将 session ID 链接到用户名?最重要的是,如果我不使用 CSRF token,攻击者需要做的就是知道这个 session 变量来冒充用户吗?

身份验证后,Spring 安全添加一个名为 SPRING_SECURITY_CONTEXT 的会话属性。

此会话属性存储在服务器内存中,并通过 JSESSIONID cookie 与您的浏览器相关联。

它持有 SecurityContextImpl, which includes a UsernamePasswordAuthenticationToken 的实例,后者持有用户名。

Does Spring security have some sort of temporary database linking session ids to usernames?

是的,只要服务器端会话就像数据库一样。在每次请求时,服务器都会根据 JSESSIONID cookie 的值查找您的会话属性。

If I don't use a CSRF token, would all an attacker need to do is know this session variable to impersonate the user?

如果没有 CSRF 保护,攻击者可以通过让用户使用他们的网站并向您的网站发出请求(通过 JS 或 flash 或其他)来冒充用户。

如果您的站点也使用 HTTP 基本身份验证,则同样容易受到 CSRF 的攻击。

始终对您网站上的任何重要表单使用 CSRF 保护。你为什么不呢?