鉴权必须了解的5个知识点:cookie,session,token,jwt,单点登录

从状态说起

[HTTP 无状态]

我们知道,HTTP是无状态的,也就是说,HTTP请求方和响应方间无法维护状态,都是一次性的,它不知道前后的请求都发生了什么

但有的场景下,我们需要维护状态,最常见的,一个用户登录微博,发布,关注,评论,都是应该在登录后的用户状态下的

[标记]

在学校或公司,入学入职那一天起,会录入你的身份、账户信息,然后给你发个卡,今后在园区内,你的门禁、打卡、消费都只需要刷这张卡

[前端存储]

这就涉及一发,一存,一带,发好办,登录接口直接返回给前端,存储就需要前端想办法了,前提是,你要把卡带在身上

前端的存储方式有很多

  • 挂载到全局变量上,但这是个[体验卡],一次刷新页面就没了
  • 可以存到cookie,localStorage里,这属于[会员卡],无论怎么刷新,只要浏览器没清掉或者过期,就一直拿着这个状态
基石:cookie

可是前端好麻烦啊,又要自己存,又要想办法带出去,有没有不用操心的?

有,cookie

cookie也是前端存储的一种,但相比于localStorage等其他方式,借助HTTP头,浏览器能力,cookie可以做到前端无感知

一般过程是这样的:

  • 在提供标记的接口,通过 HTTP 返回头的 Set-Cookie 字段,直接「种」到浏览器上
  • 浏览器发起请求时,会自动把 cookie 通过 HTTP 请求头的 Cookie 字段,带给接口
[配置:Domain / Path]

你不能拿清华的校园卡进北大

cookie 是要限制:通过Domain(域) / Path(路径)两级(空间范围)

Domain属性指定浏览器发出 HTTP 请求时,哪些域名要附带这个 Cookie。如果没有指定该属性,浏览器会默认将其设为当前 URL 的一级域名,比如 www.example.com 会设为 example.com,而且以后如果访问example.com的任何子域名,HTTP 请求也会带上这个 Cookie。如果服务器在Set-Cookie字段指定的域名,不属于当前域名,浏览器会拒绝这个 Cookie。

Path属性指定浏览器发出 HTTP 请求时,哪些路径要附带这个 Cookie。只要浏览器发现,Path属性是 HTTP 请求路径的开头一部分,就会在头信息里面带上这个 Cookie。比如,PATH属性是/,那么请求/docs路径也会包含该 Cookie。当然,前提是域名必须一致

[配置:Expires / Max-Age]

你毕业了卡就不好使了

cookie 还可以限制 通过Expires,Max-Age中的一种 (时间范围)

Expires属性指定一个具体的到期时间,到了指定时间以后,浏览器就不再保留这个 Cookie。它的值是 UTC 格式。如果不设置该属性,或者设为null,Cookie 只在当前会话(session)有效,浏览器窗口一旦关闭,当前 Session 结束,该 Cookie 就会被删除。另外,浏览器根据本地时间,决定 Cookie 是否过期,由于本地时间是不精确的,所以没有办法保证 Cookie 一定会在服务器指定的时间过期。

Max-Age属性指定从现在开始 Cookie 存在的秒数,比如60 * 60 * 24 * 365(即一年)。过了这个时间以后,浏览器就不再保留这个 Cookie。
如果同时指定了Expires和Max-Age,那么Max-Age的值将优先生效。
如果Set-Cookie字段没有指定Expires或Max-Age属性,那么这个 Cookie 就是 Session Cookie,即它只在本次对话存在,一旦用户关闭浏览器,浏览器就不会再保留这个 Cookie

[配置:Secure / HttpOnly]

有的学校规定,不带卡套不让刷(什么奇葩学校,假设);有的学校不让自己给卡贴贴纸。

Secure属性指定浏览器只有在加密协议 HTTPS 下,才能将这个 Cookie 发送到服务器。另一方面,如果当前协议是 HTTP,浏览器会自动忽略服务器发来的Secure属性。该属性只是一个开关,不需要指定值。如果通信是 HTTPS 协议,该开关自动打开

