1. title: 关于TokenCookie做权限校验的区别及Token自动续期方案
  2. categories: 后端
  3. tags:
  4. - .NET

Token和Cookie的区别

首先,要知道一些基本概念:http是无状态的,session是存储在服务端的数据,每次用户在发起http请求到服务器时会在cookie中带上一个session id,服务端通过这个session id来判断用户是哪一个,cookie就是在浏览器端存储数据的一种方式,可以在服务器端通过在header中通过添加set-cookie来通知浏览器端添加cookie

Token和Cookie的对比

  • Token可以在http请求的任何地方加上,比如header、body、url,而cookie存储的地方是固定的
  • Token可以在需要验证的接口才加上token,而cookie则会在每次请求都会自动加上
  • Cookie会存在跨域问题,如果Cookie是在aaa.example上创建的,那么在bbb.example下也是不允许访问的,而Token不存在这个问题,只要在请求内带上token就可
  • Token天生就可以避免CSRF伪造站点攻击(毕竟发起请求是否携带Token全靠自己写逻辑),而Cookie默认是自动携带的,因此在不注意的情况下很容易遭受攻击

在 CSRF 攻击中,恶意网站利用浏览器会自动将身份验证 cookie 附加到对该域的请求的事实,并诱使您的浏览器执行请求

关于这方面,Cookie也是有办法解决CSRF攻击的,可以阅读这篇文章了解:https://www.invicti.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/

综上所述,使用Token明显灵活性更强,不过使用Token的话还存在一个问题就是Token如何做自动续期,

Token续期方案

方案一:axios拦截器

本方法的思路是在axios的响应拦截器内判断服务端返回的错误结果,如果是token过期(比如http code是401或多少),那么调用刷新token的函数,在刷新token成功后再次发起请求,伪代码大概是这样的:

  1. async function refreshToken(){
  2. const data=await axios.get('http://xxx.xxx.xxx/api/refreshToken?oldToken='+oldToken);
  3. localStorage.AddItem("Token","Bearer "+data.newToken);
  4. }
  5. request.interceptors.response.use(resp => {
  6. return resp;
  7. },async err=>{
  8. if(err.reponse.status==401)
  9. {
  10. await refreshToken();
  11. err.config.headers.Authorization = localStorage.GetItem("Token");
  12. return request(err.config);// 发起新请求 请求的参数还是原来的url和数据
  13. }
  14. });

最好加个RefreshToken,普通的Token过期时间短,RefreshToken过期时间长,用RefreshToken获取新的Token,减少Token暴露的风险

方案二:定时器

  1. async function refreshToken(){
  2. const data=await axios.get('http://xxx.xxx.xxx/api/refreshToken?oldToken='+oldToken);
  3. localStorage.RemoveItem("Token");
  4. localStorage.AddItem("Token","Bearer "+data.newToken);
  5. }
  6. this.setInterval(refreshToken,1000*60*25);// 25分钟调用一次

把上面的内容放在一个js文件内,在App.vue中引入这个js文件,如果token是30分钟过期,可以25分钟(不能比30分钟长)调用一次刷新函数去服务端获取新的token替换掉老的token

