注:本节涉及到前后端,这个系列的对比学习,还是专注在前端Vue和Blazor技术,所以就不撸码了,下面主要学习概念。

我们知道,Http是无状态协议,客户端请求服务端,认证一次后,如果再次请求,又要重新认证,因为对服务端来说,客户端的每次请求都是无差别的!另外,服务端的授权体系,一般使用基于RBAC角色权限模型。角色信息,我们可以在客户端每次请求都,都查询一次,但这样比较消耗资源。最好的方式,是客户端第一次请求时,就将角色传给客户端,之后客户端每次请求,直接携带角色信息。而这些问题,都需要使用Cookie、Session或者jwt来解决。

1、先说Cookie。下图为Cookie在客户端与服务端的应用逻辑图。

如上图所示:

  • 客户端首次请求服务器时,携带参数(如用户名和密码),服务器根据参数判断是否合法。如合法,则在Response中颁发Cookies,如在.NET中,写入Cookie,【Response.Cookies[“name”].value = “functionMC”;Response.Cookies[“name”].Expires=DateTime.Now.AddDays(1);】,其中Expires属性,为服务端设置的过期时间。
  • 客户端收到服务器的Response后,将Cookie以健值对的方式保存到浏览器中,如使用js直接操作DOM,【document.Cookie="username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT";】,客户端也可以设置过期时间。如不设置,保存在内存中,浏览器关闭时自动清除;如设置,则保存在本地硬盘中,到期后自动清除。
  • 之后,客户端每次访问服务器,都会在请求头中携带相应站点的Cookie。服务端就可以读取Cookie,如在.NET中,读取Cookie,【string name = Request.Cookies[“name”].value】
  • Cookie在安全性方面,易出现Cookie劫持和欺骗,大小和数量方面也受限制。所以在Cookie之后,出现了Session。

2、Session。下图为Session在客户端与服务端的应用逻辑图

如上图所示。

  • 客户端首次访问服务器后,判断是否合法,如果合法,则在服务器的缓存中建立一个键值对,键为SessionID,同时将SessionID作为Cookie返回给客户端。客户端再次请求时,请求头携带SessionID,服务端根据SessionID,查找缓存信息,根据缓存信息进行处理。
  • 使用Session后,客户端与服务端之间只传递SessionID,更多信息在服务端缓存中,这样可以保存更多信息。Session可以设置有效期,也可以不设置。如不设置,则只在当前会话中有效,客户端关闭后就失效,这样也更安全。
  • Session本身的含义,指客户端与服务端之间的会话,背后实质指的是一种服务器缓存,如果请求不是很多,效率还是很高的
  • Session可以有效利用服务端资源,不受客户端限制,安全性更好。但是,当客户端的并发请求比较多时,会很占服务器内存。如果是分布式,不同的Session存储在不同的服务器之间,而客户端每次请求的路径是随配的,要解决分布式,我们就需要在每台服务器之间同步SessionID和缓存信息。最后,SessionID还是依赖于Cookie,Cookie的跨域、单点登陆难等问题,它也一样有。所以,token的方案开始出现,它是目前最主流的方案,而其中最重要的标准,就是jwt。

3、jwt。下图为token/jwt在客户端和服务端的应用逻辑图

如上图所示,jwt重新将信息保存在了客户端,节省了服务端资源,也没有分布式的问题,同时在灵活性和安全性方面有了质的提升。

  • 灵活性方面:不再限于Cookie,可以保存到本地的Storage或IndexedDB,甚至于远程数据库里,更加的自由。同时,它以JSON加密形式保存在客户端的,是跨语言的,原则上任何web形式都支持。
  • 安全性方面:可以说有了质的提升,这才是jwt的核心。首先它可以完全不依赖于Cookie,它没有跨域、单点登陆等问题;其次,它将加密和解密的过程,放在了服务器上,即使信息被截获,也无法篡改。
  • 更好的支持分布式:在Session方案中,我们需要在每个服务器都进行缓存同步。而jwt中,我们只要在每个服务器都拷备一份密钥即可,或者可以将密钥统一保存到一个Redis服务器中,每个服务器统一向Redis请求密钥,这样连拷贝密钥的工作也可省去

