Token总结

转载自:https://mp.weixin.qq.com/s/DkwfpZibKdllfm0lpxukWg

 

Token 能解决哪些问题呢?有如下几点:

  • Token 完全由应用管理,所以它可以避开同源策略。

  • Token 可以避免 CSRF 攻击(http://dwz.cn/7joLzx)。

  • Token 可以是无状态的,可以在多个服务间共享。

 

解决token失效问题

  •     方案一:在服务器端保存 Token 状态,用户每次操作都会自动刷新(推迟) Token 的过期时间(Session也是这样干的

        同时通过把 Token 的过期时保存在缓存或者内存中,来提升效率

  •    方案二: 使用 Refresh Token,它可以避免频繁的读写操作。 一旦 Token 过期,就反馈给前端,前端使用 Refresh Token 申请一个全新 Token 继续使用

 

有状态token: 在服务端需要保存并记录相关属性

无状态token: 把所有状态信息都附加在 Token上, 服务器就可以不保存。但是服务端仍然需要认证 Token 有效。

    只要服务端能确认是自己签发的 Token,而且其信息未被改动过,那就可以认为 Token 有效——用“签名”作保证

    签名: 一方签发,另一方验证,用非对称加密算法

        改进: 签发和验证都是同一方,用 对称加密算法就行

            改进: 对称加密算法除了加密,还带有还原加密内容的功能,而token验证不需要解密,使用摘要(散列)算法                      HMAC更好。

            JWT 已经定义了详细的规范,不需要自己实现

   

无状态token: 服务端虽然不保存有效的 Token 了,却需要保存未到期却已注销的 Token。

解决方法:

    1. 在前端可控的情况下, 可以协商:前端一旦注销成功,就丢掉本地保存(比如保存在内存、Local Storage 等)的 Token     和 Refresh Token。

    2. 如果前端不可控的情况, 需要尽量缩短 Token 的有效期,而且必须在用户主动注销的情况下让 Refresh Token 无效

 

在使用无状态 Token 的时候,有两点需要注意:

  • Refresh Token 有效时间较长,所以它应该在服务器端有状态,以增强安全性,确保用户注销时可控。

  • 应该考虑使用二次认证来增强敏感操作的安全性。


分离认证服务

    认证服务器和业务服务器采用相同的密钥和算法来来认证token( 建立在认证服务器信任业务服务器的前提下 )

 

不受信的业务服务器

   认证服务器使用密钥 1 签发,业务服务器使用密钥 2 验证---- 非对称加密签名

    认证服务器自己使用私钥对 Token 签名,公开公钥。信任这个认证服务器的业务服务器保存公钥,用于验证签名。

    JWT 可使用 RSA(一种非对称加密算法)签名。

    存在问题: 多个业务服务器之间使用相同的 Token 对用户来说是不安全的。

    解决方案: 在认证服务器产生 Token 的时候,把使用该 Token 的业务服务器的信息记录在 Token 中。 另一个业务服务器         可以发现它不是自己应该验证的 Token

    存在问题: 用户的不信任问题,用户无法确定自己要授权的应用是否安全

    解决方案: 认证服器不公开公钥,要求业务服务先申请注册并通过审核, 只有通过审核的业务服务器才能得到认证服务为它         创建的,仅供它使用的公钥。(比如QQ互联)

    如果用户还是不够信任,认证服务甚至可以问,某某某业务服务需要请求  A、B、C 三项个人数据,其中 A 是必须的,不然      它不工作,是否允许授权?如果你授权,我就把你授权的几项数据加密放在 Token 中……(就是token中的scope字段)

废话了这么多,有没有似曾相识……对了,这类似开放式 API 的认证过程。开式 API 多采用 OAuth 认证,而关于 OAuth 的探讨资源非常丰富,这里就不深究了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security可以通过校验token来实现权限的校验。在Spring Security中,可以通过自定义实现UserDetailsService接口的类来加载用户信息,并在loadUserByUsername方法中进行token的验证。具体步骤如下: 1. 创建一个实现UserDetailsService接口的类,在该类中重写loadUserByUsername方法,方法参数为token。 2. 在loadUserByUsername方法中,可以根据token从数据库或其他存储中获取用户信息,并创建一个UserDetails对象。可以使用token来验证用户的身份并获取相应的用户权限。 3. 在loadUserByUsername方法中,可以通过调用UserDetails对象的相关方法来设置用户的权限和其他相关信息。 4. 将创建好的UserDetails对象返回。 通过以上步骤,Spring Security就可以通过校验token来实现权限的校验。需要注意的是,具体的token校验逻辑和存储方式可以根据项目需求进行自定义实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringSecurity](https://download.csdn.net/download/weixin_42561846/12879985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [spring security多种校验方式及自实现token总结](https://blog.csdn.net/earthsomeday/article/details/90314067)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值