cookie、session、token的区别是什么

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

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

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

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

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

2.什么是 cookie?
cookie 是曲奇饼,甜点的意思,这里不得不提到一个前雇员,故事简略说就是,发明这个人的是一个公司的前雇员,这个公司待遇比较好,每天都会有定时的甜点,饮料等吃的,可以给每个雇员免费品尝,而这个前雇员特别喜欢公司里 的甜点,每次都吃的好多好多,后来…取名cookie 技术的由来就来啦。
cookie 是保存在客户端或者说浏览器中的一小块数据,大小限制大致在 4KB 左右,在以前很多开发人员通常用 cookie 来存储各种数据,后来随着更多浏览器存储方案的出现,cookie 存储数据这种方式逐渐被取代,主要原因有如下:

  • cookie 有存储大小限制,4KB 左右。
  • 浏览器每次请求会携带 cookie 在请求头中。
  • 字符编码为 Unicode,不支持直接存储中文。
  • 数据可以被轻易查看。

cookie 主要有以下属性:

属性名称属性含义
-name--value-
-value--cookie 的值-
commentcookie 的描述信息
domain可以访问该 cookie 的域名
expirescookie 的过期时间,具体某一时间
maxAgecookie 的过期时间,比如多少秒后 cookie 过期。
pathcookie 的使用路径,
securecookie 是否使用安全协议传输,比如 SSL 等
versioncookie 使用的版本号
isHttpOnly指定该 Cookie 无法通过 JavaScript 脚本拿到,比如 Document.cookie 属性、XMLHttpRequest 对象和 Request API 都拿不到该属性。这样就防止了该 Cookie 被脚本读到,只有浏览器发出 HTTP 请求时,才会带上该 Cookie。

我们介绍了 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,那么它们是可以在一级域名和二级域名之间共享的。

3.什么是 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 都是结合着来用,当然你也可以单独只使用 cookie 或者单独只使用 session,这里我们就将 cookie 和 session 结合着来用。

我们可以在修改一下整个请求过程图,如下所示:

在这里插入图片描述

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

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

  • session 比 cookie 更加安全,因为它是存在服务端的,cookie 是存在客户端的。
  • cookie 只支持存储字符串数据,session 可以存储任意数据。
  • cookie 的有效期可以设置较长时间,session 有效期都比较短。
  • session 存储空间很大,cookie 有限制。
    系统想要实现鉴权,可以单独使用 cookie,也可以单独使用 session,但是建议结合两者使用。

5.token 是什么?
前面我们说的 sessionId 可以叫做令牌,令牌顾名思义就是确认身份的意思,服务端可以通过令牌来确认身份。

cookie+session 是实现认证的一种非常好的方式,但是凡事都有两面
性,它们实现的认证主要有以下缺点:

  • 增加请求体积,浪费性能,因为每次请求都会携带 cookie。
  • 增加服务端资源消耗,因为每个客户端连接进来都需要生成 session,* * 会占用服务端资源的。
  • 容易遭受 CSRF 攻击,即跨站域请求伪造。
    那么为了避免这些缺点,token 方式的鉴权出现了,它可以说是一个民间的认证方式,但是不得不说它带来了非常多的好处。

token 的组成:

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

token 是如何生成的:

前面我们说 cookie 是服务端设置了 set-cookie 响应头之后,浏览器会
自动保存 cookie,然后下一次发送请求的时候会自动把
cookie 携带上。但是我们说 cookie 算是一种民间的实现方式,所以说
浏览器自然不会对它进行什么处理。token
主要是由服务器生成,然后返回给客户端,客户端手动把 token 存下
来,比如利用 localstorage 或者直接存到 cookie
当中也行。

token 认证流程:

1.客户端发起登录请求,比如用户输入用户名和密码后登录。
2.服务端校验用户名和密码后,将用户 id 和一些其它信息进行加密,生成 token。
3.服务端将 token 响应给客户端。
4.客户端收到响应后将 token 存储下来。
5.下一次发送请求后需要将 token 携带上,比如放在请求头中或者其它地方。
6.服务端 token 后校验,校验通过则正常返回数据。
用图表示大致如下:

