jwt解析网站_jwt工作原理

jwt解析网站_jwt工作原理1.Token与Session优缺点概述1.1Session的由来在登录一个网站进行访问时由于HTTP协议是无状态的就是说一次HTTP请求后他就会被销毁,比如我在www.a.com/login里面登录了,然后你就要访问别的了比如要访问www.a.com/index但是你访问这个网站你就得再发一次HTTP请求,至于说之前的请求跟现在没关,不会有任何记忆,这次访问会失败,因为无法验证你的身份。所以你登录完之后每次在请求上都得带上账号密码等验证身份的信息,但是你天天这么带,那太麻烦了。那还可以这样,把我第一

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1.Token与Session优缺点概述

1.1 Session的由来

在登录一个网站进行访问时由于HTTP协议是无状态的就是说一次HTTP请求后他就会被销毁,比如我在www.a.com/login里面登录了,然后你就要访问别的了比如要访问www.a.com/index但是你访问这个网站你就得再发一次HTTP请求,至于说之前的请求跟现在没关,不会有任何记忆,这次访问会失败,因为无法验证你的身份。所以你登录完之后每次在请求上都得带上账号密码等验证身份的信息,但是你天天这么带,那太麻烦了。那还可以这样,把我第一次登录的信息状态都放在数据库里,下次我一访问,我查一下数据库就知道我登没登陆了,但是频繁查找数据库会给后台服务器造成非常大的压力所以就出现了Cookie,第一次登录就会返回一个Cookie,将一些简单地信息放在Cookie里返回给客户端,然后在客户端保存,每个域名下对应有一堆Cookie,下次我带Cookie来访问就行了。这样做也行但是Cookie很容易被篡改放在客户端并不安全,而且Cookie多了会无形的增加客户端与服务端的传输数据量。所以Session就出现了,Session放在后台服务器,将SessionID返回给客户端作为Cookie的值下次我带Cookie过来通过SessionID来查找Session中的一些登录或其他信息就行了。这样做也挺好。但是如果是集群环境下,那就不行了Session不能跨域也就是说你用www.baidu.com下的SessionID访问www.bilibili.com下的Session是不行的为了解决这个问题我们还得将Session在每台服务器上进行同步这也是一笔巨大的开销。

1.2 Token

这个时候Token出现了Token本质上也是一个类似于SessionID的东西,在服务器后端会有一个Redis数据库,将token和对应的用户信息存放在redis中即可。key为token的值,value为userid。这样的话不管什么服务我只要返回一个token就行了下次客户端带着token传给服务器就行了。服务器根据token访问到redis然后查找到useid就能确认访问这的身份。但是如果Token数量过多,频繁访问后台redis也会给服务器造成巨大压力。

具体过程如图所示

在这里插入图片描述

2. JWT

前面说了使用Token可能造成后台服务器压力过大,于是又出来一种令牌JSON Web Token(JWT),JWT被用来在身份提供者和服务提供者之间传递被认证的身份信息,以便从服务器获取资源。

2.1 JWT的组成

1.Header(头) 作用:记录令牌类型、签名算法等

2.Payload(有效载荷)作用:

携带存放的数据 用户名称、用户头像之类 注意敏感数据

标准中注册的声明 (建议但不强制使用) :

iss: jwt签发者

sub: jwt所面向的用户

aud: 接收jwt的一方

exp: jwt的过期时间,这个过期时间必须要大于签发时间

nbf: 定义在什么时间之前,该jwt都是不可用的.

iat: jwt的签发时间

jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

3.Signature(签名)作用:防止Token被篡改、确保安全性 例如 计算出来的签名,一个字符串

载荷可以不放userid如果你不需要查询数据库的话就不用如果需要最好加上。

2.2 JWT的实现

那么如何实现一个JWT呢,JWT就是就是由头部,有效载荷,签名拼接起来的字符串。JWT是JSON Web Token所以头部载荷都是json格式,以key-value形式存储。具体如下

        String signKey = "wjzmvp";
        JSONObject payLoad = new JSONObject();
        JSONObject header = new JSONObject();
        header.put("Alg","HS256");
        payLoad.put("userId","35");
        payLoad.put("name","wjz");
        payLoad.put("age","20");
        payLoad.put("other","会喝药没有弟弟");
        String jwtHeader = Base64.getEncoder().encodeToString(header.toJSONString().getBytes());
        String jwtpayLoad = Base64.getEncoder().encodeToString(payLoad.toJSONString().getBytes());
        String sign = DigestUtils.md5Hex(payLoad.toJSONString() + signKey);
        String JWT = jwtHeader + "." + jwtpayLoad + "."+sign;
        System.out.println(JWT);