HttpOnly属性指定该 Cookie 无法通过 JavaScript 脚本拿到,主要是Document.cookie属性、XMLHttpRequest对象和 Request API 都拿不到该属性。这样就防止了该 Cookie 被脚本读到,只有浏览器发出 HTTP 请求时,才会带上该 Cookie

[HTTP 头对cookie的读写]

HTTP 返回的一个 Set-Cookie 头用于向浏览器写入「一条(且只能是一条)」cookie,格式为 cookie 键值 + 配置键值

Set-Cookie: username=jimu; domain=jimu.com; path=/blog; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
1

那我想一次多 set 几个 cookie 怎么办?多给几个 Set-Cookie 头(一次 HTTP 请求中允许重复)

[前端对cookie的读写]

前端可以自己创建 cookie,如果服务端创建的 cookie 没加HttpOnly,那恭喜你也可以修改他给的 cookie。

调用document.cookie可以创建、修改 cookie,和 HTTP 一样,一次document.cookie能且只能操作一个 cookie

document.cookie = 'username=jimu; domain=jimu.com; path=/blog; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly';
1

调用document.cookie也可以读到 cookie,也和 HTTP 一样,能读到所有的非HttpOnly cookie

console.log(document.cookie);// username=jimu; height=180; weight=80 
1

那有了存储工具,接下来怎么做呢?

应用方案:服务端session

现在回想下,你刷卡的时候发生了什么?

其实你的卡上只存了一个 id(可能是你的学号),刷的时候物业系统去查你的信息、账户,再决定「这个门你能不能进」「这个鸡腿去哪个账户扣钱」

这种操作,在前后端鉴权系统中,叫 session

典型的 session 登陆/验证流程:
在这里插入图片描述

  1. 浏览器登录发送账号密码,服务端查用户库,校验用户
  2. 服务端把用户登录状态存为Session,生成一个sessionId
  3. 通过登录接口返回,把sessionId set到cookie上
  4. 此后浏览器再请求业务接口,sessionId 随cookie带上
  5. 服务端查sessionId校验session
  6. 成功后正常做业务处理,返回结果
[Session 的存储方式]

服务端只是给 cookie 一个 sessionId,而 session 的具体内容(可能包含用户信息、session 状态等),要自己存一下。存储的方式有几种:

Redis(推荐):内存型数据库,redis中文官方网站。以 key-value 的形式存,正合 sessionId-sessionData 的场景;且访问快。
内存:直接放到变量里。一旦服务重启就没了
数据库:普通数据库。性能不高

[Session 的过期和销毁]

很简单,只要把存储的 session 数据销毁就可以

应用方案:token

我又想到学校,在没有校园卡技术以前,我们都靠「学生证」。门卫小哥直接对照我和学生证上的脸,确认学生证有效期、年级等信息,就可以放行了

回过头来想想,一个登录场景,也不必往 session 存太多东西,那为什么不直接打包到 cookie 中呢?这样服务端不用存了,每次只要核验 cookie 带的「证件」有效性就可以了,也可以携带一些轻量的信息

这种方式通常被叫做 token
在这里插入图片描述
token的流程是这样的:

  1. 用户登录,服务端校验账号密码,获取用户信息
  2. 把用户信息,token配置编码成token,通过cookie set到浏览器
  3. 此后用户请求业务接口,通过cookie携带token
  4. 接口校验token有效性,进行正常业务接口处理
session 和 token

狭义上,我们通常认为 session 是「种在 cookie 上、数据存在服务端」的认证方案,token 是「客户端存哪都行、数据存在 token 里」的认证方案。对 session 和 token 的对比本质上是「客户端存 cookie / 存别地儿」、「服务端存数据 / 不存数据」的对比。

单点登录

前面我们已经知道了,在同域下的客户端/服务端认证系统中,通过客户端携带凭证,维持一段时间内的登录状态。

