【九月打卡】第5天 基于JWT的用户token验证
一、课程介绍
【课程名称】SpringBoot 2.x 实战仿B站高性能后端项目。
【章节】第三章3.11、3.12、3.13 基于JWT的用户token验证
【讲师】HELLOSTAR
二、课程内容
1.基于session的用户身份验证
服务器端验证用户名密码通过之后,生成用过户凭证保存在服务端(session)
浏览器再次访问后,服务器端查询session,实现登录状态保持。
缺点是用户访问量增多之后,服务器压力会增大。
浏览器保存的cookie被攻击者拦截之后,容易被伪造请求攻击。
分布式系统下扩展性不强。
2.基于token的用户身份验证
服务器端验证用户名密码通过之后,生成用户令牌(token)并返回浏览器,浏览器再次
访问时携带token,服务端校验token并返回相关数据。
优点:
token不存储在服务器,不会造成服务器压力;
token可以存储在非cookie中,安全性高;
分布式系统下拓展性强。
3.JWT
一个token规范,用来实现安全传递“声明”,以JSON形式保存,跨语言,基本支持任何web形式。
JWT的组成:头部、载荷、签名
JWT头部:声明的类型,加密算法(通常SHA256)
JWT载荷:有效信息。一般包含签发者、用户、过期时间、签发时间、过期时间
JWT签名:头部+载荷+密钥
常用JWT工具依赖包:java.jwt、jjwt-root
通俗地说,JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。
4.代码展示
//根据登录的用户id生成JWT token.使用工具包Java.jwt快速新建token。
public static String generateToken(Long userId) throws Exception{
Algorithm algorithm = Algorithm.RSA256(RSAUtil.getPublicKey(), RSAUtil.getPrivateKey());
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.HOUR, 1);
return JWT.create().withKeyId(String.valueOf(userId))
.withIssuer(ISSUER)
.withExpiresAt(calendar.getTime())
.sign(algorithm);
}//根据浏览器请求中的token查询对应用户id。同时验证token是否有效
public static Long verifyToken(String token) {
try {
Algorithm algorithm = Algorithm.RSA256(RSAUtil.getPublicKey(), RSAUtil.getPrivateKey());
JWTVerifier verifier = JWT.require(algorithm).build();
DecodedJWT jwt = verifier.verify(token);
String userId = jwt.getKeyId();
return Long.valueOf(userId);
} catch (TokenExpiredException e) {
throw new ConditionException("555", "token过期!");
} catch (Exception e) {
throw new ConditionException("非法用户token!");
}
}三、课程收获
token是个好东西。安全可靠适用性还广泛。不存在服务器不造成服务器压力,同时设置过期时间,当用户长时间不操作,自动视为退出登录,这样在另一程度保护了账号安全。比如在公共电脑上登录,经过一段时间自动退出其他人想继续非法操作也不行。网页显示文章也太窄了吧,感觉排版很怪好吗!
四、学习过程
共同学习,写下你的评论
评论加载中...
作者其他优质文章


