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. 物理服务器做系统盘centos

    linux系统跟windows系统都是操作系统的一种,安装的方法也较多,一样可以通过制作u盘启动盘给linux系统安装.那么具体是如何安装linux?下面就给大家演示下u盘启动盘安装linux系统教程 ...

  2. 转载:Python 实现百度翻译

    来源: https://blog.csdn.net/qq_44814439/article/details/105642066 作者: Chloemxc 功能: Python 实现百度翻译 from ...

  3. python渗透测试入门——取代netcat

    1.代码及代码讲解. 实验环境:windows10下的linux子系统+kali虚拟机 import argparse import socket import shlex import subpro ...

  4. Django系列---开发一

    参考 杜赛: https://www.dusaiphoto.com/article/2/ 官方文档: https://docs.djangoproject.com/en/3.2/ 开发环境 # 基本 ...

  5. Oracle数据库的导出和导入

    本次数据库的导入导出操作是导出公司环境的Oracle数据库,再导入本地数据库,采用impdp和expdp命令进行导入导出操作. 一.导出52数据库 1.用system用户登录到数据库,查看是否有创建d ...

  6. 试试将.NET7编译为WASM并在Docker上运行

    之前有听到说Docker支持Wasmtime了,刚好.NET7也支持WASM,就带大家来了解一下这个东西,顺便试试它怎么样. 因为WASM(WebAssembly) 一开始是一个给浏览器的技术,比起J ...

  7. 6、将两个字符串连接起来,不使用strcat函数

    /* 将两个字符串连接起来,不使用strcat函数 */ #include <stdio.h> #include <stdlib.h> void strCat(char *pS ...

  8. 链接脚本(Linker Scripts)语法和规则解析(自官方手册)

    为了便于与英文原文对照学习与理解(部分翻译可能不准确),本文中的每个子章节标题和引用使用的都是官方手册英文原称.命令及命令行选项统一使用斜体书写.高频小节会用蓝色字体标出. 3 Linker Scri ...

  9. (GCC) C++代码中使用#pragma GCC optimize / #pragma G++ optimize

    科学计算用优化 经过实验证明这个命令优化效果最好,把我的 1.2S 的 FFT 优化到了 0.4S使用 pragma 命令优化程序: #pragma GCC optimize("Ofast, ...

  10. oracle 中模糊查询对like的代替insrt()函数 可以做到效率节约一倍以上

    昨天在处理一个字符拆分的功能时,用用到了insrt()函数,偶然发现其实特可以代替模糊查询的like,经多次测试可节约效率一倍以上. 代码如下: select distinct(a.deptname) ...