当前位置: 首页 > news >正文

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方案

相关文章:

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协议本身是”无状态”的&#xff0c;在一次请求和下一次请求之间没有任何状态保持&#xff0c;服务器无法识别来自同一用户的连续请求。有了cooki…...

Git-安装与使用(快速上手图文教程)

Git-安装与使用&#xff08;快速上手图文教程&#xff09; - 知乎 克隆&#xff1a; 首先你进去你要存放代码的位置&#xff0c;比如将代码存放到D盘&#xff0c;然后在D盘中右键&#xff0c;点击Git Bash Here&#xff0c;就是说本地仓库要在D盘建立。然后出现git 命令行界面…...

VBA_NZ系列工具NZ02:VBA读取PDF使用说明

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…...

如何在paddlehub库中找到paddlehub.Module()所在的位置

要在PaddleHub库中找到paddlehub.Module()的位置&#xff0c;您可以通过以下步骤在PaddleHub库的源代码中进行查找&#xff1a; 1.确定PaddleHub库的安装位置&#xff1a;首先&#xff0c;确定您安装PaddleHub库的位置。通常&#xff0c;PaddleHub库会被安装在Python的site-pa…...

创建旅游景点图数据库Neo4J技术验证

文章目录 创建旅游景点图数据库Neo4J技术验证写在前面基础数据建库python3源代码KG效果KG入库效率优化方案PostGreSQL建库 创建旅游景点图数据库Neo4J技术验证 写在前面 本章主要实践内容&#xff1a; &#xff08;1&#xff09;neo4j知识图谱库建库。使用导航poi中的公园、景…...

Docker一键部署WordPress

使用Docker安装WordPress相对传统安装方式更加便捷高效&#xff0c;因为它可以快速创建一个包含所有必要组件&#xff08;Web服务器、PHP和MySQL数据库&#xff09;的独立容器环境。下面是一个简化的步骤说明如何使用Docker和Docker Compose安装WordPress&#xff1a; 一 安装…...

C++的类与对象(五):赋值运算符重载与日期类的实现

目录 比较两个日期对象 运算符重载 赋值运算符重载 连续赋值 日期类的实现 Date.h文件 Date.cpp文件 Test.cpp文件 const成员 取地址及const取地址操作符重载 比较两个日期对象 问题描述&#xff1a;内置类型可直接用运算符比较&#xff0c;自定义类型的对象是多个…...

【uni-app小程序开发】实现一个背景色渐变的滑动条slider

先直接附上背景色渐变的滑动条slider uni-module插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id16841 最近做的一个用uni-appvue2开发的微信小程序项目中要实现一个滑动进度控制条&#xff0c;如下图所示&#xff1a; 1. 滑动条需要渐变背景色 2. 滑块的背景色需…...

Claude3横空出世:颠覆GPT-4,Anthropic与亚马逊云科技共启AI新时代

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

【AI视野·今日NLP 自然语言处理论文速览 第八十三期】Wed, 6 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 6 Mar 2024 Totally 74 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MAGID: An Automated Pipeline for Generating Synthetic Multi-modal Datasets Authors Hossein Aboutalebi, …...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...