我正在使用spring Boot 在我的后端创建一个刷新令牌端点,我有几个问题。创建刷新令牌时,哪种方法更好,是使用JWT还是简单的UUID就足够了?
例如,如果我使用UUID生成一个刷新令牌,在我的refresh_token表中,我将有到期日期、生成该刷新令牌的用户,当然还有随机UUID。
public RefreshToken createRefreshToken(Long userId) {
RefreshToken refreshToken = new RefreshToken();
refreshToken.setUser(userRepository.findById(userId).get());
refreshToken.setExpiryDate(Instant.now().plusMillis(refreshTokenDurationMs));
refreshToken.setToken(UUID.randomUUID().toString());
refreshToken = refreshTokenRepository.save(refreshToken);
return refreshToken;
}
这是我最初的实现,但现在我在想,创建一个刷新标记作为JWT,并让有效负载包含到期日期,这意味着在验证刷新标记是否未到期时少读一次数据库,这不是更好吗?在我存储刷新标记jwt的情况下,是否应该在存储时在数据库中对它进行散列处理?
这是我想到的一个快速方法
private String createRefreshToken(String subject) {
Instant now = Instant.now();
JwtClaimsSet claimsSet = JwtClaimsSet.builder()
.issuer(JWT_ISSUER)
.issuedAt(now)
.expiresAt(now.plusSeconds(JWT_REFRESH_TOKEN_EXPIRY))
.subject(subject)
.build();
return jwtEncoder.encode(JwtEncoderParameters.from(claimsSet)).getTokenValue();
}
哪种方法更好/更安全?另外,可能还有一个小问题,在使用JWT时如何检索声明过期?我在我的控制器中使用org.springframework.security.oauth2.jwt
?
谢谢你,谢谢你
1条答案
按热度按时间kqqjbcuj1#
JWT的目的是将一些用户详细信息存储在令牌本身中,这样就可以避免多次调用服务器来获取用户信息,如登录用户名、权限等。
JWT应该主要用于访问令牌,因为它将在几乎每个请求中被发送回调用者。
另一方面,Refresh Token只是一个用于刷新访问令牌的令牌,并不要求在每次请求时都发送。
最好对刷新令牌使用GUID/UUID。