双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 在 IT 安全和认证中的应用 token 系统作为一种重要的安全设计模式,在现代 Web 开发中广泛应用。该系统通过引入两种不同类型的令牌——访问令牌(Access Token)和刷新令牌(Refresh Token),实现了更细粒度的安全控制。 #### 访问令牌 (Access Token) 访问令牌主要用于验证用户的请求合法性,通常具有较短的有效期。当客户端向服务器发送请求时,会携带此令牌作为身份证明。为了防止恶意攻击者利用截获的令牌进行非法操作,其生命周期被有意缩短至几分钟甚至几秒钟内失效[^1]。 ```python import jwt from datetime import datetime, timedelta def create_access_token(user_id): payload = { 'sub': user_id, 'exp': datetime.utcnow() + timedelta(minutes=15), 'type': 'access' } access_token = jwt.encode(payload, 'secret_key', algorithm='HS256') return access_token ``` #### 刷新令牌 (Refresh Token) 相比之下,刷新令牌则拥有较长的生命期,负责在原有访问令牌过期后重新获取新的有效凭证而不必每次都让用户再次登录输入密码等信息。这种方式不仅提升了用户体验还增强了安全性。 ```python def create_refresh_token(user_id): payload = { 'sub': user_id, 'exp': datetime.utcnow() + timedelta(days=7), # 更长有效期 'type': 'refresh' } refresh_token = jwt.encode(payload, 'secret_key', algorithm='HS256') return refresh_token ``` #### 实现细节 实际部署过程中,可以采用 JSON Web Tokens (JWT) 来编码上述两类令牌的内容,并借助特定库如 `jwt-go` 或 Python 的 PyJWT 库完成具体功能实现[^2][^3]。对于涉及敏感数据的操作,则建议使用更强加密标准比如 ECDSA 进行签名保护[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值