双token!!!

1、双token场景


超级管理员下线,用户角色修改的时候,避免单token无感知,及时刷新token;双token系统通常用于提高安全性和分离不同级别的权限。里面主要有两个token
业务token(Access Token):这是用户用来直接访问资源的token,他的特点是有效期比较短,一旦过期,用户需要重新认证来获取token,这样做的好处是即使我们业务token泄露了,攻击者进行不当操作的时间有限。
刷新token(Refresh Token ):这是当业务token过期的时候重新获取业务token的,他的特点是有效期一般比较长(刷新token一般不会发送给客户端,而是保存在服务器端?),当需要刷新业务token的时候,服务端通过提供刷新token去请求新的业务token。可以让用户在无感知的情况下获取新的业务token。当我们获取新的业务token的时候,其实刷新token也延长了寿命,相当于刷新token变为永久的了

2、为什么要用双token

  • 安全性:通过短期的access token和长期的refresh token,可以在不影响用户体验的情况下,减少安全风险。即使access token被盗,由于其有效期短,损害可以被控制在一定范围内。

  • 权限管理:双token系统可以更好地管理用户的权限。例如,在开放平台中,第三方应用可以通过refresh token来获取access token,而不需要知道用户的用户名和密码,这样既保证了用户信息的安全,又赋予了第三方应用一定的权限。

  • 用户体验:双token系统可以在不影响用户体验的前提下,实现后台的安全管理和策略调整。用户不需要频繁登录,同时也能保证系统的安全性。

  • 灵活性:在需要进行更细粒度的权限控制或者策略调整时,双token系统提供了更多的灵活性。例如,可以在不改变refresh token的情况下,调整access token的有效期或权限范围。

总之,双token系统是一种常见的安全设计模式,通过分离短期和长期凭证,以及用户直接使用的token和用于刷新的token,来提高系统的安全性和灵活性。这种设计特别适用于需要与第三方应用共享权限而又不泄露用户敏感信息的场景。

3、双token的核心点

双token系统通常用于提高安全性和分离不同级别的权限。在这种系统中,通常会有两个token:

  • Access Token:这是用户直接使用来访问资源的token。它的有效期较短,一旦过期,用户需要重新认证来获取新的access token。这样做的好处是即使access token被泄露,由于其有效期短,攻击者利用它进行不当操作的时间窗口有限。

  • Refresh Token:Refresh token是用来在access token过期后重新获取新的access token的。它的有效期通常较长,甚至可以说是永久的。

4、双token实现步骤


用户登录成功后,后端使用hutool的JWTUtil工具,根据用户id、角色信息、权限生成业务token和刷新token,前端获取响应后并将其存到pinia中
每次发送请求时,前端请求拦截器都会从pinia中获取业务token
如果响应结果提示token过期,则调用后端的刷新token接口,获取新的业务token和刷新token(需要前端传刷新token),并更新pinia中的值


双token中分别存的什么?


业务token:30分钟,刷新token:半年
业务token:用户id、用户名(mybatis拦截器)、roles、permissions(权限)、过期时间(exp)
刷新token:用户id、过期时间(exp)

如何实现双token

### Token机制的实现原理 Token机制通常用于增强系统的安全性,防止非法用户的访问以及提高用户体验。其核心思想是通过两种不同类型的Token——**Access Token** 和 **Refresh Token** 来管理用户会话。 #### Access Token 的作用 Access Token 是一种短期有效的令牌,主要用于客户端向服务端发起请求时的身份验证。它的生命周期较短(例如几分钟到几小时),目的是减少因长时间暴露而带来的安全隐患[^3]。当客户端需要调用受保护资源时,它会在HTTP头中携带此Token: ```http Authorization: Bearer {ACCESS_TOKEN} ``` 一旦Access Token过期,客户端无法继续使用该Token访问受限资源,此时就需要借助 Refresh Token 获取新的Access Token。 #### Refresh Token 的作用 Refresh Token 则是一个长期有效的令牌,主要负责在Access Token失效后重新获取一个新的Access Token。为了保障安全,Refresh Token 不应直接存储于前端浏览器环境,而是存放在更安全的地方,比如HttpOnly Cookie 或 后台服务器上[^4]。以下是刷新流程的一个典型例子: 1. 客户端检测当前使用的Access Token已过期; 2. 使用存储的Refresh Token向认证服务器发送请求以换取新Token; 3. 认证服务器验证Refresh Token的有效性,并返回新的Access Token及可能更新后的Refresh Token。 需要注意的是,尽管Refresh Token有效期较长,但它仍然存在一定的风险。因此实际应用中可以设置一些额外的安全策略,如IP绑定、设备指纹校验等手段进一步加固系统防护能力[^5]。 #### 示例代码展示如何处理Token逻辑 下面给出一段基于Spring Security框架下利用JWT实现Token功能的部分伪代码片段: ```java // 验证 refresh token 并生成新的 access token @PostMapping("/refresh-token") public ResponseEntity<?> refreshToken(@RequestBody Map<String, String> request) { String refreshToken = request.get("refresh_token"); if (jwtUtil.validateToken(refreshToken)) { // 自定义工具类检查token有效性 Authentication authentication = jwtUtil.getAuthenticationFromToken(refreshToken); CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal(); String newAccessToken = jwtUtil.generateAccessToken(userDetails); return ResponseEntity.ok(new JwtResponse(newAccessToken)); } throw new InvalidTokenException("Invalid refresh token!"); } // JWT 工具类中的部分方法示意 @Component public class JwtUtil { public boolean validateToken(String token){ // 解析并验证token合法性... } public Authentication getAuthenticationFromToken(String token){ // 提取token内的用户信息构建authentication对象... } public String generateAccessToken(CustomUserDetails userDetails){ // 创建新的access token ... } } ``` 上述代码展示了如何接收来自客户端的Refresh Token 请求,经过一系列操作之后再反馈给对方最新可用的Access Token。 ### 总结 综上所述,Token机制不仅能够满足快速频繁地进行业务交互的需求,同时也兼顾到了网络通信过程中的安全保障问题。合理运用这两种Token可以帮助开发者设计更加健壮可靠的API接口体系结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值