栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JWT是什么

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/720072.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号