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的对比
| jwt | session |
| 前端存储,通用的校验规则,后端再获取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方案
。
相关文章:
JWT身份验证
在实际项目中一般会使用jwt鉴权方式。 JWT知识点 jwt,全称json web token ,JSON Web令牌是一种开放的行业标准RFC 7519方法,用于在两方安全地表示声明。具体网上有许多文章介绍,这里做简单的使用。 1.数据结构 JSON Web Token…...
IOS面试题object-c 71-80
71. 简单介绍下NSURLConnection类及 sendSynchronousRequest:returningResponse:error:与– initWithRequest:delegate:两个方法的区别?NSURLConnection 主要用于网络访问,其中 sendSynchronousRequest:returningResponse:error:是同步访问数据,即当前…...
计算机mfc140.dll文件缺失的修复方法分析,一键修复mfc140.dll
电脑显示mfc140.dll文件缺失信息时,不必担心,这通常是个容易解决的小问题。接下来让我们详细探究并解决mfc140.dll文件缺失的状况。以下将详述相应的解决方案,从而帮助您轻松克服这一技术难题。通过几个简单步骤,即可恢复正常使用…...
web前端框架
目前比较火热的几门框架: React React是由Facebook(脸书)开发和创建的开源框架。React 用于开发丰富的用户界面,特别是当您需要构建单页应用程序时。它是最强大的前端框架。 弊端: 您不具备 JavaScript 的实践知识,则建议不要使用 React。同样&#x…...
关于playbook中when条件过滤报The conditional check ‘result|failed‘ failed的问题
问题现象 在使用plabook中的when做过滤脚本如下: --- - hosts: realserversremote_user: roottasks:- name: Check if httpd service is runningcommand: systemctl status httpdregister: resultignore_errors: True- name: Handle failed service checkdebug:ms…...
【设计模式专题之抽象工厂模式】3. 家具工厂
题目描述 小明家新开了两个工厂用来生产家具,一个生产现代风格的沙发和椅子,一个生产古典风格的沙发和椅子,现在工厂收到了一笔订单,请你帮他设计一个系统,描述订单需要生产家具的信息。 输入描述 输入的第一行是一…...
架构:Apache Kafka Connect实现sqlserver数据实时同步
实现Apache Kafka Connect与SQL Server之间的实时数据同步,您可以使用Kafka Connect的JDBC Source Connector。以下是一个基本的步骤: 1. 安装Kafka Connect:确保您已经安装了Apache Kafka 和 Kafka Connect。您可以从Apache Kafka的官方网站…...
C语言:深入补码计算原理
C语言:深入补码计算原理 有符号整数存储原码、反码、补码转换规则数据与内存的关系 补码原理 有符号整数存储 原码、反码、补码 有符号整数的2进制表示方法有三种,即原码、反码和补码 三种表示方法均有符号位和数值位两部分,符号位用0表示“…...
【Pytorch】新手入门:基于sklearn实现鸢尾花数据集的加载
【Pytorch】新手入门:基于sklearn实现鸢尾花数据集的加载 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望…...
maven项目引入私有jar,并打包到java.jar中
私有jar存放位置 maven依赖 <dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId><version>1.1.10</version><scope>system</scope><systemPath>${project.basedir}/s…...
Django中的Cookie和Session
文章目录 cookie是什么Django中如何使用cookieCookie使用示例session是什么Django中如何使用会话sessionSession使用示例小结 HTTP协议本身是”无状态”的,在一次请求和下一次请求之间没有任何状态保持,服务器无法识别来自同一用户的连续请求。有了cooki…...
Git-安装与使用(快速上手图文教程)
Git-安装与使用(快速上手图文教程) - 知乎 克隆: 首先你进去你要存放代码的位置,比如将代码存放到D盘,然后在D盘中右键,点击Git Bash Here,就是说本地仓库要在D盘建立。然后出现git 命令行界面…...
VBA_NZ系列工具NZ02:VBA读取PDF使用说明
我的教程一共九套及VBA汉英手册一部,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到数据库,到字典,到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑,这么多知识点该如何组织…...
如何在paddlehub库中找到paddlehub.Module()所在的位置
要在PaddleHub库中找到paddlehub.Module()的位置,您可以通过以下步骤在PaddleHub库的源代码中进行查找: 1.确定PaddleHub库的安装位置:首先,确定您安装PaddleHub库的位置。通常,PaddleHub库会被安装在Python的site-pa…...
创建旅游景点图数据库Neo4J技术验证
文章目录 创建旅游景点图数据库Neo4J技术验证写在前面基础数据建库python3源代码KG效果KG入库效率优化方案PostGreSQL建库 创建旅游景点图数据库Neo4J技术验证 写在前面 本章主要实践内容: (1)neo4j知识图谱库建库。使用导航poi中的公园、景…...
Docker一键部署WordPress
使用Docker安装WordPress相对传统安装方式更加便捷高效,因为它可以快速创建一个包含所有必要组件(Web服务器、PHP和MySQL数据库)的独立容器环境。下面是一个简化的步骤说明如何使用Docker和Docker Compose安装WordPress: 一 安装…...
C++的类与对象(五):赋值运算符重载与日期类的实现
目录 比较两个日期对象 运算符重载 赋值运算符重载 连续赋值 日期类的实现 Date.h文件 Date.cpp文件 Test.cpp文件 const成员 取地址及const取地址操作符重载 比较两个日期对象 问题描述:内置类型可直接用运算符比较,自定义类型的对象是多个…...
【uni-app小程序开发】实现一个背景色渐变的滑动条slider
先直接附上背景色渐变的滑动条slider uni-module插件地址:https://ext.dcloud.net.cn/plugin?id16841 最近做的一个用uni-appvue2开发的微信小程序项目中要实现一个滑动进度控制条,如下图所示: 1. 滑动条需要渐变背景色 2. 滑块的背景色需…...
Claude3横空出世:颠覆GPT-4,Anthropic与亚马逊云科技共启AI新时代
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
【AI视野·今日NLP 自然语言处理论文速览 第八十三期】Wed, 6 Mar 2024
AI视野今日CS.NLP 自然语言处理论文速览 Wed, 6 Mar 2024 Totally 74 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MAGID: An Automated Pipeline for Generating Synthetic Multi-modal Datasets Authors Hossein Aboutalebi, …...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