下面简单说明一下jwt的构成、生成、加密和解密过程:

  • jwt由Header、Playload和Signature三部分组成,以符号“.”连接成字符串。其中Header是一个json对象的Base64编码,主要有签名的算法信息;Playload也是一个json对象的Base64编码,这是传输的主体内容,比如用户角色、所在部门等信息都可以存放在里面。我们知道Base64不具有加密能力,可以说Header和Playload是明文传输的,在Playload里面,千万不能放敏感信息。而Signature才是jwt安全体系的核心
  • jwt是在服务端生成的,我们定义好Header和Playload后,在服务端我们有一个密钥Secret,这个密钥是一个没有规律的字符串。我们使用Header里的哈希算法,加上密钥、Header和Playload,就可以算出签名Signature。Signature是不可匿的,无法破解,破解也没意义。
  • 客户端再次请求时,服务端获得请求头携带的jwt后,取出Header、Playload、Signature(A)。对Header进行Base64解码,获取其中的哈希算法,然后重新使用这个哈希算法,加上密钥、Header和Playload重新算出一个签名Signature(B),然后比对Signature(A)和Signature(B)是否一致,如果一致,则请求是合法的,服务端放行,并使用Playload中的信息进行计算处理。
  • 服务端的密钥Secret,是计算签名的安全核心,一定要保存好,最好定期更新。

Blazor和Vue对比学习(进阶2.2.4):状态管理之持久化保存(2),Cookie/Session/jwt的更多相关文章

  1. Blazor和Vue对比学习:说在开始前

    1.Vue:现代前端三大框架之一(Vue/React/Angualr),基于HTML.CSS和JavaScript,2014年正式对外发布,目前已发展到3.X版本.值得说道的是,Vue的创始人作者是华 ...

  2. Blazor和Vue对比学习(基础1.4):事件和子传父

    Blazor和Vue的组件事件,都使用事件订阅者模式.相对于上一章的组件属性,需要多绕一个弯,无论Blazor还是Vue,都是入门的第一个难点.要突破这个难点,一是要熟悉事件订阅模式<其实不难& ...

  3. Blazor和Vue对比学习(基础1.6):祖孙传值,联级和注入

    前面章节,我们实现了父子组件之间的数据传递.大多数时候,我们以组件形式来构建页面的区块,会涉及到组件嵌套的问题,一层套一层.这种情况,很大概率需要将祖先的数据,传递给子孙后代去使用.我们当然可以使用父 ...

  4. Blazor和Vue对比学习(进阶2.1.1):生命周期,基本理解和使用

    一.基本理解 首次接触"生命周期"这个名词,是比较晦涩的,Vue中又有生命周期钩子,而Blazor则是虚方法重写,容易蒙.所以,我尝试从初学者的角度来阐述一下. 1.我们在基础部分 ...

  5. Blazor和Vue对比学习(进阶2.2.3):状态管理之状态共享,Blazor的依赖注入和第三方库Fluxor

    Blazor没有提供状态共享的方案,虽然依赖注入可以实现一个全局对象,这个对象可以拥有状态.计算属性.方法等特征,但并不具备响应式.比如,组件A和组件B,都注入了这个全局对象,并引用了全局对象上的数据 ...

  6. Blazor和Vue对比学习(基础1.9):表单输入绑定和验证,VeeValidate和EditFrom

    这是基础部分的最后一章,内容比较简单,算是为基础部分来个HappyEnding.我们分三个部分来学习: 表单输入绑定 Vue的表单验证:VeeValidate Blazor的表单验证:EditForm ...

  7. Blazor和Vue对比学习(基础1.8):Blazor中实现计算属性和数据监听

    1.7章<传递UI片断>,需要做几个案例,这部分暂停消化几天.我们先把基础部分相对简单的最后两章学习了. 计算属性和数据监听是Vue当中的概念,本质上都是监听数据的变化,然后做出响应.两者 ...

  8. Blazor和Vue对比学习(基础1.1):组件结构

    难度:★ 简单说一说: 1.Vue和Blazor都遵循单文件结果,即HTML(视图模板).CSS(样式).JS/C#(代码逻辑)写在一个文件里,Vue的文件后缀为.vue,Blazor的文件后缀为.r ...

  9. Blazor和Vue对比学习(基础1.2):模板语法和Razor语法

    Vue使用模板语法,Blazor使用祖传的Razor语法,从逻辑和方向上看,两者极为相似,比如: 都基于HTML 都通过声明式地将组件实例的状态(数据/方法)绑定到呈现的DOM上 都通过指令实现更加丰 ...

