JWT身份验证

在实际项目中一般会使用jwt鉴权方式。

JWT知识点

jwt,全称json web token ,JSON Web令牌是一种开放的行业标准RFC 7519方法,用于·在两方安全地表示声明。具体网上有许多文章介绍,这里做简单的使用。

1.数据结构

JSON Web Token 由三部曲组成,他们之间用圆点  .进行分割,一个标准的JWT形如xxx.yyy.zzz

  • Header
  • Payload
  • Signature
1.1 header

头部,由两部分组成;token的类型( JWT)和算法名称(HMAC 、SHA256、RSA......)。

实例:

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

然后通过Base64对这个JSON编码就得到JWT得第一部分

1.2Payload

第二部分具体得实体,可以写入自定义的数据信息,有三种类型

  • Registered claims :这里有一组预定义的声明,他们不是强制的,但是推荐。如;iss(issuer签发者)exp(expiration time 有效期),sub(subject),aud(audience)等。
  • public claims:可以随意定义。
  • private claims :用于在同意使用它们的各方之间共享信息,并且不是注册的或者公开的声明

实例:

{
"iss": "加油",
"exp": 182309645,
"uname": "妮甲"
}

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

1.3 Signature

为了得到签名部分,你必须有编过码的header、编过码的payload、一个密钥,签名算法是header中指定的那个,然后对他们签名即可

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

1.4具体实例

下面给出一个基于java-jwt生成的具体实例

public static void main(String[] args){

String token = JWT.create().withIssuer("加油").withExpiresAt(new Date(System.currentTimeMillis() + 86400_000))
       .withPayload(MapUtils.create("uname" , "妮甲" ))  
       .sign(Alogorithm.HMAC256("helloWorld"));
        
        System.out.println(token);  


}

技术派的应用

1.通过jwt鉴权方案

JWT鉴权流程

一个简单的基于jwt的身份验证方案如下图

基本流程分三步:

  • 1. 用户登录成功后,后端将生成的jwt返回给前端,然后前端将其保存在本地缓存;
  • 2. 之后前端与后端的交互时,都将jwt放在请求头中,比如可以将其放在Http的身份认证的请求头AUthorization ,也可以通过自定义的请求头来传递
  • 3. 后端接收到用户的请求,从请求头中获取jwt,然后进行校验,通过后,才相应相关的接口;否则表示未登录。

说明:项目采用session的方案,将jwt写入到coolik中

2. jwt的使用

接下来看在技术派中的实际使用场景,核心逻辑在

我们直接在之前session的基础上进行优化,这里主要借助开源项目java-jwt来实现JWT的生成管理

生成JWT的实现

我们定义了签发者、有效期,指定了签名算法,然后实体类中,携带两个信息

  • s:即之前生成的sesionId ,我们借助自定义的traceId生成工具来生成唯一的会话id
  • u:用户userId

上面的实现中,有几个通用的成员属性,我们通过自定义的配置,再启动项目时进行初始化,避免后续的重复创建

自定义的jwt三个配置属性

paicoding:
    jwt:
      issuer: pai_coding #签发者
      secret:hello_world #签名密钥
      expire: 2592000000 #jwt有效期 ,默认30天
jwt校验

用户每次请求时,依然是沿用之前的session方式的校验逻辑,在Filter层,从请求头中,获取Cookie,找到对应的jwt,然后尝试根据jwt获取对应的用户信息。

注意上面的实现,即便是jwt校验通过了,我们也依然从redis中查了一下,判断是否有效

为啥这样设计?

因为jwt本身无状态,后端完全可以将redis这一层的存储都直接干掉,纯依赖jwt的特性来完成身份鉴权,但由于它的无状态,后端减少存储压力是一个好处,同样也是一个弊端,后端失去了token的管控权,如果我们希望提前失效某些用户身份,则无法持续,鉴于此,这里依然保留了redis中存储jwt的方案。

3.实例体验

