如何理解session、cookie、token的区别与联系?
session、cookie、token。 相信学过接口的朋友都特别熟悉了。
但是对我一个刚接触接口测试的小白来说,属实有点分不清楚。
下文就是我通过查阅各种资料总结出来的一点理解,不准确的地方还请各位指正。
(文末送洗浴中心流程指南)
产生背景
网络中http协议本身是无状态协议。
无状态协议的意思是:客户端向服务器请求数据时,每一次的请求和上一次都是没有任何关联的(特点:快!)。网上有一个经典的例子(看一次笑一次)可以帮助大家理解。
夏洛:楼上住的是马冬梅家吗?(第一次请求)
大爷:马什么梅?
夏洛:马冬梅。(第二次请求)
大爷:什么冬梅?
夏洛:马冬梅!(第三次请求)
大爷:马冬什么?
夏洛:没事,大爷您歇着吧。
这位大爷就可以理解为web服务器。为了让这位大爷无状态的服务器能记住上一秒我是谁,cookie、session、token就横空出世,各显神威了。
cookie
一句话概括:服务器产生,只保存在客户端,客户端后续请求都需要携带cookie,供服务器识别身份。
产生过程:
1.客户端第一次访问服务器,服务器并不认识这是谁,于是创建一组数据放到一个叫做’Set-Cookie’的字段里发送给客户端,数据格式为’key=value’
2.客户端收到Set-Cookie字段的数据后,将数据保存到浏览器本地,下次请求时会自动将这个’key=value’放到cookie中发送到服务器
3.服务器收到请求后,就可以根据cookie字段中的值识别其身份,并提供服务。
分析
作为一名测试,一听就知道,这种放在客户端的数据肯定不安全,有可能被拦截并恶意使用,所以cookie用来保存一些不重要的信息,比如我们常见的记住用户名、浏览记录等。
拓展
那么cookie具体是存放在哪里呢?
以chrome为例,右上角点击‘…’,选择设置,点击左侧隐私设置和安全性,然后选择Cookie及其他网站数据,最后点击查看所有 Cookie 和网站数据
在不信任的环境下可以清除这里面的数据。
也可以通过F12查看我们当前网页存的cookie数据,以我自己的csdn博客为例
cookie数据有失效时间,看expire值。
session
一句话概括:session就是一个会话信息。保存在服务器上,客户端每次请求时带着sessionID(一般放在cookie里)即可。
产生过程
1.客户端访问服务器
2.服务器收到后生成一个sessionID发送给客户端,同时,服务器也把sessionID和对应的用户信息、操作记录等记录在服务器上(记录方式有很多,文件、数据库、内存都可以)。
3.客户端再次访问服务器时,会带着包含sessionID的cookie
4.服务器再次收到请求,发现cookie里有sessionID,然后去之前自己记录的信息找这个sessionID,找到后就可以知道该sessionID对应的用户信息、操作记录等信息。
5.客户端退出,则会话结束,session失效(但不绝对),所以服务器也为session设置了一个失效时间,默认为30分钟。
分析
session相对于cookie来说更安全,所以一些重要信息会存放在session中。但session会在一定时间内(默认半小时)保存在服务器上,当访问增多,会比较占用你服务器的性能。
session还有一个最突出的缺陷就是可拓展性差,比如服务器有两台机器,我通过机器A登录了系统,那么我的信息,也就是session就会保存在机器A上,但如果我下次的请求发到了机器B上怎么办?机器B上可没有存我的sessionID。
虽然大家也研究出来了一些应对办法,但都很麻烦且不能算完美解决(主要是我看不太懂,不过在学习接口测试前期,了解session的工作机制及其优缺点就暂时够用)。
token(令牌)
一句话概括:用户登录成功后,服务器用一堆复杂的数据加算法进行加密并签名后,返回一个token给客户端,作为客户端的唯一身份标识,客户端后续请求带着这个token即可。
产生过程
1.用户通过用户名和密码进行登录
2.服务器验证后,根据算法生成token返回给客户端,同时给数据库和Redis里关联token和用户信息
3.客户端收到token并保存,再次发送请求时把token放到http的请求头里。
4.服务器查询数据库和Redis,验证(解密)token,通过则返回数据
分析
token作为目前比较常用的登录验证方式, 我理解的其最明显优势:
1.无状态。token放到http的头里,相当于无状态访问,服务器不用存数据,只需要验证token,相当于用token的解密时间换取session的存储空间。
2.安全。服务器生成token时会用到各种算法进行加密/签名,且这套算法只有他自己知道,听起来就比前边两种安全多了。而且我们在登录的时候可以带上一些参数(比如设备ID、mac地址)发送给服务器用来加密,服务器解析token时如果这些参数的值发生变化了,就会验证不通过,这样就保证了每一个设备拥有了一个唯一的会话。
token是有时效的,一段时间之后用户就需要重新验证。
3.可拓展性。支持跨域访问和跨平台(比如支持移动设备)访问,在不同的服务器上,只要token校验规则相同,就可以请求到数据和资源。
思考
最后,通过一个生活中的例子加强对三者的理解:
比如你去洗浴消费,你就相当于客户端,洗浴中心相当于服务器。
你来到前台说要洗澡(登录成功),这时会给你个手牌(token)作为你身份认证标识,进去洗澡、搓澡、打盐(这些服务会记在你的手牌号上并通知前台)一通享受后,出来结账,前台会通过你的手牌号码(sessionID)查一下你进行了哪些服务,结完账,临走前洗浴中心送了你一张打折券(cookie),下次来别忘了带(存你本地了),见券打8折。
学习安排上
如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片进群即可自行领取。
相关文章:

