JWT技术选型以及相关功能的实现

一.技术选型

1.为什么不用Session+Cookie,而要用Token?

【1】无状态

什么是无状态服务

无状态服务是指在处理请求时不存储任何会话信息或状态信息的服务。这意味着每个请求都是独立且相互独立的,服务不会在请求之间保留任何状态。

Session-Cookie方案的缺陷

先回顾一下使用Session-Cookie方案:
1.用户成功登陆系统,会创建一个会话对象Session,然后返回给客户端器对应的SessionID的Cookie 。
2.当用户向后端发起请求的时候会把 SessionID 带上。拿到这个SessionID后后端就可以找到对应的Session从而获取你的身份状态。

单体项目用Session-Cookie方案是不错的,但是对于微服务项目,Session-Cookie方案就面临挑战。

举个例子:用户在A服务器进行了登录,此时用户的 Session 信息保存在 A 服务器。但是用户下次请求B服务器,需要用到该Session信息,此时由于 B 服务器没有保存 用户的 Session 信息,导致用户需要重新进行登陆。

存在一些解决方案。例如有几个方案可供大家参考:

1.某个用户的所有请求都通过特性的哈希策略分配给同一个服务器处理。这样的话,每个服务器都保存了一部分用户的 Session 信息。服务器宕机,其保存的所有 Session 信息就完全丢失了。

2.每一个服务器保存的 Session 信息都是互相同步的,也就是说每一个服务器都保存了全量的 Session 信息。当节点多的时候,同步成本高,并且系统的一致性和可靠性也会收到影响。

3.单独使用一个所有服务器都能访问到的数据节点(比如缓存)来存放 Session 信息。为了保证高可用,数据节点尽量要避免是单点。

4.Spring Session 是一个用于在多个服务器之间管理会话的项目。它可以与多种后端存储(如 Redis、MongoDB 等)集成,从而实现分布式会话管理。通过 Spring Session,可以将会话数据存储在共享的外部存储中,以实现跨服务器的会话同步和共享。 

使用Token代替会话技术实现无状态认证

在JWT的中自包含了身份验证所需要的信息,因此,我们的服务器不需要存储 Session 信息。只需要在登录的时候返回给客户端一个Token密钥,然后每次请求各个微服务都携带这个Token解析获得用户信息即可。这种方案解决了原来Session-Cookie方案的问题,并减轻了服务端的存储压力,从而实现无状态服务。

【2】防止CSRF

CSRF(Cross Site Request Forgery) 一般被翻译为 跨站请求伪造 。

那么什么是跨站请求伪造呢?说简单点,就是用你的身份去发送一些对你不友好的请求,完成需要你权限的操作。

举个例子,比如银行转账的链接如果如下:

http://www.mybank.com/Transfer?bankId=11&money=10000

这个转账肯定需要你的权限,如果用Cookie,因为Cookie是无感知的发送,你点击链接的同时自动携带了带有sessionId的Cookie,那这个操作无意间完成了,然后你钱就没了。

而JWT一般会存放在localStorage 中。与Cookie不同的是,它不是点击链接就自动发送的,前端的每一个请求后续都需要通过JS代码附带上这个 JWT。所以即使你点击了链接,这个请求也不会完成,因为没有权限。

总结来说,Cookie无感知发送,需要你的权限的相关操作点击个链接就可能被完成。而JWT需要通过代码,单凭一个链接无法实现CSRF。

【3】适合移动端

移动端不能用想网页端一样的Cookie。然后如果硬要用session的话可能不同平台有不同的传递sessionId的方式。

而JWT是通用的。

【4】适合单点登录

首先服务端不同设备之间的session无法互通。
其次cookie不能跨域,比​如sso.example.com接收的cookie只能在本域名下发送,如果用户尝试在另一个域名(如app.example.com)下发送请求,浏览器会根据同源策略阻止该 Cookie 被发送到另一个域名。除非在服务端允许跨域。

2.为什么不直接用账号和密码加密传回,而是用Token

【1】防止密码盗窃

因为如果用密码和账号加密传回的话如果被窃取用来伪造请求,这时候我们就必须让密码失效。而如果是Token,我们只需要在缓存中将token失效即可。(一般有缓存来控制token状态)

【2】无状态

