spring-security 是否刷新存储为UUID或JWT的标记?

zi8p0yeb  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(109)

我正在使用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
谢谢你,谢谢你

kqqjbcuj

kqqjbcuj1#

JWT的目的是将一些用户详细信息存储在令牌本身中,这样就可以避免多次调用服务器来获取用户信息,如登录用户名、权限等。
JWT应该主要用于访问令牌,因为它将在几乎每个请求中被发送回调用者。
另一方面,Refresh Token只是一个用于刷新访问令牌的令牌,并不要求在每次请求时都发送。
最好对刷新令牌使用GUID/UUID。

相关问题