在这里插入图片描述
总结
虽然前面解释 cookie、session、token 用了不少口舌,但是归根结底啊,它们的目的都是一样的:鉴权和认证。

鉴权认证方式特点优点缺点
cookie1.存储在客户端。2.请求自动携带 cookie。3.存储大小 4KB。1.兼容性好,因为是比较老的技术。2.很容易实现,因为 cookie 会自动携带和存储。1.需要单独解决跨域携带问题,比如多台服务器如何共享 cookie。2.会遭受 CSRF 攻击。3.存储在客户端,不够安全。
session1.存储在服务端。2.存储大小无限制。1.查询速度快,因为是个会话,相当于是在内存中操作。2.结合 cookie 后很容易实现鉴权。3.安全,因为存储在服务端。1.耗费服务器资源,因为每个客户端都会创建 session。2.占据存储空间,session 相当于存储了一个完整的用户信息。
token1.体积很小。2.自由操作存储在哪里。1.安全,因为 token 一般只有用户 id,就算被截取了也没什么用。2.无需消耗服务器内存资源,它相当于只存了用户 id,session 相当于存储了用户的所有信息。3.跨域处理较为方便,比如多台服务器之间可以共用一个 token。1.查询速度慢,因为 token 只存了用户 id,每次需要去查询数据库。

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

【曾经 我看山是山 看水是水,后来啊 我看山不是山 看水不是水…】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

空调群控、智能报警,这些设备有点牛

空调绝对是夏季使用率高的电器之一,尤其是今年全国各地高温不断,说“命都是空调给的”都不为过...... 在家的时候,我们可以随手开关空调,非常方便,如果是学校教学楼、工厂宿舍、银行网点、办公大楼、机房等地的管理者…

一个打通基于XML管理Bean

目录 准备工作 添加依赖 引入配置文件 获取bean ①方式一:根据id获取 ②方式二:根据类型获取 ③方式三:根据id和类型 ④注意的地方 ⑤扩展知识 依赖注入之setter注入 ①创建学生类Student ②配置bean时为属性赋值 ③测试 依赖注…

ChatGPT搭建AI网站实战

1.概述 ChatGPT是一款基于GPT-3.5架构的大型语言模型,它能够进行自然语言处理和生成对话等任务。作为一款智能化的聊天机器人,ChatGPT有着广泛的应用场景,如在线客服、智能助手、个性化推荐等。今天笔者给大家分享一下如何使用ChatGPT的API模…

开发环境搭建和创建STM32工程

目录 一、开发环境搭建 1. STM32CubeMX 2.Keil安装 二、创建STM32工程 一、开发环境搭建 1. STM32CubeMX ST公司出品 工具链接 https://www.st.com/zh/development-tools/stm32cubemx.html STM32CubeMX是一种图形工具,通过分步过程可以非常轻松地配置STM32微控制器和…

【IIS搭建网站】如何使用本地电脑做服务器搭建web站点并公网访问

目录 前言 Windows网页设置 Windows IIS功能设置 IIS网页访问测试 Cpolar内网穿透 下载安装Cpolar Cpolar云端设置 3.3 Cpolar本地设置 公网访问测试 结语 前言 在网上各种教程和介绍中,搭建网页都会借助各种软件的帮助,比如网页运行的Apache…

字节面试挂在2面,复盘总结了经验,决定再战一次.....

先说下我基本情况,本科不是计算机专业,现在是学通信,然后做图像处理,可能面试官看我不是科班出身没有问太多计算机相关的问题,因为第一次找工作,字节的游戏专场又是最早开始的,就投递了&#xf…

算法修炼之练气篇——练气十八层

博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的…

轻松搭建冒险岛服务器-冒险岛私服搭建详细教程

想要拥有一个属于自己的冒险岛世界吗?想要一步步学习如何架设冒险岛服务器吗?本文将从如何选择服务器、安装系统、配置环境、搭建数据库、部署网站、上传文件、启动服务等8个方面,一步步为大家详细讲解冒险岛架设教程。让你轻松打造属于自己的…

