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.mfbz.cn/a/568376.html

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

相关文章

自制Apache-Doris 2.0.4镜像Docker部署一Fe和一Be集群及遇到的问题解决

自制Apache-Doris 2.0.4镜像Docker部署一Fe和一Be集群及遇到的问题解决 文章目录 1.前言2.doris是什么?2.1简介2.2介绍2.3使用场景2.4架构 3.官网4.构建部署4.1 构建环境4.2 doris2.0.4的fe和be镜像构建4.2.1 fe2.0.4镜像构建脚本4.2.2 be2.0.4镜像构建4.2.3 启动脚…

Linux 操作系统的引导过程

Linux系统开机引导过程: 开机自检 检测硬件设备,找到能够引导系统的设备,比如硬盘MBR引导 运行MBR扇区里的主引导程序GRUB启动GRUB菜单 系统读取GRUB配置文件(/boot/grub2/grub.cfg)获取内核的设置和…

centos7+mysql57安装以及初始化

1、下载安装yum官方mysql源: http://repo.mysql.com/ ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/061472a86e9e4548b76d4603d4614568.png rpm -ivh mysql57-community-release-el7.rpm2、yum安装mysql服务 yum install -y mysql-community-server…

深兰科技入选2024全国“人工智能+”行动创新案例TOP100

近日,中科院《互联网周刊》联合eNET研究院、德本咨询、中国社会科学院信息化研究中心共同发布了《2024全国“人工智能”行动创新案例TOP100》榜单。经评委会层层遴选,深兰科技专为洛阳市打造的“工业智能化洛阳中心”项目成功入围该榜单。一同入围的还包…

Threejs 相机定位聚焦

网上大部分讲功能的时候,讲的太复杂了,或者就是讲不清,今天我就给大家简单简洁的描述下这个聚焦定位咋做如下: 扫码关注下: 聚焦定位只要就是设置相机的位置,和更新相机的朝向,就如一个人站在这…

2024三掌柜赠书活动第二十四期:containerd原理剖析与实战

目录 前言 Containerd的架构 Containerd的工作流程 Containerd的实战演示 关于《containerd原理剖析与实战》 编辑推荐 内容简介 作者简介 图书目录 书中前言/序言 《containerd原理剖析与实战》全书速览 结束语 前言 作为开发者,对于编程语言并不陌生&…

Atlas Vector Search:借助语义搜索和 AI 针对任何类型的数据构建智能应用

Atlas Vector Search已正式上线! Vector Search(向量搜索)现在支持生产工作负载,开发者可以继续构建由语义搜索和生成式人工智能驱动的智能应用,同时通过 Search Node(搜索节点)优化资源消耗并…

Android—— log的记忆

一、关键log 1.Java的 backtrace(堆栈log) 上述是一个空指针异常,问题出现在sgtc.settings,所以属于客户UI问题。 2.WindowManager(管理屏幕上的窗口和视图层次结构) 3.ActivityManager(管理应用程序生命周期和任务栈) 4.wifi操作 (1) 连接wifi&#…

2024深圳杯数学建模挑战赛C题:编译器版本的识别问题思路代码成品论文分析

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 问题重述 深圳杯数学建模挑战赛2024C题:编译器版本的识别问题 作为一种重要的工具,电子…

【后端】python2和python3的安装与配置

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、python是什么二、python环境的安装与配置Python 2的安装与配置Python 3的安装与配置注意事项 三、总结 前言 随着开发语言及人工智能工具的普及&#xff0…

信息打点--公众号服务

微信公众号 获取微信公众号的途径https://weixin.sogou.com/ 微信公众号没有第三方服务 Github监控 人员&域名&邮箱 eg:xxx.cn password in:file https://gitee.com/ https://github.com/ https://www.huzhan.com/ 资源搜索 in:name test 仓库标题搜索含有…

Linux--内核移植(二)移植流程及驱动修改

本文来总结一下如何将 NXP 官方提供的 Linux 内核移植到正点原子的 I.MX6U-ALPHA 开发板上。 一、官方开发板内核测试 NXP 提供的 Linux 源码肯定是可以在自己的 I.MX6ULL EVK 开发板上运行下去的,所以我们肯定是以 I.MX6ULL EVK 开发板为参考&#xff0…

DFS与回溯专题:路径总和问题

DFS与回溯专题:路径总和问题 一、路径总和 题目链接: 112.路径总和 题目描述 代码思路 对二叉树进行dfs搜索,递归计算每条路径的节点值之和,当某个节点的左右子节点都为空时,说明已经搜索完成某一条路径&#xff0…

中北大学软件学院操作系统实验二进程调度算法

实验时间 2024年 4 月13日14时至16时 学时数 2 1.实验名称 实验二进程调度算法 2.实验目的 (1)加深对进程的概念及进程调度算法的理解; (2)在了解和掌握进程调度算法的基础上,编制进程调度算法通用程序,将调试结果显示在计算机屏幕上&am…

Android Perfetto 监控应用启动耗时

Perfetto 是一个 Google 开发的用于安卓系统性能监控和调试的工具,它旨在提供实时数据收集和可视化功能,帮助我们分析和优化应用程序的性能表现。Perfetto 可以捕获系统事件、CPU、内存、网络、GPU 等性能指标数据,并将其记录为轻量级的 Trac…

BBS前后端混合项目--03

展示 static/bootstrp # bootstrap.min.css /*!* Bootstrap v3.4.1 (https://getbootstrap.com/)* Copyright 2011-2019 Twitter, Inc.* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)*//*! normalize.css v3.0.3 | MIT License | github.com/n…

C语言学习/复习29--内存操作函数memcpy/memmove/memset/memcmp

一、内存操作函数 1.memcpy()函数 注意事项1:复制的数目以字节为单位 注意事项2:一定要保证有足够空间复制 模拟实现1 拷贝字符案例:由于拷贝时函数本事就以字节为单位拷贝所以该例子也可用于其他类型数据的拷贝。 模拟实现2 将自身的…

diffusion model 简单demo

参考自: Probabilistic Diffusion Model概率扩散模型理论与完整PyTorch代码详细解读 diffusion 简单demo 扩散模型之DDPM Diffusion model 原理剖析 张振虎-扩散概率模型 生成扩散模型漫谈(一):DDPM 拆楼 建楼 核心公式和逻辑 …

自适应STFT及其在地震时间行程自动拾取中的应用【附MATLAB代码】

文章来源:微信公众号:EW Frontie 摘要 在本文中,首先,我们提出的方法来产生高分辨率的短时傅里叶变换,通过计算最佳瞬时窗口长度。其次,利用生成的时频图提取瞬时走时属性,实现地震同相轴走时的…

vmstat命令详解

一、参数信息 vmstat 命令是用于报告虚拟内存统计信息的工具,常用于 Unix/Linux 系统上。它可以提供关于系统资源使用情况的详细信息,包括 CPU、内存、虚拟内存、磁盘、系统调用等方面的统计数据。以下是常见的 vmstat 命令参数的详解: vms…
最新文章