软件测试必会:cookie、session和token的区别~

今天就来说说session、cookie、token这三者之间的关系!最近这仨玩意搞得头有点大🤣

01、为什么会有它们三个

我们都知道 HTTP 协议是无状态的,所谓的无状态就是客户端每次想要与服务端通信,都必须重新与服务端链接,意味着请求一次客户端和服务端就连接一次,下一次请求与上一次请求是没有关系的。

这种无状态的方式就会存在一个问题:如何判断两次请求的是同一个人?就好比用户在页面 A 发起请求获取个人信息,然后在另一个页面同样发起请求获取个人信息,我们如何确定这俩个请求是同一个人发的呢?

为了解决这种问题,我们就迫切需要一种方式知道发起请求的客户端是谁?此时cookie、token、session 就出现了,它们就可以解决客户端标识的问题,在扩大一点就是解决权限问题

它们就好比让每个客户端或者说登录用户有了自己的身份证,我们可以通过这个身份证确定发请求的是谁!从而知道用户登录的信息

02、什么是 cookie

cookie 是保存在客户端或者说浏览器中的一小块数据,大小限制大致在 4KB 左右,在以前很多开发人员通常用 cookie 来存储各种数据,后来随着更多浏览器存储方案的出现,cookie 存储数据这种方式逐渐被取代

主要原因有如下:

  • cookie 有存储大小限制,4KB 左右

  • 浏览器每次请求会携带 cookie 在请求头中

  • 字符编码为 Unicode,不支持直接存储中文

  • 数据可以被轻易查看

cookie 主要有以下属性:

图片

那么我们是如何通过 cookie 来实现用户确定或者权限的确定呢?

我们就以一个普通网站的用户登录操作以及后续操作为例,主要过程可以简单用下图表示:

图片

从上图中可以看到使用 cookie 进行用户确认流程是比较简单的,大致分为以下几步:

1.客户端发送请求到服务端(比如登录请求)。

2.服务端收到请求后生成一个 session 会话。

3.服务端响应客户端,并在响应头中设置 Set-Cookie。Set-Cookie 里面包含了 sessionId,它的格式如下:

 

Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

其中 sessionId 就是用来标识客户端的,类似于去饭店里面,服务员给你一个号牌,后续上菜通过这个号牌来判断上菜到哪里。

4.客户端收到该请求后,如果服务器给了 Set-Cookie,那么下次浏览器就会在请求头中自动携带 cookie。

5.客户端发送其它请求,自动携带了 cookie,cookie 中携带有用户信息等。

6.服务端接收到请求,验证 cookie 信息,比如通过 sessionId 来判断是否存在会话,存在则正常响应。

cookie 主要有以下特点:

  • cookie 存储在客户端

  • cookie 不可跨域,但是在如果设置了 domain,那么它们是可以在一级域名和二级域名之间共享的

03、什么是session

在上一节中,我们通过 Cookie 来实现了用户权限的确认,在其中我们提到了一个词:session。顾名思义它就是会话的意思,session 主要由服务端创建,主要作用就是保存 sessionId,用户与服务端之间的权限确认主要就是通过这个 sessionId。

简单描述下 session:

session 由服务端创建,当一个请求发送到服务端时,服务器会检索该请求里面有没有包含 sessionId 标识,如果包含了sessionId,则代表服务端已经和客户端创建过 session,然后就通过这个sessionId 去查找真正的session,如果没找到,则为客户端创建一个新的 session,并生成一个新的 sessionId 与 session对应,然后在响应的时候将 sessionId 给客户端,通常是存储在cookie 中。如果在请求中找到了真正的session,验证通过,正常处理该请求

总之每一个客户端与服务端连接,服务端都会为该客户端创建一个 session,并将 session 的唯一标识 sessionId 通过设置 Set-Cookie 头的方式响应给客户端,客户端将 sessionId 存到 cookie 中

通常情况下,我们 cookie 和 session 都是结合着来用,我们可以在修改一下整个请求过程图,如下所示:

图片

04、cookie和session区别

前面两节我们介绍了 cookie 和 session,它们两者之间主要是通过 sessionId 关联起来的,所以我们总结出:sessionId 是 cookie 和 session 之间的桥梁。我们日常的系统中如果在鉴权方面如果使用的是 cookie 方式,那么大部分的原理就和我们前面说的一样。

或者我们可以换个说法,session 是基于 cookie 实现的,它们两个主要有以下特点:

  • session 比 cookie 更加安全,因为它是存在服务端的,cookie 是存在客户端的

  • cookie 只支持存储字符串数据,session 可以存储任意数据

  • cookie 的有效期可以设置较长时间,session 有效期都比较短

  • session 存储空间很大,cookie 有限制

  • 系统想要实现鉴权,可以单独使用 cookie,也可以单独使用 session,但是建议结合两者使用

