基于JWT(JSON Web Token)的工程引入与落地实践

本文详细介绍了JWT(JSON Web Token)的概念、用途、原理和结构,包括JWT头、有效载荷和签名哈希的解析。此外,还探讨了JWT在实际工程中的应用,如创建工程、生成和解析token,并展望了JWT的加密需求和安全性考虑。
摘要由CSDN通过智能技术生成

1、JWT认识

1.1 什么是JWT ?

JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌

1.2 透明令牌与自包含令牌

在这里插入图片描述

2、JWT起飞

2.1 JWT的用处

1、多web服务器下实现无状态分布式身份验证。
2、JWT 最重要的作用就是对 token信息的防伪。
在这里插入图片描述

2.2 JWT的原理

一个JWT由三个部分组成:JWT头、有效载荷、签名哈希,最后由这三者组合进行base64编码得到JWT。

2.3 JWT的结构

在这里插入图片描述从图中可以看到,JWT为一个很长的字符串,一共是三段。
分别是头、有效载荷、签名哈希。

2.3.1 JWT头

JWT头部分是一个描述JWT元数据的JSON对象,如下所示。

{
   
	"alg":"HS256",
	"typ":"JWT"
}

其中,

  • alg表示签名使用的算法,默认为 HMAC SHA256 ,简称HS256;
  • typ表示令牌类型,JWT令牌统一写为JWT;
    最后,使用Base64Url将上述对象转换为字符串保存。
    Base64Url算
    JWT头和有效载荷序列化的算法都用到了Base64URL。该算法和常⻅Base64算法类似,稍有差别。
    作为令牌的JWT可以放在URL中(例如api.example/?token=xxx)。 Base64中用的三个字符是"+“,”/“和”=“,由于在URL中有特殊含义,因此Base64URL中对他们做了替换:”=“去掉,”+“用”-“替换,”/“用”_"替换,这就是Base64URL算法。
    注意:base64编码,并不是加密,只是把明文信息变成了不可⻅的字符串。但是其实只要用一些工具就可以把base64编码解成明文,所以不要在JWT中放入涉及私密的信息。

2.3.2 有效载荷

有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。JWT指定七个默认字段供选择。

sub: 主题
iss: jwt签发者
aud: 接收jwt的一方
iat: jwt的签发时间
exp:jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
jti:jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击

除以上默认字段外,我们还可以自定义私有字段,如下例:

{
   
	"userName":"Java3q",
	"age":"x",
	"address":"xxx"
}

默认情况下JWT是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,以防止信息泄露。JSON对象也使用Base64 URL算法转换为字符串保存。

2.3.3 签名哈希

签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。
首先,需要指定一个密钥(secret)。该密钥仅仅为保存在服务器中,并且不能向用户公开。然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下原理生成签名。

HMACSHA256(base64UrlEncode(header) +"."+base64UrlEncode(claims), secret)

代码中的签名原理实现逻辑如下:

@Override
    public JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey) {
   
        Assert.hasText(base64EncodedSecretKey, "base64-encoded secret key cannot be null or empty.");
        Assert.isTrue(alg.isHmac(), "Base64-encoded key bytes may only be specified for HMAC signatures.  If using RSA or Elliptic Curve, use the signWith(SignatureAlgorithm, Key) method instead.");
        byte
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北溟南风起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值