手记

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


四、学习过程




0人推荐
随时随地看视频
慕课网APP