05、token 是什么

前面我们说的 sessionId 可以叫做令牌,令牌顾名思义就是确认身份的意思,服务端可以通过令牌来确认身份。cookie+session 是实现认证的一种非常好的方式,但是凡事都有两面性

它们实现的认证主要有以下缺点:

  • 增加请求体积,浪费性能,因为每次请求都会携带 cookie。

  • 增加服务端资源消耗,因为每个客户端连接进来都需要生成 session,* * 会占用服务端资源的。

  • 容易遭受 CSRF 攻击,即跨站域请求伪造。

那么为了避免这些缺点,token 方式的鉴权出现了,它可以说是一个民间的认证方式,但是不得不说它带来了非常多的好处。

1、token 的组成:

token 其实就是一串字符串而已,只不过它是被加密后的字符串,它通常使用uid(用户唯一标识)、时间戳、签名以及一些其它参数加密而成。我们将 token 进行解密就可以拿到诸如 uid 这类的信息,然后通过uid 来进行接下来的鉴权操作。

2、token 是如何生成的:

前面我们说 cookie 是服务端设置了 set-cookie 响应头之后,浏览器会自动保存 cookie,然后下一次发送请求的时候会自动把cookie 携带上。但是我们说 cookie 算是一种民间的实现方式,所以说

浏览器自然不会对它进行什么处理。token主要是由服务器生成,然后返回给客户端,客户端手动把 token 存下来,比如利用localstorage 或者直接存到 cookie当中也行。

3、token 认证流程:

  • 客户端发起登录请求,比如用户输入用户名和密码后登录

  • 服务端校验用户名和密码后,将用户 id 和一些其它信息进行加密,生成 token

  • 服务端将 token 响应给客户端

  • 客户端收到响应后将 token 存储下来

  • 下一次发送请求后需要将 token 携带上,比如放在请求头中或者其它地方。

  • 服务端 token 后校验,校验通过则正常返回数据

用图表示大致如下:

图片

06、总结

虽然前面解释 cookie、session、token 用了不少口舌,但是归根结底啊,它们的目的都是一样的:鉴权和认证

图片

总结下来就是:session 是空间换时间,token 是时间换空间

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3+vite 加载优化

公司项目,技术栈:vue3viteelementPLusecharts。首屏加载有点慢,针对这个做了一些优化措施,记录一下。之前写过关于vue2版本的优化,有兴趣的可以了解下 定位问题 f12打开控制台,然后Network看下那些包占比大…

Nvidia突袭AI江湖!悄悄发布新模型,完爆OpenAI和Anthropic?

你以为Nvidia只会造芯片?太天真了!这家GPU巨头刚刚在AI语言模型领域上演了一出惊天逆袭,让OpenAI和Anthropic都措手不及。 没有轰轰烈烈的发布会,没有铺天盖地的宣传,Nvidia就这么静悄悄地在Hugging Face平台上扔出了一…

【Unity Shader】Special Effects(十)Change 变换(UI)