接下来我们实际体验一下,线上运行技术派的jwt,登录之后,找到一个请求,找到cookie中的f-session

我们解析一下这个是啥?

站在用户的角度,说实话你用session还是jwt,没啥实质的感受差异,那为啥还有两种不同的技术方案?

session与jwt的对比
jwtsession
前端存储,通用的校验规则,后端再获取jwt时校验是否有效前端存索引,后端判断session是否有效
验签,不可篡改无签保障,安全性有后端保障
可存储非敏感信息,如头像,用户名

一般不存储业务信息

jwt生成时,指定了有效期,本身不支持续期以及提前失效后端控制有效期,可提前失效或者自动续期
通常以请求头方式传递通常以cookie方式传递
可预防csrf攻击session-cookie方式存在csrf风险

注:csrf攻击

如在网站页面上,添加如下内容

然后当你访问此网站时,结果发现你在技术派上登录的用户被注销啦

使用jwt预防csrf攻击的主要原理就是jwt通过请求头,由js主动塞进去传递给后端,而非cookie的方式,从而避免csrf漏洞攻击,技术派的jwt也是采用cookie进行携带jwt,并不能解决上面这个个问题;同样,session方案,也可以将sessionId通过请求头的方式传递,按照这个说法也能避免csrf。

通常的方案由;

session-cookie方案

jwt-requestHeader方案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/431922.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

#include<ros/ros.h>头文件报错

快捷键 ctrl shift B 调用编译,选择:catkin_make:build)(要先在vscode上添加扩展:ros) 可以点击配置设置为默认,修改.vscode/tasks.json 文件 修改.vscode/tasks.json 文件,否则ros.h头文件会报错 内容修改为以下内…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:拖拽控制)

设置组件是否可以响应拖拽事件。 说明: 从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 ArkUI框架对以下组件实现了默认的拖拽能力,支持对数据的拖出或拖入响应,开发者只需要将这些组件…

残差网宽度残差网

目录 from # 从ResNet说起 # 更深的网络 # 理解shortcut # WRN之宽度残差块 # 退化现象 from WideResNet(宽残差网络)算法解析-鸟类识别分类-Pytorch实战-CSDN博客 # 前言 ResNet可以训练出更深的CNN模型ResNet模型的核心是建立前面层和后面层之间“短路链接”&#xff…

【Proteus仿真】【Arduino单片机】坐姿矫正提醒器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用LCD1602液晶显示模块、HC-SR04超声波模块、蜂鸣器、按键、人体红外传感器等。 主要功能: 系统运行后,LCD1602显示超声…

java——2024-03-03

String类的对象能被修改吗?如果不能需要用什么修改?StringBuilder和StringBuffer的区别?equals和区别谈谈对面向对象的理解重载和重写的区别说一下ArrayList,LinkedList底层实现以及区别什么是哈希冲突?hashMap和conCu…

tomcat动静分离和负载均衡

目录 引言 1.实验环境搭建 2.部署Nginx服务器及配置静态页面Web服务 3.部署Tomcat服务及配置动态页面Web服务 4.实验验收 动态页面 静态页面 引言 tomcat服务既可以处理动态页面,也可以处理静态页面;但其处理静态页面的速度远远不如nginx和apache…

笨办法学 Python3 第五版(预览)(三)

原文:Learn Python the Hard Way, 5th Edition (Early Release) 译者:飞龙 协议:CC BY-NC-SA 4.0 练习 30:假如 这是你将要输入的下一个 Python 脚本,它向你介绍了if语句。输入这个代码,确保它能够完美运行…

gin gorm学习笔记

代码仓库 https://gitee.com/zhupeng911/go-advanced.git https://gitee.com/zhupeng911/go-project.git 1. gin介绍 Gin 是使用纯 Golang 语言实现的 HTTP Web框架,Gin接口设计简洁,提供类似Martini的API,性能极高,现在被广泛使用…

基于ZYNQ PS-SPI的Flash驱动开发

