面试题答案
一键面试设置JWT有效期
在Java中使用常见的JWT库(如jjwt),可以在生成JWT时设置有效期。示例代码如下:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;
public class JwtUtil {
private static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
private static final long EXPIRATION_TIME = 10 * 60 * 1000; // 10分钟
public static String generateToken(String subject) {
Date now = new Date();
Date expiration = new Date(now.getTime() + EXPIRATION_TIME);
Claims claims = Jwts.claims().setSubject(subject);
claims.put("iat", now);
claims.put("exp", expiration);
return Jwts.builder()
.setClaims(claims)
.signWith(key, SignatureAlgorithm.HS256)
.compact();
}
}
在上述代码中,通过设置exp
字段(claims.put("exp", expiration);
)来指定JWT的过期时间。
有效期过短的问题
- 频繁认证:用户需要频繁重新登录获取新的JWT,这会增加用户的操作负担,降低用户体验。比如在一个电商应用中,用户可能在浏览商品的过程中就因为JWT过期需要重新登录,打断购物流程。
- 性能消耗:频繁的认证请求会给认证服务器带来额外的负载,增加服务器资源消耗。每次认证都需要进行数据库查询(验证用户信息等),过多请求会导致数据库压力增大。
- 影响业务连续性:对于一些长时间运行的业务流程,如文件上传、视频编辑等,如果JWT在流程中过期,可能导致业务中断,用户需要重新开始操作。
有效期过长的问题
- 安全风险:如果JWT被盗取,由于其有效期长,攻击者有更长的时间使用该JWT进行非法操作,对系统安全构成较大威胁。例如,攻击者获取了一个有效期为一年的JWT,可以在这一年内随意访问受保护资源。
- 权限更新延迟:当用户权限发生变化(如角色变更、权限撤销等)时,由于JWT仍然有效,用户可能继续拥有旧的权限,导致权限更新不及时。比如用户被从管理员角色降为普通用户,但因为JWT未过期,仍能以管理员权限操作。