在JWT的中自包含了身份验证所需要的信息,因此我们不用再去数据库中查。

二.相关功能实现

我们一般会用Redis维护Token,一般采用黑名单和白名单。

黑名单的话是指维护登出注销但未过期的Token,白名单是维护有效的Token。

1.登出功能的实现

【1】黑名单

登出的时候将过期的Token存入黑名单。每次请求判断是否在黑名单中。

【2】白名单

创建Token存入白名单中,注销的时候把Token删除。每次请求判断是否在白名单中。

2.实现单账号登录(顶号)和控制多账号登录

需要使用白名单。

单账号登录:键为userId,值只能一个。这样在另一个设备重新登录,则原先Token就被代替,实现顶号。

多账号登录:键为user,值可以list。可以控制列表的长度控制登录设备的多少。

3.续签(无感知登录)--双Token

第一个是 accessJWT ,它的过期时间 JWT 本身的过期时间比如半个小时,另外一个是 refreshJWT 它的过期时间更长一点比如为 1 天。refreshJWT 只用来获取 accessJWT,不容易被泄露。

客户端登录后,将 accessJWT 和 refreshJWT 保存在本地,每次访问将 accessJWT 传给服务端。服务端校验 accessJWT 的有效性,如果过期的话,就将 refreshJWT 传给服务端。如果有效,服务端就生成新的 accessJWT 给客户端。否则,客户端就重新登录即可。

这种方案的不足是:

  • 需要客户端来配合;
  • 用户注销的时候需要同时保证两个 JWT 都无效;
  • 重新请求获取 JWT 的过程中会有短暂 JWT 不可用的情况(可以通过在客户端设置定时器,当 accessJWT 快过期的时候,提前去通过 refreshJWT 获取新的 accessJWT);
  • 存在安全问题,只要拿到了未过期的 refreshJWT 就一直可以获取到 accessJWT。不过,由于 refreshJWT 只用来获取 accessJWT,不容易被泄露。

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

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

相关文章

面试stm32基础知识

1.ISP 第一步进入bootloader模式:先置BOOT0为高,BOOT1为低,再复位单片机进入bootloader模式,之后通过上位机下载程序; 第二步配置启动代码的地方:代码下载完毕后,置BOOT0为低,BOOT1…

lambda捕获列表

lambda是C11新特性之一,优点是: 1.可以直接匿名定义目标函数或函数对象,不需要额外写一个函数 2.lambda是一个匿名的内联函数 捕获列表 总结:【】为值捕获,只读 【&】为引用捕获,可读可写

Day104:漏洞发现-漏扫项目篇武装BURP浏览器插件信息收集分析辅助遥遥领先

目录 插件类-武装BurpSuite-漏洞检测&分析辅助 1、如何加载插件: 2、漏洞检测类: Fiora TsojanScan RouteVulScan APIKit 3、分析辅助类: 插件类-武装谷歌浏览器-信息收集&情报辅助 HackBar Heimdallr Wappalyzer FindS…

每日一题:买卖股票的最佳时机IV

给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。 注意:你不能同时参与多…

HTML合集

前言: 之前所有HTNL的文章都是单独写出,本篇文章,将他们作为集合的形式进行整理。 链接(点击查看): HTML简介 网页的基本结构 HTML基础语法 HTML元素之间的关系 HTML的常用标签 HTML常用标签的补充 …

Linux进阶篇:性能监控工具:socket 统计信息

Linux性能监控工具:socket 统计信息 1 ss命令介绍 ss 是 Socket Statistics 的缩写。ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似。但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比 netsta…

ArtCoder——通过风格转换生成多元化艺术风格二维码

简介 ArtCoder能够从原始图像(内容)、目标图像(风格)以及想要嵌入的信息中,生成具有艺术风格的二维码。这一过程类似于通常的图像风格转换,但特别针对二维码的特点进行了优化和调整。 通过这种方法&#…

轮转数组(力扣)

189. 轮转数组 - 力扣(LeetCode) 189. 轮转数组 题解 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 样例输入 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮…

图像生成模型浅析(Stable Diffusion、DALL-E、Imagen)

目录 前言1. 速览图像生成模型1.1 VAE1.2 Flow-based Model1.3 Diffusion Model1.4 GAN1.5 对比速览 2. Diffusion Model3. Stable Diffusion3.1 Text Encoder3.2 Decoder3.3 Generation Model 总结参考 前言 简单学习下图像生成模型的相关知识🤗 以下内容来自于李宏…