但当我们业务线越来越多,就会有更多业务系统分散到不同域名下,就需要「一次登录,全线通用」的能力,叫做「单点登录」

虚假”的单点登录(主域名相同)

简单的,如果业务系统都在同一主域名下,比如wenku.baidu.com tieba.baidu.com,就好办了。可以直接把 cookie domain 设置为主域名 baidu.com,百度也就是这么干的

“真实”的单点登录(主域名不同)

比如滴滴这么潮的公司,同时拥有didichuxing.com xiaojukeji.com didiglobal.com等域名,种 cookie 是完全绕不开的。

这要能实现「一次登录,全线通用」,才是真正的单点登录。

这种场景下,我们需要独立的认证服务,通常被称为 SSO
在这里插入图片描述

  1. 用户进入A系统,没有登录凭证(ticket),A系统给他跳到SSO
  2. SSO没登录过,也就没有sso系统下没有凭证(注意这个和前面 A ticket是两回事),输入账号密码登录
  3. SSO账号密码验证成功,通过接口返回做两件事,一是种下sso系统下凭证(记录用户登录状态);二是下发一个ticket
  4. 客户端拿到ticket,保存起来,带着请求系统A接口
  5. 系统A检验ticket,成功后正常处理业务请求
  6. 此时用户第一次进入系统B,没有登录凭证(ticket),B系统给他跳到SSO
  7. SSO登录过,系统下有凭证,不用再次登录,只需要下发ticket
  8. 客户端拿到ticket,保存起来,带着请求系统B接口

总结

  • HTTP是无状态的,为了维持前后请求,需要前端存储标记
  • cookie 是一种完善的标记方式,通过 HTTP 头或 js 操作,有对应的安全策略,是大多数状态管理方案的基石
  • session 是一种状态管理方案,前端通过 cookie 存储 id,后端存储数据,但后端要处理分布式问题
  • token 是另一种状态管理方案,相比于 session 不需要后端存储,数据全部存在前端
  • token 的编码技术,通常基于 base64,或增加加密算法防篡改,jwt 是一种成熟的编码方案
  • session 和 token 的对比就是「用不用cookie」和「后端存不存」的对比
  • 单点登录要求不同域下的系统「一次登录,全线通用」,通常由独立的 SSO 系统记录登录状态、下发 ticket,各业务系统配合存储和认证 ticket

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何实现session共享的几种解决方案?

先了解一下为什么会出现这种session共享的解决方案? 随着互联网公司的项目在微服务和分布式的环境下进行的搭建,导致一个项目可能分别部署在几个甚至很多的服务器集群下,此时就会出现一个问题当用户进行一个session会话的时候,比…

java类继承语法_java类的继承(基础)

---恢复内容开始---这篇随笔和大家讲讲java中类的继承是什么?希望对你们有所帮助。目录一、java继承是什么?二、为什么使用java继承三、java继承的实现1.1 java继承的基本语法1.2 super的用法一、Java继承是什么?简单来讲,Java中…

事务及事务隔离级别

