我在后端使用Spring Security为React SPA实现安全性,在阅读了大量资料之后,我选择了以下方法:
- HTTPS无处不在
- POST /login获取凭据以cookie的形式返回JWT_TOKEN和XSRF_TOKEN。我自己构建JWT_TOKEN,而Spring Security处理XSRF_TOKEN。两个cookie都是安全的,并且SameSite=Strict。JWT标记是HttpOnly。
- 后续的API调用需要X-XSRF-TOKEN标头。这是从前面提到的cookie中读取的。这两个标头都被发送,Spring Security会比较它们。JWT会自动发送并在过滤器中检查。
- 每次使用XSRF令牌时,SpringSecurity都会生成一个新令牌,以防止会话固定攻击
- XSS保护由Spring Security应用
所以现在我想知道刷新令牌。我阅读了很多矛盾的信息。我需要他们与此设置?如果是这样,如何最好地处理这个问题?
多谢
1条答案
按热度按时间vyswwuz21#
一般来说,正如它的名字所说,刷新令牌会从一个令牌更改为另一个令牌。通常,它们用于基于OAuth协议的身份验证。当访问令牌已过期,但用户的会话仍然有效时,它们很有用。
首先,JWT是访问令牌的最佳选择,它们拥有符合访问令牌要求的声明,例如:
exp
、iat
、jti
、sub
等。但是,当使用基于Cookie的身份验证时,不需要访问令牌,也可能不需要JWT。正如您所说,您的
JWT_TOKEN
被设置为HttpOnly
cookie,这意味着只有服务器可以访问它。JWT对于在客户机和服务器之间共享初始状态非常有用,反之亦然。如果您的服务器只是使用它来查找数据库,则不需要JWT,您只是使用了会话概念。并且将会话数据保存在JWT上可能不是一个好的实践。第二,如果您的认证cookie数据将在
/login
存活,并在/logout
死亡,则不需要刷新令牌。刷新令牌是短期访问令牌的交换密钥。相反,您的cookie保持会话存活,不需要由其他东西交换。例如,如果用户使用
/login
路由将您的username
和password
交换为一个短暂生命的access_token
,则他可能需要refresh_token
来获得新的access_token
,而无需再次发送他的username
和password
。如果您使用OAuth协议或类似协议,则刷新令牌对于为用户提供更无缝的体验以及避免重复输入身份证明的不便至关重要。但即使在OAuth上,它们也不是强制性的。