首页 > 其他 > 详细

JWT(Token)

时间:2021-04-18 11:30:50      阅读:30      评论:0      收藏:0      [点我收藏+]

JWT

什么是JWT

JsonWebToken. 定义了一种紧凑,自包含的方式,用于在各方之间以JSON对象安全的传输对象

此信息可以验证和信任,它是有数字签名的,可以使用各种算法进行签名

通过JSON的形式作为Web应用的令牌,用于在各方面之间安全的将信息作为JSON对象进行传输,在传输过程中还可以完成数据加密,签名等相关处理

核心作用

  1. 信息交换
  2. 安全校验

JWT能做什么

  1. 授权

    一旦用户登陆,后续所有请求将包含JWT,从而允许用户访问该令牌允许的路由,服务和资源,单点登录是如今广泛使用JWT的一项功能,他的开销很小并且可以在不同的域内使用

  2. 信息交换

    JSON WEB TOKEN 可以在各方之间安全的传输信息,可以对JWT进行签名(公钥和私钥),确保发件人是正确的人,签名是使用标头和有效负载计算的,还可以验证内容是否被篡改

为什么使用JWT

解决授权问题

Session 认证

技术分享图片

返回cookie中加入SessionId 来实现保存用户信息

session都保存在内存中,随着认证用户的增多,服务器开销会明显增大

用户认证后,服务端保存在内存中,用户的下一次请求必须还要在这台服务器上,限制了拓展性

同时cookie保存,容易被伪造攻击

JWT认证

1. 用户将账号密码发送到后端接口
2. 服务器验证后,将用户的其他信息作为JWT PayLoad,将其头部分别进行Base64 编码拼接后签名,形成Token
3. 后端JWT字符串作为登陆成功的返回结果返回给前端,前端保存在localStorage ,退出登录时删除JWT即可
4. 前端每次请求时将JWT放在Http Header 的Authorization位置
5. 后端检验是否存在,验证JWT的有效行,检查Token是否过期
6. 通过后端使用的JWT中包含的用户信息进行逻辑操作,返回相应结果

优点

  • 简洁
  • 自包含。可以保存用户所需要的信息
  • Token是通过加密的形式保存在客户端的,所有不怕被篡改
  • 不需要在服务端保存会话信息,特别适合分布式微服务

JWT的结构

  • 令牌组成

    • 1.标头(Header)
    • 2.有效荷载(Payload)
    • 3.签名(Signature)
  • 头信息(Header)

    • 头信息一般由两部分组成,令牌的类型和使用的签名算法

    • 他会使用Base64 编码组成JWT结构的第一部分

    • Base64 是一种编码,可以被翻译为原来的样子

    • {
        "alg":"HS256",
        "typ":"JWT"
      }
      
  • 有效载荷(Payload)

    • 包含其声明

    • 声明是有关实体和其他数据的声明

    • 同样会使用Base64 来组成JWT结构的第二部分

    • {
        "name":"airou",
        "id":"1",
        "qq":"2023034904"
      }
      
  • 签名(Signature)

    • 使用编码后的Header和Payload 以及提供的密钥,使用header中指定的签名算法进行签名

    • 签名的作用保证JWT没有被篡改

    • HMACSHA256(base64UrlEncode(header)+‘.‘+base64UrlEncode(payload),secret);
      

第一个JWT程序

pom依赖

<dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.14.0</version>
        </dependency>

加密

void TestGetToken() {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE,3);
        String Token = JWT.create()
                .withClaim("name","airou")
                .withClaim("id",1)
                .withExpiresAt(calendar.getTime())
                .sign(Algorithm.HMAC256("airou123"));
        System.out.println(Token);

    }

解码

void TestReadToken(){
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("airou123")).build();
        DecodedJWT decodedJWT = jwtVerifier.verify(Token);
        System.out.println(decodedJWT.getClaim("name").asString());
        System.out.println(decodedJWT.getClaim("id").asInt());
    }

write_time :
2021-04-17 22:31:11 星期六

JWT(Token)

原文:https://www.cnblogs.com/airou/p/14672384.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!