什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(…

java类加载的搜索顺序_Java类加载器加载类顺序

java ClassLoader的学习java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class形式,然后由java虚拟机(JVM)解释执 行,.class字节码文件本身是平台无关的,但是jvm却不是,为了实现所谓的一次编…

HTTP 必备干货学习,一篇HTTP入门 不收藏都可惜!

文章目录📢前言HTTP 必备干货学习,程序员不懂网络怎么行HTTP 协议五个特点:网络结构图解HTTP概述🏳️‍🌈基于 HTTP 的系统的组件客户端:用户代理网络服务器代理HTTP 的基本方面HTTP 很简单HTTP 是可扩展的…

在别人发来的文章上修改时,出现红色且带下划线的情况

这是因为一些比较严谨的机构将模板发过来在你修改的时候会出现特殊标记(比如律师行业) 这里想要直接在他的文档上进行修改,需要取消掉原来的修订配置 再次输入格式消失

谈Servlet与JSP

文章目录前言正文1、什么是JSP?2、什么是Servlet?3、JSP与Servlet的区别和联系4、扬长弊端提出MVC前言 提高Java Web 开发,不得不说http协议,接下来就说Servlet 和 Jsp 这两个java类。 正文 1、什么是JSP? JSP(Java Server Pages)是Sun…

Tomcat就是这么简单

什么是Tomcat Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器。 为什么我们需要用到Tomcat 如果你学过html,css,你会知道你写的页面只能自己访问,别人不能远程访…

java if两个条件_java(3) if结构

一、基本if结构1、流程图1)输入输出2)判断和分支3) 流程线1.1 简单的if条件判断if(表达式){//表达式为true,执行{}中的代码}示例1:如果张三的Java成绩大于98分,那么老师奖励他一个MP4。1 public classPractice1 {2 pu…

Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】

什么是Servlet? Servlet其实就是一个遵循Servlet开发的java类。Servlet是由服务器调用的,运行在服务器端。 为什么要用到Servlet? 我们编写java程序想要在网上实现 聊天、发帖、这样一些的交互功能,普通的java技术是非常难完成…

Servlet第三篇【request和response简介、response的常见应用】

response、request对象 Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象、和代表响应的response对象 既然request对象代表http请求,那么我们获取浏览器提交过来的数据,找request对象即可。respon…

spring三种注入方式

设置Spring的作用域 或者使用枚举值设置 单例和多里使用场景 自动注入 Primary 一个接口有多个实现被spring管理吗,在依赖注入式,spring会不知道注入哪个实现类就会抛出NoUniqueBeanDefinitionException异常 使用Primary 来告诉Spring 注入哪个实现…

java虚拟机1.7_《Java虚拟机原理》7.1 精选 —— 总览

1.一个程序在 JVM 中运行的完整流程java程序执行流程.JPG说明:① 类加载器把字节码加载到方法区② 方法区的字节码被 JVM new,在堆内存中生成字节码对象③ 字节码对象被 GC 的要求有:该类没有在其他任何地方被引用;该类的所有的实…

Servlet第四篇【request对象常用方法、应用】

什么是HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。 简单来说,要…

java 设置控制台标题_修改Tomcat控制台标题以及标题乱码处理

双击“startup.bat”启动Tomcat,控制台默认标题是Tomcat,如下图:修改标题很容易,编辑catalina.bat这个文件(跟startup.bat在同级目录下),编辑的时候建议使用notepad、editplus之类的工具。然后找到如下代码片段(大约在…

Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】

什么是会话技术 基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话. 为什么我们要使用会话技术&#xff1…

Servlet第六篇【Session介绍、API、生命周期、应用、与Cookie区别】

什么是Session Session 是另一种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的时候,服务器把用户的信息以某种的形式记录在服务器,这就是Session 如果说Cookie是检查用户身上的”…

Tomcat+Servlet面试题都在这里

下面是我整理下来的Servlet知识点: 图上的知识点都可以在我其他的文章内找到相应内容。 Tomcat常见面试题 Tomcat的缺省端口是多少,怎么修改 找到Tomcat目录下的conf文件夹进入conf文件夹里面找到server.xml文件打开server.xml文件在server.xml文件里面找到下列…

java sdk下载_Java Sdk下载 | 保利威帮助中心

播放界面开发前准备1.小程序微信开发者后台设置-开发设置-服务器域名中配置 [request合法域名]开始开发1.获取频道直播播放地址index.wxmlindex.js选项说明uid类型:String说明:直播账户idvid类型:String说明:直播频道idvideoConte…

mysql union 与 union all 语法及用法

1.mysql union 语法 mysql union 用于把来自多个select 语句的结果组合到一个结果集合中。语法为: select column,......from table1union [all]select column,...... from table2...在多个select 语句中,对应的列应该具有相同的字段属性&#xff0c…