JWT是什么

JWT是什么,第1张

JWT是什么 一、前置知识

base64编码解码,下面两个在线工具任选一个玩一玩,工具上有简单介绍原理
在线base64编码解码工具
base64编码转换工具
base64在线编码解码

二、JWT是什么

JWT官网 https://jwt.io/

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
JWT.IO allows you to decode, verify and generate JWT.

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。JWT表现为一串看不懂的乱七八糟的字符串,JWT常用于做认证授权,Java中spring security、spring security oauth2 经常需要用到,其实不用也行,用起来X格高啊

三、JWT样例

官网样例:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

一个典型的JWT看起来是这个样子的:

xxxxx.yyyyy.zzzzz
四、JWT的结构

JWT 由三部分组成,它们之间用圆点(.)连接。按顺序这三部分分别是

Header(头)Payload(负载)Signature(签名) 1.Header

Header是描述JWT元数据的JSON对象

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

alg:签名使用的算法,默认为HMAC SHA256(写为HS256);
typ:令牌的类型,JWT令牌统一写为JWT

用base64对这个JSON编码就得到JWT的第一部分

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
2.Payload

有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。 JWT的第二部分是payload,它包含claim(声明 要求)。claim有三种类型: registered, public 和 private。

Registered claims 这里有一组预定义的声明,它们不是强制的,但是推荐。Public claims 可以随意定义。Private claims 用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明

Registered claims 官方指定的7个默认字段

iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT

定义一个简易的Payload

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

对payload进行base64编码就得到JWT的第二部分

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

默认情况下JWT是未加密的,因为只是采用base64算法,不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息,拿到JWT字符串后可以转换回原本的JSON数据,不要将用户密码构建到payload中,以防止信息泄露。JWT只是适合在网络中传输一些非敏感的信息

3.Signature

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

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

签名是用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的token,它还可以验证JWT的发送方是否为它所称的发送方。

SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

在计算出签名哈希后,Header,Payload,Signature 用.分隔构建成JWT

五、JWT每个部分的作用

借官网的一张图说话

header和payload可以直接利用base64解码出原文,从header中获取哈希签名的算法和令牌类型,从payload中获取有效数据。
signature由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验token有没有被篡改。服务端获取header中的加密算法之后,利用该算法加上secretKey对header、payload进行加密,比对加密后的数据和客户端发送过来的是否一致。注意secretKey只能保存在服务端,而且对于不同的加密算法其含义有所不同,一般对于MD5类型的摘要加密算法,secretKey实际上代表的是盐值

六、Java怎么生成JWT

很简单,jar包引入,百度copy一下有手就行
https://jwt.io/libraries

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5716387.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存