Git常用操作:基础命令、生成公钥、webhook同步

这里写目录标题 下载安装GIT基础命令克隆初始化与仓库建立连接下拉代码提交代码清空本地缓存 本地生成GIT公钥webhook(本地-码云-服务器代码同步) 下载安装GIT 此处只介绍windows系统下的安装,linux一般都是自带git(自行百度&…

Centos7安装Docker

0.安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道…

Java设计模式 14-访问者模式

访问者模式 这个模式用的很少,《设计模式》的作者评价为: 大多情况下,你不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了 一、测评系统的需求 1)将观众分为男人和女人,对歌手进行测评&…

多态与虚函数

多态与虚函数 多态的引入多态与虚函数多态编译时多态运行时多态 多态的原理静态联编和动态联编 多态的引入 学过C继承的话应该都知道在继承中存在一种菱形继承,假设存在一个类(person),其派生出两个子类,分别是studen…

ArcGIS栅格重采样与算法选择

本文介绍在ArcMap软件中,实现栅格图像重采样的具体操作,以及不同重采样方法的选择依据。 首先,如下图所示,是我们待重采样的栅格图像的属性界面。其中,可以看到此时栅格像元的边长为0.4867左右(由于图层是地…

【爬虫逆向】Python加密算法大揭秘:应用场景与实现技巧

前言:​ 在我们进行js逆向的时候. 总会遇见一些我们人类无法直接能理解的东西出现. 此时你看到的大多数是被加密过的密文.今天在这里教大家各种加密的逻辑。 Python助学大礼包点击跳转获取 目录 一、一切从MD5开始二、URLEncode和Base64三、对称加密四、非对称加密…

JS逆向 -- 分析某站aid、cid、w_rid和sid的加密过程

接上节课内容 JS逆向 -- 分析某站buvid3和_uuid的加密过程 JS逆向 -- 分析某站b_lsid值加密过程 一、清除cookie信息,刷新网页,ctrlf搜索sid,这样找到的数据是在url里或者响应信息里面,全局搜索找到的一般都是在js里面的数据&a…

Linux实操篇---常用的基本命令4(磁盘查看和分区类)

一、磁盘查看和分区类 du查看文件和目录占用的磁盘空间 du:disk usage 磁盘占用情况 基本语法: du 目录/文件 显示目录下每个字母里的磁盘使用情况选项说明: 选项功能-h以人们较易阅读的GBytes,MBytes,KBytes等…

【AIGC】阿里云服务器配置stable-diffusion-webui

阿里云服务器部署SD全流程, 正在更新!!! 购买阿里云实例开始部署开始运行安装插件中文插件从civitai上下载模型, 加载并利用其绘图 购买阿里云实例 我感觉应该不止我一个,点进阿里云的官网后,发现里面的内容太多&…

C++ 仿函数(一)

目录 一、仿函数是什么? 二、仿函数的特点 1.仿函数在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值 2.仿函数超出普通函数的概念,可以有自己的状态 ​编辑3.仿函数可以作为参数传递。 三、谓词 一元谓词示例&a…

Azure API 管理缺陷突出了 API 开发中的服务器端请求伪造风险

微软最近修补了其 Azure API 管理服务中的三个漏洞,其中两个漏洞启用了服务器端请求伪造 (SSRF) 攻击,这些攻击可能允许黑客访问内部 Azure 资产。 概念验证漏洞用于突出开发人员在尝试为自己的 API 和服务实施基于黑名单的限制时可能犯的常见错误。 W…

4月更新 | Visual Studio Code Python

我们很高兴地宣布2023年4月版 Visual Studio Code 的 Python 和 Jupyter 扩展现已推出! 此版本包括以下改进: Data Wrangler 可供 Visual Studio Code Insiders 使用移动符号重构Create Environment 按钮嵌入依赖文件扩展作者的环境 APIPython 环境的内…