本文使用PS-SPI实现Flash读写,PS-SPI的基础资料参考Xilinx UG1085的文档说明,其基础使用方法是,配置SPI模式,控制TXFIFO/RXFIFO,ZYNQ的IP自动完成发送TXFIFO数据,接收数据到RXFIFO,FIFO深度为12…

Vmware Workstation 不可恢复错误:0xc0000005 has occured

上周打开虚拟机的时候报错:Vmware Workstation 不可恢复错误:0xc0000005 has occured,查看网上资料说是vmware版本太低,需要手动更新本地版本。 由于本地网络不是很好,没能正常更新,无意中出现问题前更改了…

概率基础——极大似然估计

概率基础——极大似然估计 引言 极大似然估计(Maximum Likelihood Estimation,简称MLE)是统计学中最常用的参数估计方法之一,它通过最大化样本的似然函数来估计参数值,以使得样本出现的概率最大化。极大似然估计在各…

docker单节点搭建在线商城

本文档使用到的软件包以上传到资源中 目录 1. 创建容器并配置基础内容 1.1 将gpmall-repo上传到容器中 1.2 添加yum源 2. 安装基础服务 2.1 安装JAVA环境 2.2 安装Redis缓存服务 2.3 安装Elasticsearch服务 2.4 安装Nginx服务 2.5 安装MariaDB数据库 2.6 安…

数据库分库分表中间件选择

目前分库分表的中间件有三种设计思路,分别是: 采用分散式架构,适用于用Java开发的高性能轻量级OLTP应用程序,以Sharding-JDBC为代表。采用中间层Proxy架构,提供了静态输入和所有语言支持,适用于OLAP应用程…

验证Tomcat进程是否启动成功 ps -ef | grep tomcat

验证Tomcat启动是否成功,有多种方式: 查看启动日志 more /usr/local/apache-tomcat-9.0.86/logs/catalina.out tail -50 /usr/local/apache-tomcat-9.0.86/logs/catalina.out 查看进程 ps -ef | grep tomcat 注意: ps命令是linux下非常强…

《剑指offer》14--剪绳子(整数拆分)[C++]

目录 题目描述 贪心算法 输出结果 题目描述 把一根绳子剪成多段,并且使得每段的长度乘积最大。 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释:…

ZYNQ--PS_PL交互(AXI_HP)

AXI_HP接口 通过AXI_HP接口,可直接通过AXI_FULL协议向DDR中通过DMA传输数据。 BD设计 AXI_HP接口设置 AXI_Master代码 module axi_full_master #(parameter C_M_TARGET_SLAVE_BASE_ADDR 32h40000000,parameter integer C_M_AXI_BURST_LEN 16,parameter …

代码随想录算法训练营第22天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

目录 一、力扣235.二叉搜索树的最近公共祖先1.1 题目1.2 思路1.3 代码 二、力扣701.二叉搜索树中的插入操作2.1 题目2.2 思路2.3 代码 三、力扣450.删除二叉搜索树中的节点3.1 题目3.2 思路3.3 代码3.4 总结 一、力扣235.二叉搜索树的最近公共祖先 1.1 题目 1.2 思路 利用二叉…

09-Linux部署Redis

Linux部署Redis 简介 Redis,全称为Remote Dictionary Server(远程字典服务),是一个开源的、使用ANSI C语言编写的、支持网络连接的、基于内存的、同时支持持久化的日志型Key-Value数据库,并提供多种语言的API。 Red…

七、西瓜书——降维与度量学习

1.K近邻 k 近邻(k-Nearest Neighbor,简称 kNN)学习是一种常用的监督学习方法,其工作机制非常简单: 给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测,通常,在分类任务中可使用“投票法”&#…

$nextTick底层原理(详细) - vue篇

公众号:需要以下pdf,关注下方 2023已经过完了,让我们来把今年的面试题统计号,来备战明年的金三银四!所以,不管你是社招还是校招,下面这份前端面试工程师高频面试题,请收好。 前言 n…