搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
繁依Fanyi0
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Claude 3是什么?与GPT-4相比有什么优势?
2
前端开发基础(3)—JavaScript_什么是javascript,它在前端开发中的角色是什么?
3
USB驱动之Android usb鼠标驱动_安卓鼠标驱动
4
鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Column)
5
微信小程序如何跳转视频号直播间_小程序能跳转视频号吗
6
在html中列表是块元素还是,HTML基础知识4-列表及表单的写法、块级元素和内联(行内)元素的区别...
7
Spring 常用依赖以及使用demo_org.springframework.stereotype.service
8
Nodejs 应用编译构建提速建议 | 京东云技术团队_node turbo
9
将Linux curl命令转换为windows平台的Python代码
10
VIM配置攻略(最强干货!!!!)_spacevim作者
当前位置:
article
> 正文
Spring-Boot-13-Token_springboot token
作者:繁依Fanyi0 | 2024-04-05 21:39:43
赞
踩
springboot token
Spring Token
Token是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回Token给前端。前端可以在每次请求的时候带上Token证明自己的合法地位。
1. 为什么要使用Token?
Token完全由应用管理,所以可以避开同源策略。
Token可以避免CSRF攻击
Token可以是无状态的,可以在多个服务间共享(也就是前端请求的时候带上Token来证明自己的合法身份)
2. Token的时效性讨论
根本问题:如何让用户在操作过程中感觉不到token失效的问题
2.1. 解决方案一
服务器端保存Token状态,每一次操作都会刷新token的过期时间(Session的实现策略)
问题:前后端分离的部分会导致请求量过大
如果持久化:更大的代价
我们为了提升效率会将Token的过期时间保存在环境或者内存中。
2.2. 解决方案二
使用Refresh Token的策略,避免频繁的读写
一旦Token过期,前端使用一个Refresh Token申请一个新的Token,我们只需要对于新的Token进行有效性检查即可
2.3. 时序图表示法
3. 什么是无状态Token
如果我们把所有状态信息都附加在Token上,服务器就可以不保存。
签名有效性的检验:
一方签发,另一方检验:使用非对称加密算法
一方签发,一方检验:(同一方):使用对称加密算法
对称加密算法要远远快于非对称加密算法
3.1. 对称加密算法
加密
还原加密内容
不需要解密,摘要(散列算法会很快)么指定密码的散列算法,HMAC
3.2. 前端不同情况的不同操作
在前端可控的情况下(比如前端和服务端在同一个项目组内),可以协商:前端一但注销成功,就丢掉本地保存(比如保存在内存、LocalStorage 等)的 Token 和 Refresh Token。基于这样的约定,服务器就可以假设收到的 Token 一定是没注销的(因为注销之后前端就不会再使用了)。
如果前端不可控的情况,仍然可以进行上面的假设,但是这种情况下,需要尽量缩短 Token 的有效期,而且必须在用户主动注销的情况下让 Refresh Token 无效。这个操作存在一定的安全漏洞,因为用户会认为已经注销了,实际上在较短的一段时间内并没有注销。如果应用设计中,这点漏洞并不会造成什么损失,那采用这种策略就是可行的。
3.3. 注意点
Refresh Token 有效时间较长,所以它应该在服务器端有状态,以增强安全性,确保用户注销时可控
应该考虑使用二次认证来增强敏感操作的安全性
3.4. 分离认证服务
当 Token 无状态之后,单点登录就变得容易了。前端拿到一个有效的 Token,它就可以在任何同一体系的服务上认证通过——只要它们使用同样的密钥和算法来认证 Token 的有效性。
可见,虽然认证和业务分离了,实际即并没产生多大的差异。当然,这是建立在认证服务器信任业务服务器的前提下,因为认证服务器产生 Token 的密钥和业务服务器认证 Token 的密钥和算法相同。换句话说,业务服务器同样可以创建有效的 Token。
3.5. 不受信的业务服务器
遇到不受信的业务服务器时,很容易想到的办法是使用不同的密钥。认证服务器使用密钥1签发,业务服务器使用密钥2验证——这是典型非对称加密签名的应用场景。
认证服务器自己使用私钥对 Token 签名,公开公钥。信任这个认证服务器的业务服务器保存公钥,用于验证签名。幸好,JWT 不仅可以使用 HMAC 签名,也可以使用 RSA(一种非对称加密算法)签名。
不过,当业务服务器已经不受信任的时候,多个业务服务器之间使用相同的 Token 对用户来说是不安全的。因为任何一个服务器拿到 Token 都可以仿冒用户去另一个服务器处理业务……悲剧随时可能发生。
为了防止这种情况发生,就需要在认证服务器产生 Token 的时候,把使用该 Token 的业务服务器的信息记录在 Token 中,这样当另一个业务服务器拿到这个 Token 的时候,发现它并不是自己应该验证的 Token,就可以直接拒绝。
现在,认证服务器不信任业务服务器,业务服务器相互也不信任,但前端是信任这些服务器的——如果前端不信任,就不会拿 Token 去请求验证。那么为什么会信任?可能是因为这些是同一家公司或者同一个项目中提供的若干服务构成的服务体系。
但是,前端信任不代表用户信任。如果 Token 不没有携带用户隐私(比如姓名),那么用户不会关心信任问题。但如果 Token 含有用户隐私的时候,用户得关心信任问题了。这时候认证服务就不得不再啰嗦一些,当用户请求 Token 的时候,问上一句,你真的要授权给某某某业务服务吗?而这个"某某某",用户怎么知道它是不是真的"某某某"呢?用户当然不知道,甚至认证服务也不知道,因为公钥已经公开了,任何一个业务都可以声明自己是"某某某"。
为了得到用户的信任,认证服务就不得不帮助用户来甄别业务服务。所以,认证服器决定不公开公钥,而是要求业务服务先申请注册并通过审核。只有通过审核的业务服务器才能得到认证服务为它创建的,仅供它使用的公钥。如果该业务服务泄漏公钥带来风险,由该业务服务自行承担。现在认证服务可以清楚的告诉用户,"某某某"服务是什么了。如果用户还是不够信任,认证服务甚至可以问,某某某业务服务需要请求 A、B、C 三项个人数据,其中 A 是必须的,不然它不工作,是否允许授权?如果你授权,我就把你授权的几项数据加密放在 Token 中……
废话了这么多,有没有似曾相识……对了,这类似开放式 API 的认证过程。开发式 API 多采用 OAuth 认证,而关于 OAuth 的探讨资源非常丰富,这里就不深究了。
4. Token结合Spring的使用
我们可以选择将token放置在body或者header(推荐)中发送请求
实现上重点看参考二
5. 参考
深入理解token
SpringBoot整合token实现登录认证
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/368063
推荐阅读
article
AI赋能
微
服务
:
Spring
Boot
与
机器
学习
驱动的未来应用开发_ai
微
服务
...
AI赋能
微
服务
:
Spring
Boot
与
机器
学习
驱动的未来应用开发_ai
微
服务
ai
微
服务
...
赞
踩
article
python
爬虫教程实战_
subscribe
?
token
=
...
通过
python
爬虫就能无限白嫖clash订阅,接下来让我们用最简单的代码来进行测试。_
subscribe
?
token
=
...
赞
踩
article
Spring
Boot
整合
分布式
搜索引擎
Elastic
Search
实现 自动补全功能...
如何实现自动补全? ES一键搞定!
Spring
Boot
整合
分布式
搜索引擎
Elastic
Search
实现 自动补...
赞
踩
article
Spring
Authorization
Server
入门 (十二) 实现授权码模式
使用
前后端分离的...
今天的主题就是
使用
单独部署的
登录
页面
替换认证服务器默认的
登录
页面
(前后端分离时
使用
前端的
登录
页面
),目前在网上能搜到的很...
赞
踩
article
再见
RestTemplate
,
Spring
6.1
新特性:R...
80min
,
一部分智力题
,
一部分性格测试题。1.前期知识其实掌握的知识点已经够多了
,
我们要做的就是一次次应用和实战
,
把他...
赞
踩
article
Spring
Boot 防止
XSS
攻击 漏洞解决办法_
controller
层
的
string
类型
的
返回...
转载说明如下:作者:Qihang链接:https://www.jianshu.com/p/a7f9a4f217b4来源:...
赞
踩
article
【深度
学习
】04-
02
-自
注意力
机制多种变形-李宏毅老师
21
&
22
深度
学习
课程笔记_
计算
attent...
【深度
学习
】05-
02
-自
注意力
机制多种变形-李宏毅老师
21
&
22
深度
学习
课程笔记_
计算
attention
时有个spec...
赞
踩
article
spring
boot
3
登录
开发-
3
(1账密
登录
逻辑
实现
)_
spring
boot
3
登录
...
上文我们已经
实现
了图形验证码接口,本文我们
实现
登录
逻辑
通过用户
登录
DTO(数据传输对象)接收用户
登录
填写信息通过注解@N...
赞
踩
article
自然语言
处理
工具包
HanLP
在
Spring
Boot
中的应用_
springboot
集成
自然语言
...
概 述
HanLP
是基于 Java开发的 NLP工具包,由一系列模型与算法组成,目标是普及
自然语言
处理
在生产环境中的应用...
赞
踩
article
IDEA
Maven
打包 Spring
boot
项目_
spring
boot
maven
打包,指定...
1、点击 Project Structure2、 根据 modules 创建 jar。如图所示,选择项目,入口类等。最后...
赞
踩
article
超详细
百度
翻译
js
逆向
(
token
和
sign
)_
百度
翻译
逆向
...
1.抓包看看需要什么参数选中的数据包有点可疑请求的url和post的参数并且返回了这个内容我们用fiddler抓包看到具...
赞
踩
article
鸿鹄
工程项目
管理系统
源码
:
Spring
Boot
带来
的
快速开发与部署体验...
该系统涵盖了多个方面,包括项目管理、合同管理、预警管理、竣工管理、质量管理等,通过数据字典、编码管理、用户管理、菜单管理...
赞
踩
article
Spring
Boot
+
Vue
实现
文件
导入
导出
功能_springboot+
vue
文件
导出
...
在现代Web应用开发中,
文件
的导入
导出
是一个常见的需求。
Spring
Boot
作为后端开发的强大框架,搭配前端框架V...
赞
踩
article
基于
Spring
Boot
3 +
Spring
Security6
+
JWT
+
Redis
实现
...
基于
Spring
Boot
3
实现
Spring
Security6
+
JWT
+
Redis
实现
登录、
token
身份认证...
赞
踩
article
每日面经分享(
Spring
Boot
:
part2
DAO
层
)...
sprintboot
DAO
层
数据持久化每日面经分享(
Spring
Boot
:
part2
DAO
层
) ...
赞
踩
article
Spring
Boot
2.6集成
knife4j
,解决Failed to
start
bean
‘d...
本次学习参考 官方文档本次示例采用Spring
Boot
2.6.3完整的pom.xml文件:[详细]
-->
赞
踩
article
打造高效
电影
推荐
系统
:
Spring
Boot
与
Vue
协同过滤
算法
实践...
基于协同过滤
算法
的
电影
推荐
系统
利用网络沟通、计算机信息存储管理,有着与传统的方式所无法替代的优点。比如计算检索速度特别快...
赞
踩
article
Spring
Boot
介绍...
Spring
Boot
介绍以及原理
Spring
Boot
介绍 1、
Spring
Boot
介绍...
赞
踩
article
spring
boot
2
集成
knife4j
(
swagger2
)_
knife4j
-
openapi2
-sp...
spring
boot
2
集成
knife4j
_
knife4j
-
openapi2
-
spring
-
boot
-starterkni...
赞
踩
article
Spring
Boot
2.6 以上整合 Swagger +
Knife4j
报错_
spring
b...
这个问题主要出现在
Spring
Boot
2.6 及以后,只要是
Spring
Boot
2.6 引入的新 PathP...
赞
踩
相关标签
机器学习
微服务
spring boot
设计模式
java
python
爬虫
开发语言
分布式
搜索引擎
elasticsearch
web安全
后端
深度学习
transformer
人工智能
spring
redis
js逆向
百度翻译js逆向