Spring框架中的11种设计模式(设计模式之美)

适配器模式 例如Controller的三种实现方式: Controller注解实现Controller接口 xml配置文件:配置DemoController与URL的对应关系实现Servlet接口 xml配置文件:配置DemoController类与URL的对应关系 不同的Controller如何调用呢?可以通过适配器模式。…

链表传一级指针以及leetcode做题有感

上个文章说要传二级指针,经过一段时间的学习之后才知道可以传一级指针: 之所以要传二级指针,是要改变一级指针的值,也就是把头节点的指针改变,如图: 从左边到右边,头指针 一级指针plist 的值发…

JS stacktrace 堆内存耗尽

javascript 堆内存耗尽 问题 是 npm run dev 的时候 报错 如下 <--- JS stacktrace --->FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory在大多数情况下&#xff0c;默认情况下 Node.js 的堆内存…

【Cocoapods】最新安装指定版本Cocoapods记录

安装ruby https://blog.csdn.net/mydo/article/details/126918391 # 指定版本安装 sudo gem install -n /usr/local/bin cocoapods -v 1.9.3 接下来一定要注意&#xff01;注意&#xff01;注意&#xff01; 如果你的 Mac系统是 10.11 之前&#xff0c;输入&#xff1a; sud…

深入理解Transformer技术原理 | 得物技术

谷歌在2017年发布Transformer架构的论文时&#xff0c;论文的标题是&#xff1a;Attention Is All You Need。重点说明了这个架构是基于注意力机制的。 一、什么是注意力机制 在深入了解Transformer的架构原理之前&#xff0c;我们首先要了解下&#xff0c;什么是注意力机制。…

vulfocus靶场redis 未授权访问漏洞之CNVD-2015-07557

目标系统的权限不够redis用户无法写计划任务和公钥&#xff0c;而且也没有开放ssh端口。 主从复制getshell&#xff0c;写入恶意的so文件达到执行系统命令的目的。 github上有一键可以利用的脚本 https://github.com/n0b0dyCN/redis-rogue-server.git 利用条件&#xff1a;需…

二维数组在内存中的行存储和列存储

目录 例题&#xff1a; 0. BaseAddress 1. 行存储方式&#xff08;Row-major order&#xff09; 2. 列存储方式&#xff08;Column-major order&#xff09; 3. 解方程找到 i 和 j 行存储和列存储方式的区别 行存储方式&#xff08;Row-major order&#xff09;: 列存储…

逆向案例二十八——红某点集登录接口逆向序

网址&#xff1a;aHR0cHM6Ly93d3cuaHJkanl1bi5jb20vIy9sb2dpbj9yZWRpcmVjdD0lMkZyZWFsVGltZUxpdmluZw 登录接口&#xff0c;发现两个参数加密&#xff0c;分别是pwd和sig,t很明显是时间戳。 观察pwd,发现很像md5加密&#xff0c;我输入的密码是123456&#xff0c;在在线加密网…

Oracle SQL - HAVING和分析函数的执行顺序

分析函数是基于最终的结果集进行开窗的&#xff0c;所以HAVING比分析函数先执行 ↓ 没有HAVING时&#xff0c;MAX(col3) over()是A2 SQL> WITH subq_a AS2 (SELECT A col1, A1 col2, 10 col33 FROM dual4 UNION ALL5 SELECT A col1, A1 col2, -5 col36 F…

day81 session会话 文件上传

知识点&#xff1a; session 文件上传 一 session 1&#xff09;session&#xff1a;会话 在服务器端存储信息 指客户与服务器的会话 当用户通过浏览器访问服务器的某个页面时&#xff0c;在服务器开辟一个内存空间session 每个session 有唯一的id 2&#xff09;session过期 …

C——文件操作

1.前言 为什么要使用文件呢&#xff1f; 文件是储存在电脑的磁盘中的&#xff0c;如果没有文件&#xff0c;我们写程序的数据就会存储在电脑的内存中&#xff0c;程序退出&#xff0c;操作系统就会收回内存&#xff0c;数据就丢失了等再次运行程序的时候&#xff0c;是看不到…