源码:[点我获取源码] 索引 Change 变换思路分析变换进度噪声纹理闪烁闪烁时机闪烁颜色闪烁动画Change 变换 变换的效果为图像间的切换带来动感过程,使用动画播放器: 思路分析 首先,从原始图像变换到目标图像是一个从0到1的过程,这个过程我们命名为变换进度(0为完全显…

jQuery选择器

目录 一、基本选择器 1. 标签选择器(元素选择器) 2. ID 选择器 3. 类选择器 4. 通配符选择器 二、层次选择器 1. 后代选择器 2. 子选择器 3. 相邻兄弟选择器 4. 一般兄弟选择器 三、属性选择器 1. 简单属性选择器 2. 属性值等于选择器 3.属…

kafka如何获取 topic 主题的列表?

大家好,我是锋哥。今天分享关于【kafka如何获取 topic 主题的列表?】面试题?希望对大家有帮助; kafka如何获取 topic 主题的列表? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中,可以…

π0——用于通用机器人控制的流匹配VLA模型:一套框架控制7种机械臂(基于PaliGemma和ACT的3B模型)

前言 在此文之前,我花了一天半,详细解读了清华一研究团队发布的机器人扩散大模型RDT,包括其每一个附录,并在该文中预告说:​下一篇是一个3B的机器人大模型打通7种不同品牌的机械臂,这几个工作宣告机器人真…

Golang--运算符

1、算术运算符 算术运算符: ,-,*,/,%,,--,对数值类型的变量进行运算 package mainimport ("fmt" )func main() {//算术运算符// - * / % --//号在golang中表示正号&…

论文阅读:DynamicDet: A Unified Dynamic Architecture for Object Detection

论文地址:[2304.05552] DynamicDet: A Unified Dynamic Architecture for Object Detection 代码地址:GitHub - VDIGPKU/DynamicDet: [CVPR 2023] DynamicDet: A Unified Dynamic Architecture for Object Detection 概要 本文提出了一种名为 DynamicD…

Flutter 正在切换成 Monorepo 和支持 workspaces

其实关于 Monorepo 和 workspaces 相关内容在之前《Dart 3.5 发布,全新 Dart Roadmap Update》 和 《Flutter 之 ftcon24usa 大会,创始人分享 Flutter 十年发展史》 就有简单提到过,而目前来说刚好看到 flaux 这个新进展,所以就再…

expand,None索引,permute【pytorch】

torch.expand 输入必须是一个向量或等价形式,扩展的最后一个维度与输入大小一致 当输入形状为(1,1,1,1,1,……,3)_4时。 expand的最后一位输入向量的元素个数(长度)(3&…

GEE | 对Landsat 8 影像进行缨帽变换

基于Landsat 8 影像的缨帽变换 var roi ee.FeatureCollection(users/yongweicao11/Dongguan2022); // Landsat 8 的缨帽变换系数矩阵var Landsat8TC ee.Array([[0.3029, 0.2786 , 0.4733, 0.5599, 0.5082, 0.1872],[-0.2941, -0.2435, -0.5424, 0.7276, 0.0713, -0.1608],[0.…

Obsidian的Vim插件设置配置全流程 -- 脱离鼠标拥抱Vim神教

Obsidian的Vim插件设置配置全流程 -- 脱离鼠标拥抱Vim神教 参考文章引言1. vim 及 vimrc 介绍2. 开启 Obsidian 内置的 Vim3. vimrc 插件的获取和安装4. vimrc 插件的设置5. vimrc 配置文件的设置附件 参考文章 vim 常见操作 Obsidian插件安装教程 引言 vim 很好用&#xff…

6.《双指针篇》---⑥和为S的两个数字(中等但简单)(牛客)

题目传送门 方法一:暴力解法。双循环 方法二:双指针(推荐) 1.定义一个顺序表,定义左右双指针 2.while循环。判断array[left] array[right] 的值。 3.若等于则将这两个值加入数组。并break 4.若大于则right-- 5.若小于…

LeetCode994. 腐烂的橘子(2024秋季每日一题 54)

在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格中没有…

【51蛋骗鸡一个独立按键控制流水灯开关】2022-1-18

缘由一个独立按键控制流水灯开关-编程语言-CSDN问答 #include<reg52.h>//头文件 sbit k1P3^7;// void main() //主函数 {unsigned char sj0, ls0;unsigned int ys0;P00;/*P0255;*/while(1){if(!k1&&!sj){if(!ls){ls1;/*P00;*/}else ls0;while(!k1);}if(…

shodan(五)连接Mongodb数据库Jenkinsorg、net、查看waf命令

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人一律不承担一切后果 引言&#xff1a; 1.Shodan 是一个专门用于搜索连…

lvgl白屏问题(LCD长时间白屏)和优化lvgl

开机白屏时间过长 -- 这里我们不考虑是lvgl占的内存太大的问题&#xff0c;这里考虑的是为什么lcd屏幕启动后会有长时间的白屏。 首先我们要了解lvgl的相关操作&#xff0c;主要集中在一个函数中。只有程序执行到了这个函数&#xff0c;lvgl的屏幕才会显现出来 总结来说就是l…

公网ip和弹性公网ip有什么区别?哪个更好

公网ip和弹性公网ip有什么区别&#xff1f;公网IP和弹性公网IP都是用于互联网通信的IP地址&#xff0c;但它们在灵活性、成本和管理方式上有所不同。公网IP是直接分配给设备的静态IP地址&#xff0c;适用于需要固定外部访问的场景&#xff0c;但可能面临安全风险和设置复杂性。…

DevOps-课堂笔记

各种 aaS 类比于计算机网络的 OSI 参考模型&#xff0c;一个软件应用项目需要不同的支撑层&#xff0c;例如从下至上大概需要&#xff1a; 硬件层面的服务器针对硬件做弹性分配的虚拟化机制&#xff0c;例如虚拟机在虚拟化环境内运行的 OS支撑软件应用的中间件&#xff0c;例…

游戏想实习但定位不清的问题

国内的游戏大厂包括腾讯、网易、盛趣游戏、西山居、米哈游、莉莉丝、完美世界、游族、心动、叠纸、三七、TapTap、Tap4fun、字节跳动、哔哩哔哩、funplus、巨人、IGG、沐瞳等。而国外的游戏大厂则有育碧、EA、拳头、supercell、暴雪、R星、卡普空、任天堂、波兰蠢驴等。 一般来…