关于Token和Cookie做权限校验的区别及Token自动续期方案的更多相关文章

  1. vuex存取token,http简单封装、模拟登入权限校验操作、路由懒加载的几种方式、vue单页设置title

    1.config index.js下面的跨域代理设置: proxyTable: { '/api': { target: 'http://xxxx', //要访问的后端接口 changeOrigin: ...

  2. IdentityServer4实现Token认证登录以及权限控制

    相关知识点 不再对IdentityServer4做相关介绍,博客园上已经有人出了相关的系列文章,不了解的可以看一下: 蟋蟀大神的:小菜学习编程-IdentityServer4 晓晨Master:Ide ...

  3. SpringCloud(8)---zuul权限校验、接口限流

    zuul权限校验.接口限流 一.权限校验搭建 正常项目开发时,权限校验可以考虑JWT和springSecurity结合进行权限校验,这个后期会总结,这里做个基于ZuulFilter过滤器进行一个简单的 ...

  4. Token ,Cookie和Session的区别

    在做接口测试时,经常会碰到请求参数为token的类型,但是可能大部分测试人员对token,cookie,session的区别还是一知半解. Cookie cookie 是一个非常具体的东西,指的就是浏 ...

  5. Token认证登录以及权限控制

    IdentityServer4实现Token认证登录以及权限控制   相关知识点 不再对IdentityServer4做相关介绍,博客园上已经有人出了相关的系列文章,不了解的可以看一下: 蟋蟀大神的: ...

  6. fastDFS shiro权限校验 redis FreeMark页面静态化

    FastDFS是一个轻量级分布式文件系统,   使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传.下载等服务   FastDFS服务端有两个角色:跟踪器(tracker)和存储节点( ...

  7. Token ,Cookie和Session的区别--学习笔记

    http://blog.csdn.net/tobetheender/article/details/52485948 Token token的意思是“令牌”,是用户身份的验证方式,最简单的token组 ...

  8. Token ,Cookie、Session傻傻分不清楚?

    作者 | 王菜鸟1993 来源 | cnblogs.com/JamesWang1993/p/8593494.html 在做接口测试时,经常会碰到请求参数为token的类型,但是可能大部分测试人员对to ...

  9. Token 、Cookie和Session的区别

    本文转至http://blog.csdn.net/tobetheender/article/details/52485948 https://blog.csdn.net/axin66ok/articl ...

  10. drf 权限校验设置与源码分析

    权限校验 权限校验和认证校验必须同时使用,并且权限校验是排在认证校验之后的,这在源码中可以查找到其执行顺序. 权限校验也很重要,认证校验可以确保一个用户登录之后才能对接口做操作,而权限校验可以依据这个 ...

随机推荐

  1. PHP redis有序集合实现分页

    <?php //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //设置 redis 字符 ...

  2. JAVA系列之JVM内存调优

    一.前提 JVM性能调优牵扯到各方面的取舍与平衡,往往是牵一发而动全身,需要全盘考虑各方面的影响.在优化时候,切勿凭感觉或经验主义进行调整,而是需要通过系统运行的客观数据指标,不断找到最优解.同时,在 ...

  3. Vue中常用的几种传值方式

    Vue中常用的几种传值方式 1. 父传子 父传子的实现方式就是通过props属性,子组件通过props属性接收从父组件传过来的值,而父组件传值的时候使用 v-bind 将子组件中预留的变量名绑定为da ...

  4. $_SERVER["REQUEST_URI"],在 PHP 众多预定义服务器变量中,$_SERVER["REQUEST_URI"] 算是经常用到的,但是这个变量只有 apache 才支持

    例如访问:http://localhost/index.php?app=lunbo获取到的$_SERVER["REQUEST_URI"]为"/index.php?app= ...

  5. DQL语句排序与分组

    DQL语句排序与分组 一.DQL-排序 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列.分内部排序和外部排序,若整个 ...

  6. Flutter 构建windows应用

    Flutter Windows 桌面端支持进入稳定版 | Flutter 中文文档 | Flutter 中文开发者网站 从2.10之后的版本,flutter已经正式支持构建windows应用.不过距离 ...

  7. 扫雷(哈希+bfs)

    扫雷 题目描述: 小明最近迷上了一款名为<扫雷>的游戏. 其中有一个关卡的任务如下: 在一个二维平面上放置着 n 个炸雷,第 i 个炸雷 (x\(_i\),y\(_i\),r\(_i\)) ...

  8. python 基本使用 异常判断

    简单常用 isinstance 判断一个对象是否是一个已知的类型 arg=123 isinstance(arg, int) #输出True isinstance(arg, str) #输出False ...

  9. Python中Print方法

    1 number1 = int(input("请输入第一个数:")) 2 number2 = int(input("请输入第二个数:")) 3 4 # 方法一: ...

  10. Kubernetes安装GitLab

    个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github‍:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying Kubernetes安装GitLab Step 1 ...