首页 > 其他分享 >什么是JWT?原理是什么?

什么是JWT?原理是什么?

时间:2023-02-04 11:57:56浏览次数:34  
标签:载荷 加密 什么 JWT token 签名 头部 原理

什么是JWT

JWT 是Json Web Tokens的简称。用百度上面的解释讲,是目前流行的跨域认证解决方案,一种基于JSON的、用于在网络上声明某种主张的令牌(token)。

JTW原理

jwt验证方式是将用户信息通过加密生成token,每次请求服务端只需要使用保存的密钥验证token的正确性,不用再保存任何session数据了,进而服务端变得无状态,容易实现拓展。

比如加密前的信息:


{
    "username": "vist",
    "role": "admin",
    "expire": "2020-11-06 15:14:20"
}

加密后:


6gdfg7af816b907f2cc9acbe9c3b4625

JWT 结构


三部分用“.”隔开。如下


edsfdfsdffdssdfR5cCI6IkpXVCJ9.ekgjfdsdfgrMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.Sfdsgdfgsdfgf36POk6yJVfgsd4treh5hdfs

头部

头部通常由令牌的类型(typ)和签名的算法(alg)组成。一般使用base64编码。


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

这里有个点可以说一下,这个typ类型是媒介类型(Media Type),可以认为是媒介类型、介质类型、设备类型等等都可以,用户可以根据令牌类型做不同的操作。举个例子有个项目是移动端端和PC端。那么这里就可以设置typ为移动或PC的。

载荷

载荷是数据的主体部分。一般使用base64编码。

可以使用JWT官方推荐字段:


iss: 签发者
sub: 主题
aud: 接收者
exp(expires): 过期时间
iat(issued at): 签发时间
nbf(not before): 早于某个时间不处理
jti(JWT ID): 唯一标识

也可以使用自定义字段


{
    "username": "vist",
    "role": "admin"
}

主体部分可添加非敏感数据

这里就有个问题了,那什么是敏感数据。例如:用户的余额、用户的密码、用户的隐私数据(女性的年龄)等等都可以是敏感的数据。而非敏感数据则是你可以公开出去的数据。


{
  "iss": "我是大哥",
  "sub": "审批",
  "aud": "牛逼",
  "userName": "大哥大",
  "approve":"通过",
  "iat":"1597000000",
  "exp": 1597223455
}

签名

签名部分是对前两部分(头部,载荷)的签名,防止数据篡改。

按下列步骤生成:
1、先指定密钥(secret)
2、把头部(header)和载荷(payload)信息分别base64转换
3、使用头部(header)指定的算法加密

最终:


HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), "密钥/盐");

通过算法加密后的结果就是签名。

头部和载荷都用base64编码不怕被解码获取吗?

其实不用担心。因为头部和载荷的信息都是非敏感信息,可以公开的,即使拿到token,也只能解析出非敏感的数据,并不能拿到敏感数据。

同时篡改头部或者载荷的数据是不可能通过校验的。

因为检验token的时候会将【头部.载荷】进行加密然后和签名比较。而签名是由 [头部数据.载荷数据]经过算法加密生成的。也就是说,篡改了就无法通过校验了。

JWT特点总结

JWT更加简洁,更适合在HTML和HTTP环境中传递。,但更建议JWT建议使用HTTPS协议来传输代码。

JWT适合一次性验证,如:激活邮件

JWT适合无状态认证

JWT适合服务端CDN分发内容

相对于数据库Session查询更加省时

跨域认证需要做Session共享,而使用了JWT则不需要。因为只要其他服务器只要是使用同一套算法,就可以做信息的校验。

JWT默认不加密

使用期间不可取消令牌或更改令牌的权限

标签:载荷,加密,什么,JWT,token,签名,头部,原理
From: https://www.cnblogs.com/minch/p/17091205.html

相关文章

  • 两种请求有什么区别?
    publicfunctionhttp88($_url,$data){$curl=curl_init();$headers=array("Content-Type:application/json");//请......
  • 关于#java#的问题:为什么hello world就报错了
    提问: 刚开始学java,为什么helloworld就报错了?求解疑。      解答: 你的eclipse创建的项目有问题,连libary都没有,这就是一个文件,它是无法运行的,需要依......
  • 单例模式为什么要加volatile修饰?
    单例模式为什么要加volatile来修饰?解析:这里我们自己应该要先搞清楚面试官问的到底是什么?因为单例模式有四种实现:饿汉模式,懒汉模式,静态内部类,枚举搞清楚问的是哪一种,其......
  • BGP高防服务器与普通高防服务器有什么区别?
        有的企业在为自己的服务案挑选高防服务器的时候,常常​‌‌会接到来自IDC运营商的提问;是选择普通高防服务器,还是选择BGP高防服务器?这时候,很多用户会对BGP高防......
  • 在Python中,下划线代表着什么?
    前缀单下划线,如:_name某个方法或变量如果使用了此格式命名只是提醒开发者这并不是要组成公共接口的,对于普通的单文件内的变量或方法来说,并没有实际限制作用。但是用此格式......
  • @Configuration的基本使用和工作原理
    1基本使用@Configuration用来标注配置类,它自身的元注解是@Component,所以能够被Spring容器管理。它可以和其他注解联合使用,完成配置功能:@Bean:标注方法,可以注册bean。@......
  • 嵌入式硬件集电极开路电路工作原理详细分析
    今天给大家分享的是:集电极开路电路、集电极开路晶体管电路、集电极开路工作原理、集电极开路TTL、集电极开路输出接线图、集电极开路优缺点。在数字芯片设计、微控制器应用......
  • #技术人为什么写博客# MySQL事务--第一篇
    一、概念事务到底是什么东西呢?想必大家学习的时候也是对事务的概念很模糊的。接下来通过一个经典例子讲解事务。银行在两个账户之间转账,从​​A​​​账户转入B账户1000元,系......
  • 物联网基本工作原理
    物联网并不是新技术或新概念,爱立信物联网预测报告预测,到2022年,将有大约290亿台连网设备。其受欢迎程度已经在多个行业中体现,这些行业已经意识到它在处理数据并将其转换......
  • WGCLOUD简介与特点 - 主机列表中的磁盘使用率是什么
    WGCLOUD监测平台中的模块,【主机列表】的磁盘总使用率百分比和【系统页面】的磁盘空间列表,有时候我们看的时候可能不明白,有什么区别,有什么联系这是因为【主机列表】的磁盘总......