随机推荐

  1. Vue路由实现之通过URL中的hash(#号)来实现不同页面之间的切换(图表展示、案例分析、附源码详解)

    前言 本篇随笔主要写了Vue框架中路由的基本概念.路由对象属性.vue-router插件的基本使用效果展示.案例分析.原理图解.附源码地址获取. 作为自己对Vue路由进行页面跳转效果知识的总结与笔记. ...

  2. 跨域问题及其解决方法(JSONP&CORS)

    一.什么是跨域 当a.qq.com域名下的页⾯或脚本试图去请求b.qq.com域名下的资源时,就是典型的跨域行为.跨域的定义从受限范围可以分为两种,⼴义跨域和狭义跨域. (一)广义跨域 ⼴义跨域通常包 ...

  3. 羽夏笔记—— AT&T 与 GCC

    写在前面   本文是本人根据<AT&T 汇编语言与 GCC 内嵌汇编简介>进一步整理,修改了一些错误,并删除我并不能复现代码相关的部分.该文章一是我对 AT&T 的学习记录 ...

  4. Vue基础篇 之 v-model 模拟

    我们知道vue中 为简化表单输入 提供了v-model 的语法绑定 将 vue的属性和表单元素进行了双向绑定 大大简化了表单数据操作的数据绑定 那么v-model 是如何实现双向绑定的呢? 今天我们来 ...

  5. Wget命令解释

    Wget主要用于下载文件,在安装软件时会经常用到,以下对wget做简单说明. 1.下载单个文件:wget http://www.baidu.com.命令会直接在当前目录下载一个index.html的文 ...

  6. script标签crossorigin属性及同源策略和跨域方法

    首先介绍(同源策略) 同源策略是浏览器最核心且基本的安全约定,要求协议.域名.端口都相同为同源,如果非同源时请求数据浏览器会在控制台抛出跨域异常错误,同源策略是浏览器的行为,即使客户端请求发送了,服务 ...

  7. Apache Poi 操作word,替换字符保留样式问题,runs段落混乱问题。

    关于这个问题也是刚好遇到,一通搜索也没有找到类似的或者是有效的方法.下面介绍一下. 首先apache poi的引入 <dependency> <groupId>org.apac ...

  8. 2022年最强八股文《码出八股文-斩出offer线》

    宝剑锋从磨砺出,梅花香自苦寒来,大家好,我是小码哥 整理好的八股文终于完成了,希望看完对大家面试有所收获! 目录: 基础篇 javaOOP面试题 java集合/泛型面试题 java异常面试题 java ...

  9. 基于.NET6的开源工业物联网网关

    什么是工业物联网网关 工业物联网网关(IIoTGateway)是一种硬件设备或软件程序,作为本地设备(如PLC.扫码枪.机器人.数控机床.非标上位机等)与云端系统(如物联网平台.SCADA系统.MES ...

  10. Nodejs实现图片的上传、压缩预览、定时删除

    前言 我们程序员日常都会用到图片压缩,面对这么常用的功能,肯定要尝试实现一番.第一步,node基本配置 这里我们用到的是koa框架,它可是继express框架之后又一个更富有表现力.更健壮的web框架 ...