返回

RememberMe 时,Spring Security 做了啥?

后端

Spring Security 的“记住我”功能

简介

你在登录网站或应用程序时一定见过一个复选框,上面写着“记住我”。当你勾选这个框时,即使你关闭浏览器或设备,网站或应用程序也会记住你的登录状态,让你不必每次都重新输入用户名和密码。这个功能就是“记住我”。

Spring Security 中的“记住我”

在 Spring Security 中,"记住我"功能是由 RememberMeServices 接口实现的。Spring Security 有两种 RememberMeServices 实现:TokenBasedRememberMeServices 和 CookieBasedRememberMeServices。默认情况下,Spring Security 使用 CookieBasedRememberMeServices。

Cookie-Based 的“记住我”

当你勾选 "记住我" 复选框时,Spring Security 会创建一个 RememberMe Cookie 并将其发送到你的浏览器。这个 Cookie 包含加密的用户 ID 和系列。系列是一个随机数,用于防止伪造 RememberMe Cookie。

下次你访问受 Spring Security 保护的网站或应用程序时,Spring Security 会验证 RememberMe Cookie。如果 Cookie 有效,Spring Security 会在用户会话中设置一个名为 RememberMe 的属性,其中包含加密的 RememberMe Cookie 值。这允许用户在浏览器关闭后仍然被记住。

CSRF 保护

Spring Security 还验证 CSRF 令牌,以防止跨站请求伪造攻击。CSRF 令牌是一个随机数,用于防止攻击者在未经你授权的情况下以你的名义执行操作。CSRF 令牌存储在用户会话中,并在每个 HTTP 请求中发送到服务器。如果 CSRF 令牌不匹配,Spring Security 会拒绝请求。

失效 Cookie 和 CSRF 令牌

如果 RememberMe Cookie 无效或 CSRF 令牌不匹配,Spring Security 会要求用户重新输入用户名和密码。

安全考虑

"记住我" 功能很方便,可以避免你每次访问网站或应用程序时都要重新输入用户名和密码。但需要注意的是,启用 "记住我" 功能可能会增加你的安全风险。如果你的计算机被盗或黑客入侵,攻击者可能会使用你的 RememberMe Cookie 访问你的帐户。因此,你应该只在受信任的计算机上启用 "记住我" 功能。

配置 Spring Security 的“记住我”

要启用 Spring Security 中的“记住我”功能,你需要在你的 Spring Security 配置文件中添加以下代码:

spring:
  security:
    remember-me:
      enabled: true
      key: 54321
      token-validity-seconds: 2419200 # 4 weeks
  • enabled: true 启用 "记住我" 功能。
  • key: 54321 是用于对 RememberMe Cookie 进行加密和解密的密钥。
  • token-validity-seconds: 2419200 设置 RememberMe Cookie 的有效期为 4 周。

结论

"记住我" 功能是 Spring Security 中一个方便的功能,可以提高用户体验。但要注意,在启用此功能时要小心,因为它可能会增加你的安全风险。

常见问题解答

  • 什么是“记住我”功能?
    “记住我”功能允许你在登录网站或应用程序后保持登录状态,即使你关闭了浏览器或设备。
  • Spring Security 如何实现“记住我”?
    Spring Security 使用 RememberMeServices 接口实现“记住我”,默认使用 CookieBasedRememberMeServices。
  • Cookie-Based 的“记住我”是如何工作的?
    CookieBasedRememberMeServices 创建一个 RememberMe Cookie,其中包含加密的用户 ID 和系列。下次访问受保护的网站时,Spring Security 会验证这个 Cookie。
  • Spring Security 如何防止 CSRF 攻击?
    Spring Security 验证 CSRF 令牌以防止 CSRF 攻击。CSRF 令牌是存储在用户会话中并随每个 HTTP 请求发送的随机数。
  • 如何配置 Spring Security 的“记住我”功能?
    你可以在你的 Spring Security 配置文件中通过设置 spring.security.remember-me.enabled、key 和 token-validity-seconds 来配置“记住我”功能。