JWT深入浅出

文章目录

  • JWT深入浅出
    • 1.JWT是什么
    • 2.为什么选JWT
      • 2.1 传统Session认证
      • 2.2 JWT认证
    • 3.JWT怎么用
    • 4. jwt绝对安全吗?

JWT深入浅出

1.JWT是什么

JWT(JSON Web Token)是一种用于在网络应用间传递信息的开放标准,通常用于身份认证和非敏感数据的传递(签名技术是保证传输的信息不被篡改,并不能保证信息传输的安全

JWT以点分隔的三部分组成:Header头部,Payload载荷,Signature签名

JWT举例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

我们可以直接通过官网(https://jwt.io/#debugger-io)解析出JWT三部分表示的内容

  • Header头部:通常包含Token类型(即JWT)和使用的签名加密算法,用JSON格式表示,将JOSN对象用base64编码得到JWT的Header部分(不是加密,是编码!)
  • Payload有效载荷:携带数据。是一个包含了声明 (claims) 的 JSON 对象,用于描述关于 JWT 的信息。
  • Signature签名:JWT 的签名通常是通过使用密钥和指定的加密算法对头部和负载进行签名生成的。密钥存储在服务器端,JWT的签发生成就是在服务器端完成。注意:服务器JWT 的签名部分用于验证 JWT 的完整性和真实性。

验证 JWT 时,接收方会使用相同的密钥和算法,对接收到的头部和负载进行签名计算,并与 JWT 中的签名部分进行比较。如果两者一致,则说明 JWT 是合法的,且未被篡改;否则,JWT 将被视为不可信任或无效。

签名部分的存在使得 JWT 在传输过程中具有完整性和真实性保护,但是需要确保密钥的安全性,因为持有正确密钥的任何人都能够验证 JWT 的真实性。

下面扩展对称加密和非对称加密:

  • 对称加密:对称加密使用相同的密钥来加密和解密数据。这意味着发送方和接收方都必须共享同一个密钥
  • 非对称加密:非对称加密使用一对密钥,分为公钥和私钥。公钥用于加密数据,私钥用于解密数据

2.为什么选JWT

常用于用户认证

2.1 传统Session认证

用户通过用户名密码进行身份验证,服务器端验证用户提供的凭据是否正确并确定用户是否有权限访问该资源。

如果用户提供凭据有效,服务器会创建并维护一个会话Session,记录用户相关的身份权限信息,并响应用户一个包含会话标识符session IDCookie。客户端cookie存储在本地,并在后续每次请求携带cookie(包含session ID)。服务器会通过session ID来识别用户

image-20240420113820653

暴露的问题:

  • 随着用户激增,服务器端在内存中维护的session开销也会很大,服务器增加负担(JWT就只需要根据签名加密算法和密钥验证JWT即可,无需繁琐操作)
  • 由于session是存在与服务器的物理内存中。在分布式的应用上,存在相同资源的多个服务器,难道每个服务器都登录授权?这大大限制了负载均衡器的能力。以此限制了分布式应用的扩展能力,不方便集群应用。(JWT就只需要根据签名加密算法和密钥验证JWT即可,无需繁琐操作)虽然可以将session统一保存到Redis中,但是这样做无疑增加了系统的复杂性,对于不需要redis的应用也会白白多引入一个缓存中间件
  • 因为session认证本质基于cookie,所以如果cookie被截获,用户很容易收到跨站请求伪造攻击。并且如果浏览器禁用了cookie,这种方式也会失效
  • 前后端分离系统中更加不适用,后端部署复杂,前端发送的请求往往经过多个中间件到达后端,cookie中关于session的信息会转发多次
  • 由于基于Cookie,而cookie无法跨域,所以session的认证也无法跨域,对单点登录不适用(单点登录是一种身份认证和授权机制,它允许用户使用同一套认证信息(如用户名和密码)来访问多个相关的、但又是相互独立的软件应用系统)

2.2 JWT认证

用户通过用户名密码进行身份验证,服务器端核对用户名密码后,生成JWT返回前端,前端本地存储JWT(推出登录删除JWT即可),并在后续的请求中携带JWT,服务器处理请求时只需要验证JWT的合法性即可(即通过密钥和签名加密算法对Header和payload部分进行加密,若与签名部分相等即为合法)

image-20240420115750584

JWT优点:

  • 不需要在服务端保存会话信息,特别适用于分布式微服务
  • Token是以JSON加密的形式保存在客户端,所以JWT是跨语言的,原则上任何web形式都支持
  • 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库
  • 单点登录友好:使用Session进行身份认证的话,由于cookie无法跨域,难以实现单点登录。但是使用token进行认证及没有这样的问题

3.JWT怎么用

添加依赖

<dependencies><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency>
</dependencies>

添加工具类:

import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;
import java.util.Date;public class JwtHelper {//指定jwt过期时间private static long tokenExpiration = 365*24*60*60*1000;//指定jwt的签名密钥private static String tokenSignKey = "lpyx";//根据usesrId和userName创建JWT并返回public static String createToken(Long userId, String userName) {String token = Jwts.builder().setSubject("lpyx-USER").setExpiration(new Date(System.currentTimeMillis() + tokenExpiration)).claim("userId", userId).claim("userName", userName).signWith(SignatureAlgorithm.HS512, tokenSignKey).compressWith(CompressionCodecs.GZIP).compact();return token;}//通过jwt返回用户idpublic static Long getUserId(String token) {if(StringUtils.isEmpty(token)) return null;Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);Claims claims = claimsJws.getBody();Integer userId = (Integer)claims.get("userId");return userId.longValue();}public static String getUserName(String token) {if(StringUtils.isEmpty(token)) return "";Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);Claims claims = claimsJws.getBody();return (String)claims.get("userName");}public static void removeToken(String token) {//jwttoken无需删除,客户端扔掉即可。}public static void main(String[] args) {String token = JwtHelper.createToken(7L, "admin");System.out.println(token);System.out.println(JwtHelper.getUserId(token));System.out.println(JwtHelper.getUserName(token));}
}

4. jwt绝对安全吗?

为了防止JWT被挟持和恶意攻击,可以采取以下措施:

  1. 使用HTTPS:确保JWT在传输过程中使用HTTPS协议进行加密传输,以防止中间人攻击。
  2. 设置合适的过期时间:为JWT设置较短的过期时间,以减少JWT被挟持后的风险。
  3. 存储敏感信息在服务器端:不要在JWT中存储敏感信息,如密码、密钥等。这些信息应该存储在服务器端的安全存储中。
  4. 验证JWT的完整性:在服务器端验证JWT的签名和负载内容,确保JWT没有被篡改或伪造。
  5. 防止CSRF攻击:使用CSRF令牌、验证请求来源等方法来防止CSRF攻击。
  6. 限制JWT的使用范围:为JWT设置适当的使用范围(audience),确保JWT只能在指定的应用程序或服务中使用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java --- 集合(1)--- 带你了解Collection接口以及三种遍历方式

引言&#xff1a;本期博客摘选黑马程序员与Java从入门到精通&#xff0c;如果有不准确的地方还请指出&#xff0c;另外也感谢各位大佬点击进来观看。 目录 一.什么是集合&#xff1f; 二.单列集合的体系结构&#xff1a; 三.Collection接口的使用&#xff1a; 四.Collection…

【Java】/*方法的递归*/

目录 一、递归的概念 二、递归执行过程分析 三、递归练习 3.1 按顺序打印一个数字的每一位&#xff0c;例如123打印出1 2 3 3.2 递归求 1 2 3 ... n 的和 3.3 输入一个非负整数&#xff0c;返回组成它的数字之和&#xff0c;例如123&#xff0c;得123 3.4 求斐波那契…

Android AOSP Ubuntu源码编译电脑卡顿问题定位解决

文章目录 问题概述分析问题解决问题查看交换分区创建交换分区删除交换分区调整交换分区的活跃度 问题概述 开发SystemUI时&#xff0c;使用内存为16G的主机&#xff0c;Ubuntu 20.04的系统编译SystemUI的源码&#xff0c;编译的过程中发现电脑卡顿&#xff0c;鼠标不能移动。必…

Docker学习笔记(一)安装Docker、镜像操作、容器操作、数据卷操作

文章目录 1 Docker介绍1.1 Docker的优势1.1.1 应用部署的环境问题1.1.2 Docker解决依赖兼容问题1.1.3 Docker解决操作系统环境差异1.1.4 小结 1.2 Docker和虚拟机的区别1.3 Docker架构1.3.1 镜像和容器1.3.2 DockerHub1.3.3 Docker架构 1.4 安装Docker1.4.1 卸载旧版本Docker&a…

【qt】纯代码界面设计

界面设计目录 一.界面设计的三种方式1.使用界面设计器2.纯代码界面设计3.混合界面设计 二.纯代码进行界面设计1.代码界面设计的总思路2.创建项目3.设计草图4.添加组件指针5.初始化组件指针6.添加组件到窗口①水平布局②垂直布局③细节点 7.定义槽函数8.初始化信号槽9.实现槽函数…

盛邦安全荣获北京市海淀区上地街道财源建设工作表彰

近日&#xff0c;盛邦安全受邀出席上地街道2024年第一季度财源建设工作联席会暨上地人工智能产业报告发布大会并收到上地街道颁发的感谢信&#xff0c;这是对公司技术创新、管理提升、营收增长&#xff0c;持续为上地地区财源建设做出突出贡献的鼓励。 盛邦安全副总裁、董事会秘…

ApiHug Official Website

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | MarketplaceApiHug-H…

TCP的延时应答和捎带应答详解

一、延时应答 延时应答是指TCP接收方在接收到数据包后&#xff0c;并不立即发送确认&#xff08;ACK&#xff09;消息&#xff0c;而是等待一段时间&#xff0c;以期望在该时间段内收到更多的数据包&#xff0c;从而实现合并多个ACK消息为一个&#xff0c;减少网络中的确认消息…

全民拼购:被低估的商机,惊人的业绩潜力

今日&#xff0c;我要与大家探讨的是一种似乎被遗忘&#xff0c;但实则蕴含巨大商机的模式与策略。尽管它在外界看来或许并不起眼&#xff0c;但我的一位客户却凭借这一策略&#xff0c;实现了令人瞩目的业绩——日销售额逼近五千万&#xff0c;日订单量更是高达惊人的300万单。…

[C++基础编程]----预处理指令简介、typedef关键字和#define预处理指令之间的区别

目录 引言 正文 01-预处理指令简介 02-typedef关键字简介 03-#define预处理指令简介 04-#define预处理指令和typedef关键字的区别 &#xff08;1&#xff09;原理不同 &#xff08;2&#xff09;功能不同 &#xf…

TEA: Temporal Excitation and Aggregation for Action Recognition 论文阅读

TEA: Temporal Excitation and Aggregation for Action Recognition 论文阅读 Abstract1. Introduction2. Related Works3. Our Method3.1. Motion Excitation (ME) Module3.1.1 Discussion with SENet 3.2. MultipleTemporal Aggregation(MTA) Module3.3. Integration with Re…

QT如何增删安装的组件

打开 uninstall QT 往下会看到让你选择 add or remove component。 接下去就可以修改组件了

Python快速入门-零基础也能掌握的编程技巧,基础方法和API整理

目录 前言 数据结构 数字 数学运算 随机数 字符串 列表 元组 字典 面向对象 JSON 文件操作 扩展 制作一个简易时钟 前言 环境什么就不在赘述&#xff0c;可以参考其他文章&#xff0c;也可以在线运行 CSDN在线运行地址&#xff1a;InsCode - 让你的灵感立刻落地…

Amesim基础篇-热仿真常用模型库-Thermal Hydraulic /Resistance

有言在先 流体库、管路库在热管理中是必备模块&#xff0c;如动力电池液冷循环系统均需要Thermal Hydraulic /Resistance库的元件建模。 1 流体物性设置 AMEsim中内嵌了大部分液冷的热物性&#xff0c;直接在流体子模型上选择即可。常规使用的是50%乙二醇水溶液&#xff0c;如…

水表智能抄表系统是什么?

水表智能抄表系统是一种现代化水资源保护专用工具&#xff0c;它利用先进的物联网、云计算和大数据剖析&#xff0c;完成了智能抄表、实时监控系统、数据分析等作用&#xff0c;大大提高了水务管理的效率和精确性。 1.功能特点 1.1远程控制自动抄表 传统水表抄水表方法采用人…

sentinel-dashborard下发流控规则未生效排查解决

Sentinel简介 Sentinel是阿里巴巴开源的一个流量控制组件&#xff0c;它以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。Sentinel的核心思想是&#xff1a;通过动态设置的规则&#xff0c;对进入系统的流量进行控制&#xff0c;…

C#知识|将选中的账号信息展示到控制台(小示例)

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 上篇学习了控件事件的统一关联&#xff0c; 本篇通过实例练习继续学习事件统一处理中Tag数据获取、对象的封装及泛型集合List的综合运用。 01 实现功能 在上篇的基础上实现&#xff0c;点击选中喜欢的账号&#xff0…

如何将Hyper-V转VMware?反之亦可

为何要在Hyper-V和VMware之间进行转换呢&#xff1f; 尽管VMware和Microsoft Hyper-V都是当前流行的一类虚拟机监控程序&#xff0c;但它们并不相互兼容。VMware产品使用VMDK格式创建虚拟磁盘&#xff0c;而Hyper-V则使用VHD或VHDX格式创建虚拟磁盘。 有时您可能需要进行这种转…

Edge视频增强功能

edge://flags/#edge-video-super-resolution 搜索Video查找 Microsoft Video Super Resolution 设置为Enabled

凸优化理论学习一|最优化及凸集的基本概念

文章目录 一、优化问题&#xff08;一&#xff09;数学优化&#xff08;二&#xff09;凸优化 二、凸集&#xff08;一&#xff09;一些标准凸集&#xff08;二&#xff09;保留凸性的运算&#xff08;三&#xff09;正常锥和广义不等式&#xff08;四&#xff09;分离和支撑超…