今天写了一个登录接口,jwt生成token后对于在redis中存入token还是username有点疑惑,想请工作后的程序员给我解答一下这个问题,大家看过代码后我再叙述我的问题,首先是服务层
public String login(User user) {
//参数验证
if (ObjectUtils.isEmpty(user)) {
return "请输入账号密码";
}
String username = user.getUserName();
String password = user.getPassword();
if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
return "账号或密码为空";
}
//验证账号密码,密码使用MD5加密
String md5String = JwtHelper.getMd5String(password);
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getUserName, username)
.eq(User::getPassword, md5String);
User users = this.getBaseMapper().selectOne(wrapper);
if (ObjectUtils.isEmpty(users)){
return "账号密码错误或用户不存在";
}
//生成token
String token = JWT.create()
.withSubject(username)
.withExpiresAt(new Date(System.currentTimeMillis() + expirationTime))
.sign(Algorithm.HMAC256(secretKey));
// String token = JwtHelper.createToken(username,secretKey, expirationTime);
//缓存用户信息到redis
redisUtil.setEx(token,users,expirationTime);
//响应token到前端
return token;
}
然后是JwtHelper工具类
//生成token
public static String createToken(String username,String tokenSignKey,long tokenExpiration) {
//过期时间和加密算法设置
Date date=new Date(System.currentTimeMillis()+tokenExpiration);
Algorithm algorithm = Algorithm.HMAC256(tokenSignKey);
//头部信息
Map<String,Object> header=new HashMap<>(2);
header.put("typ","JWT");
header.put("alg","HS256");
return JWT.create()
.withHeader(header)
.withClaim("username",username)
.withExpiresAt(date)
.sign(algorithm);
}
public static String getUserName(String token,String tokenSignKey){
DecodedJWT verify = JWT.require(Algorithm.HMAC256(tokenSignKey)).build().verify(token);
return verify.getClaim("username").asString();
}
public static String getMd5String(String string) {
if (StringUtils.isEmpty(string)) {
return null;
}
return MD5.create().digestHex(string);
}
}
我的问题是为什么我的一个程序员朋友建议我在redis中存入token而不是存入username呢?
我理解的意思是使用jwt来生成token,此时要前端或者说客户端在登录过后会在客户端保存有这个token的。 同时存一个token到redis,这样客户端在使用其他请求时携带这个token和redis中的token进行比对来授权。 但是这里我就有疑问了,因为客户端是有token的,假设我redis中存入的是username字段,这样再写一个token解析的方法,这样客户端在使用其他请求时,需要先将客户端的token通过解密算法拿到username,再和redis中存入的username进行比对,这样做多了一个解密的过程,不是更安全吗,为什么开发中一般不这样写呢,我不明白。 我问ai将的是在redis中存入token而不是username,少写那个解析token的方法,可以节省性能。 但是我认为在这个过程中不是更应该注重安全性吗,而不是为了哪一点性能? 对此不是很懂,请大家工作过的能给我解答一下这个疑问,谢谢大家