JWT令牌技术

写在前面

        我以为,最美的日子,当是晨起侍花,闲来煮茶,阳光下打盹,细雨中漫步,夜灯下读书,在这清浅时光里,一半烟火,一半诗意,任窗外花开花落,云来云往,自是余味无尽,万般惬意。

                                                                                                                          ——不吃葱的阿冬


🍟问题一 什么是令牌技术?它的作用是什么?

🍔问题二 令牌技术与身份验证之间有何关系?

🥪问题三  令牌技术有哪些优点和缺点?

🍞问题四  令牌技术在Web应用程序中的具体应用是什么?


目录

写在前面

目录

介绍

令牌技术的优缺点

作用

JWT组成

 1.引入依赖

2.生成令牌

3.校验令牌


介绍

JWT全称:JSON Web Token

官网链接:JSON Web Tokens - jwt.io

什么是令牌技术?

令牌技术就相当于我们每个人的身份证ID,其本质就是一个字符串,不能伪造但是可以辨别真假。

服务器具有生成令牌和校验令牌的能力。其流程为:

① 用户登录,用户请求登录,经过负载均衡把请求转给了第一台服务器,对第一台服务器的账号密码进行校验,验证成功后,生成一个令牌并返回给客户端。

②客户端收到令牌后,把令牌存储起来,可以存在Cookie中或者其他存储空间

③查询操作 用户登录成功后,携带令牌继续执行查询操作,然后将请求转发到第二台机器,第二台机器先进行权限校验操作,服务器验证令牌是否有效,如果有效,就说明用户已经执行了登录操作,如果无效,就说明用户之前未执行登录操作。

令牌技术的优缺点

优点:1)解决了集群环境下的认证问题。 2)减轻服务器的存储鸭梨(无需在服务器端进行存储)

缺点:1)需要自己手动实现(包括令牌的生成,传递,校验)

作用

对token信息的防伪作用,其本质是一个token,是一种紧凑的URL安全方法

JWT组成

JWT由三部分组成,每部分通过“.”来分隔。

①Header(头部):头部包含令牌的类型(即JWT)以及使用的哈希算法(常用(SHA256)

②Payload(负载):负载这部分是存放有效信息的部分,里面是一些自定义的部分,也可以存在JWT提供的现场字段,如:exp(过期时间戳).

!!!这部分不要存放敏感信息,因为这部分可以解码还原原始内容。

③Signature(签名):此部分用于防止JWT内容被篡改,确保安全性(这部分修改任何一个字符都会校验失败)。

 1.引入依赖

<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>

2.生成令牌

使用Jar包中提供的API来完成JWT令牌的生成

package com.items.blog;

import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.io.Encoders;
import io.jsonwebtoken.security.Keys;
import org.junit.jupiter.api.Test;

import javax.crypto.SecretKey;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtilTest {
    //过期时间: 1000分钟
    private static final long expiration = 1000 * 60 * 1000;
    private static final String secretString = "qXfusNTfqww9YFvMYtFa6eNu1lRd9+LMhkyvnfxJ224=";
    private static final Key key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretString));

    //随机生成一个key,然后将生成的seccretString返回生成一个token
    @Test
    public void genKey(){

        SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);
        String key = Encoders.BASE64.encode(secretKey.getEncoded());
        System.out.println(key);

    }
    //生成token
    @Test
    public void genToken(){

        Map<String, Object> claim  = new HashMap<>();
        claim.put("id",1);
        claim.put("name","zhangsan");

        String token = Jwts.builder()
                .setClaims(claim)
                .setExpiration(new Date(System.currentTimeMillis()+expiration))
                .signWith(key)
                .compact();
        System.out.println(token);
    }

    
}

由于对密钥的生成长度和内容由要求,所以可以使用 getKey() 函数来随机获得一个密钥.

然后运行程序输出的内容就是JWT令牌,放到官网解析,就可以在PAYLOAD部分看到我们存储的信息了。

其中HEADER部分可以看到使用的算法是HS256。

PAYLOAD部分是我们自定义的内容,exp表示过期时间。

VERIFY SIGNATURE部分是经过签名算法计算出来的,所以不会解析。

3.校验令牌

完成了令牌的生成,需要根据令牌来校验令牌的合法性(防止客户端伪造)

运行结果:

 令牌解析过后,可以看见里面存储的信息,解析过程中没有报错就说明已经解析成功了。

令牌解析时,也会对事件进行校验,如果令牌过期了,解析会失败,重新生成密钥就可以了

由于修改令牌中的任何一个字符,都会发生校验失败,所以令牌无法篡改。

令牌技术通常用于完成用户登录的校验,其具体步骤为:

① 登录页面把密码提交给服务器

② 服务器端验证用户名密码是否正确,如果正确,服务器生成令牌,下发给客户端

③ 客户端把令牌存储起来(如Cookie等),后续请求时,把token发给服务器

④ 服务器对令牌进行校验,如果令牌正确进行下一步操作

 

实操在下一个项目中 

未完待续。。。 。。

相关推荐

  1. JWT令牌(Token)设计

    2024-03-10 21:48:08       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 21:48:08       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 21:48:08       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 21:48:08       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 21:48:08       20 阅读

热门阅读

  1. 分布式全局唯一ID,我这就告诉你怎么搞!

    2024-03-10 21:48:08       24 阅读
  2. NOIP 2018 普及组初赛试题及解析

    2024-03-10 21:48:08       24 阅读
  3. openCV源码安装与卸载

    2024-03-10 21:48:08       21 阅读
  4. leetcode 第388场周赛第一题

    2024-03-10 21:48:08       19 阅读
  5. Gitlab部署流程

    2024-03-10 21:48:08       23 阅读
  6. 分布式锁从0到1落地实现01(mysql/redis/zk)

    2024-03-10 21:48:08       20 阅读
  7. SpringBoot集成MySQL

    2024-03-10 21:48:08       22 阅读
  8. H5页面手绘轨迹路径-过程中允许拖动+缩放地图

    2024-03-10 21:48:08       22 阅读
  9. 华为OD算法

    2024-03-10 21:48:08       17 阅读