title: 关于Token和Cookie做权限校验的区别及Token自动续期方案
categories: 后端
tags:
- .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成功后再次发起请求,伪代码大概是这样的:

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

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

方案二:定时器

async function refreshToken(){
const data=await axios.get('http://xxx.xxx.xxx/api/refreshToken?oldToken='+oldToken);
localStorage.RemoveItem("Token");
localStorage.AddItem("Token","Bearer "+data.newToken);
} 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. python实现多接口翻译软件

    本实验用pyqt5做了一个小软件,里面使用了市面上主流的6种翻译软件接口:谷歌.百度.有道.金山词霸.腾讯.必应,界面如图所示: 以下是程序代码: import time,sys,os,hashlib ...

  2. calico和flannel的优缺点

    1.Kubernetes通信问题 1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现. 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另 ...

  3. pytorch 环境配置

    一.下载Anaconda 二.添加清华镜像 # 添加清华镜像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anac ...

  4. 使用 StringUtils.split 的坑

    点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 在日常的 Java 开发中,由于 J ...

  5. C#接口设计

    基本架构 model 实体 说得通俗一些,model中主要是定义前端传过来的变量以及其类型,或者是需要操作的数据库中的某些字段值.举个例子: namespace Test.Models.Book { ...

  6. 使用GitHub Actions实现自动化部署

    前言 大家在工作中想必都是通过自动化部署来进行前端项目的部署的,也就是我们在开发完某个需求时,我们只需要将代码推送到某个分支,然后就能自动完成部署,我们一般不用关心项目是如何build以及如何depl ...

  7. 源码级深度理解 Java SPI

    作者:vivo 互联网服务器团队- Zhang Peng SPI 是一种用于动态加载服务的机制.它的核心思想就是解耦,属于典型的微内核架构模式.SPI 在 Java 世界应用非常广泛,如:Dubbo. ...

  8. HDLBits答案——Getting started

    Getting started 1 Step one module top_module( output one ); // Insert your code here assign one = 1' ...

  9. Seata 1.5.2 源码学习(事务执行)

    关于全局事务的执行,虽然之前的文章中也有所涉及,但不够细致,今天再深入的看一下事务的整个执行过程是怎样的. 1. TransactionManager io.seata.core.model.Tran ...

  10. SpringCloud(十一)- 秒杀 抢购

    1.流程图 1.1 数据预热 1.2 抢购 1.3 生成订单 (发送订单消息) 1.4 订单入库 (监听 消费订单消息) 1.5 查看订单状态 1.6 支付 (获取支付链接 ) 1.7 支付成功 微信 ...