创造好JSON格式的头部和载荷,然后分别对他们以Base64形式进行编码(注意不是加密),然后再设置一个签名key将这个签名key和载荷的JSON字符串相拼接再用md5加密,形成签名然后再将编码好的头部和载荷与这个签名通过”.”连接形成JWT。

在这里插入图片描述

2.3 JWT原理

那为什么说JWT就比之前的Token要好呢,因为之前的Token将用户信息保存在后台服务器上,确实保证了用户信息的安全,同时在不同服务之间也可以进行跨域访问,但是当有过多的Token同时进行访问时会给后台服务器造成巨大压力。JWT将用户的一些信息放在载荷里,也就是说他把信息存储在了客户端,它没有被篡改的风险,因为他在访问后台时会带着JWT,服务器要对这个JWT进行检验。

        //解密
        String payLoadStr = new String(Base64.getDecoder().decode(JWT.split("\\.")[1].getBytes()),"UTF-8");
        String jwtSign = JWT.split("\\.")[2];

        System.out.println(DigestUtils.md5Hex(payLoadStr + signKey).equals(jwtSign));

他会将载荷进行解码,然后再加上这个签名key进行加密与传回来的jwt的签名进行比较如果是正确的说明没有被篡改,如果是错的说明它被篡改了。由于signKey是存放在服务器端的,所以比较安全只要JWT被篡改就会立刻发现。载荷中尽量不要放密码之类的敏感信息,如果你要是想查数据库的话带上用户名就行了,后台会将payLoad还原成String型的数据然后拿出用户名对后台进行访问。

在这里插入图片描述

JWT的注销

jwt一旦生成很难注销

1.清除Cookie但是服务端还会保存。

2.失效时间设置的短一点。让他自己失效。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180921.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月17日 下午6:00
下一篇 2022年10月17日 下午6:00


相关推荐

  • 搭建个人网站需要的三个步骤

    记录一下自己的个人网站的搭建过程。其实网上有很多教程了,有的讲的好,很详细,有的就很笼统了,当然还有抄别人的,我这篇就纯属记录一下自己搭建的过程。搭建一个个人网站要知道以下三个步骤,做个比喻吧:域

    2021年12月26日
    88
  • php 编译安装curl 扩展

    php 编译安装curl 扩展问题:线上运行的lamp服务器,默认yum安装的curl模块只支持http,不支持https。解决方法:编译安装curl,重新编译php,使php的curl模块支持https。具体步骤:1、下载curlcd/usr/local/src#进入安装包存放目录wgethttp://curl.haxx.se/download/curl-7.44.0.tar.gz#下载2、安装curlcd/usr/local/srctarzxvfcurl-7.44.0.tar..

    2025年11月11日
    4
  • H3C bridge端口脚本[通俗易懂]

    H3C bridge端口脚本[通俗易懂]H3CComwareVersion5.20是不支持一次选择多个端口的(已通过H3C400电话确认)一个个敲太麻烦我们可以通过复制脚本的方式快速将接口配置为bridge。interfaceGigabitEthernet1/0/1portlink-typeaccessportbridgeenablequitinterfaceGigabitEthern

    2022年5月29日
    38
  • idea 运行单个main方法_idea如何运行main方法[通俗易懂]

    idea 运行单个main方法_idea如何运行main方法[通俗易懂]使用IntelliJIdea打包可执行JAR1、Model结构如下:…IDEA发布1.8.1配置编译class的环境1.8.2配置web环境1.8.3发布到tomcat运行环境中1.8.4启动运行1.8.5发布到war文件操作完成后进入下一……Main-Class:Main这边Main既是运行类,含有main()方法的一个类文…

    2022年5月31日
    379
  • 用C实现一个简易的软件光栅化渲染器

    用C实现一个简易的软件光栅化渲染器这是一个用 C winform 实现的软件光栅化渲染器 今天拿出来与大家分享一下 希望能起到抛砖引玉的作用 给新人一点启发 结构比较简单 注释比较详细 也欢迎司机们拍砖指点和交流 目的 巩固图形编程知识 理解渲染流水线所做的事情 实现功能 将顶点数据进行一系列处理显示到屏幕上 废话 线框渲染模式 纹理渲染模式 顶点色模式纹理 uv 坐标和顶点色等的透视校正插值纹理双线性过滤采样背面消隐 Cv

    2026年3月26日
    2
  • RGB和YUV之比较【转】

    RGB和YUV之比较【转】

    2022年3月1日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号