一、课程介绍
【课程名称】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是个好东西。安全可靠适用性还广泛。不存在服务器不造成服务器压力,同时设置过期时间,当用户长时间不操作,自动视为退出登录,这样在另一程度保护了账号安全。比如在公共电脑上登录,经过一段时间自动退出其他人想继续非法操作也不行。网页显示文章也太窄了吧,感觉排版很怪好吗!
四、学习过程