如何理解session、cookie、token的区别与联系?
session、cookie、token。 相信学过接口的朋友都特别熟悉了。 但是对我一个刚接触接口测试的小白来说,属实有点分不清楚。 下文就是我通过查阅各种资料总结出来的一点理解,不准确的地方还请各位指正。 (文末送洗浴中心流程指南)…...

【MyBatis】| MyBatis分页插件PageHelper
目录 一:MyBatis使⽤PageHelper 1. limit分⻚ 2. PageHelper插件 一:MyBatis使⽤PageHelper 1. limit分⻚ (1)概念: ①页码:pageNum(用户会发送请求,携带页码pageNum给服务器&am…...
Java枚举类详解
一、定义格式 public enum s { 枚举项1,枚举项2,枚举项3; } // 定义一个枚举类,用来表示春,夏,秋,冬这四个固定值 public enum Season {SPRING,SUMMER,AUTUMN,WINTER; } 二、枚举的特点 1、所有枚举类都是Enum的子类 2、我们可以通…...

C语言数组
一.数组定义 数组由数据类型相同的一系列元素组成 如 int main(){ float candy[365]; char code[12]; int states[50]; … } cnady是包含了365个float元素的数组。code是包含了12个char类型的数组。states包含了50个int类型的数组。 二.数组初始化和取值 我们使用花括号包含值&…...

Scala 入门(第一章Scala 环境搭建、插件的安装)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 第 1 章 Scala 入门1.1 概述1.1.1 为什么学习 Scala1.1.2 Scala 发展历史1.1.3 Scala 和 Java 关系1.1.4 Scala 语言特点1.2 Scala 环境搭建1.3 Scala 插件安装1.4 HelloWorl…...
math@多项式@求和式乘法@代数学基本定理
文章目录多项式求和式乘法应用代数学基本定理相关证明高次方程其他关于多项式的参考多项式求和式乘法 S∏j1(∑k1ajk) j∏j1m(∑k1njajk) jS\prod_{j1}\left(\sum\limits_{k1}a_{jk}\right)_{\!\!\!j} \\\prod_{j1}^{m}\left(\sum\limits_{k1}^{n_j}a_{jk}\r…...
Kafka系列之:基于SCRAM和Ranger机制完成动态新增kafka读写账号、赋予账号对指定Topic的读写权限
Kafka系列之:基于SCRAM和Ranger机制完成动态新增kafka读写账号、赋予账号对指定Topic的读写权限 一、需求背景二、添加写用户三、查看用户是否添加到zookeeper中四、查看用户五、赋予用户topic写权限六、生产者配置文件七、ranger给用户权限八、往Topic写数据九、删除添加的用…...
第五十三章 DFS进阶(一)——剪枝优化
第五十四章 DFS进阶(一)——剪枝优化一、什么是剪枝?二、剪枝优化的策略1、优化搜索顺序2、排除等效冗余3、可行性剪枝4、最优性剪枝5、记忆化搜索三、例题1、AcWing 165. 小猫爬山(DFS 剪枝优化)2、AcWing 167. 木棒…...

Java字节码深度知多少?
文章目录1、字节码结构1.1、基本结构1.2、实际观测2、内存表示3、方法调用指令4、invokedynamicEND结语Java真的是长盛不衰,拥有顽强的生命力。其中,字节码机制功不可没。字节码,就像是 Linux 的 ELF。有了它,JVM直接摇身一变&…...

【C++】智能指针(万字详解)
🌈欢迎来到C专栏~~智能指针 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤&…...

使用docker配置mysql主从复制
1.新建主服务器容器实例: docker run -p 3307:3306 --name mysql \ -v /docker/mysql/data:/var/lib/mysql \ -v /docker/mysql/conf:/etc/mysql/conf \ -v /docker/mysql/log:/var/log/mysql \ -e MYSQL_ROOT_PASSWORDroot \ -d mysql:5.7 设置容器卷之后…...
v3 异步组件及分包使用
1 app.vue <template> <!-- vue3异步组件必须使用suspense --> <Suspense> <template #default> <!-- 异步组件 --> <SyncVue></SyncVue> </template> <template v-slot:fallback> <!-- 优先显示骨架屏 --> <…...

实用调试技巧【上篇】
🔴本文章是在 Visual Studio 2022(VS2022)编译环境下进行操作讲解 文章目录🥳1. 什么是bug?🥳2.调试有多重要?2.1. 我们是如何写代码的?2.2.调试是什么?2.3.调试的基本步…...

JavaScript 教程
手册简介JavaScript 是世界上最流行的脚本语言。 JavaScript 是属于 web 的语言,它适用于 PC、笔记本电脑、平板电脑和移动电话。 JavaScript 被设计为向 HTML 页面增加交互性。 许多 HTML 开发者都不是程序员,但是 JavaScript 却拥有非常简单的语法。几…...
在SpringBoot里面使用原生的Servlet
在SpringBoot里面使用Servlet 首先在主程序中添加注解主程序添加ServletComponentScan // 加上这个注解之后就可以使用原生的组件了 HttpServlet 继承HttpServlet 重写方法 添加WebServlet 第一种方式使用注解 WebServlet(value "/helsk") public class HelloSe…...
商标被驳回,先别慌!挽回商标有办法
商标注册是一个漫长的等待过程,提交了注册申请之后不代表就能得心应手。商标局在接收到申请后,便会开始各阶段审查,面对不符合条件的商标会予以商标驳回。商标局基于什么原因而驳回注册申请呢?驳回后还有必要进行商标驳回复审吗?今天心周企…...

VMware安装Linux虚拟机后忘记root密码处理方法
OS版本:Red Hat 7.7 问题说明: 之前用VMWare安装了一台Linux虚机,由于长期没使用,导致忘记了root密码。所以需要修改root密码。 Root密码修改 现将修改root密码的操作步骤记录如下。 1.启动虚拟机,出现启动倒计时…...

Centos安装OpenResty
文章目录一. OpenResty是什么二. OpenResty的安装1. 安装开发库2. 安装OpenResty仓库3. 安装OpenResty4. 安装opm工具5. 目录结构6. 配置nginx的环境变量7. 启动和运行8. 配置文件修改三. 小案例1. 案例说明2. OpenResty监听请求3. 编写业务代码4. 获取请求参数一. OpenResty是…...

阿里云部署SpringBoot项目
目录 步骤1:购买服务器(新用户免费试用一个月) 步骤2:查看服务器相关信息 编辑 步骤3:设置安全组 步骤4:远程连接 步骤5:使用FinalShell连接阿里云服务器 步骤6:阿里云服务器上安装JDK 编辑 步骤7…...

EdgeCOM嵌入式边缘计算机的参数配置
EdgeCOM嵌入式边缘计算机的参数配置: 下面以 eth0 为例进行命令说明。 在 Linux 系统下,使用 ifconfig 命令可以显示或配置网络设备,使用 ethtool 查询及 设置网卡参数。 设置 IP 地址,查看当前网卡详情: rootfl-imx6u…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...