一文读懂cookie、session和token

HTTP简介

HTTP协议(超文本传输协议HyperText Transfer Protocol)是一种无状态协议,协议本身不会对发送过的请求和对应的通信状态进行持久化处理。这样的好处是可以保持HTTP协议的简单性,高效率处理大量事务。

但是随之就会出现一个问题:如何判断两个请求是否是同一个用户发起的?
往大了说就是权限问题,身份认证!

cookie

Cookie是一种存储在客户端上的小型文本文件,目的是为了辨别用户身份和进行会话跟踪。它是由服务器生成并发送给客户端的,大小通常限制在4KB左右。

cookie相关属性(键值对的形式):

属性名作用
name指定Cookie的名称
value指定Cookie的值
comment指定Cookie的描述信息
domain指定Cookie所属的域名。如果设置了domain,Cookie将只发送到来自该域的请求。这可以防止不同域名的网站访问到彼此的Cookie
expires指定Cookie的过期时间。如果设置了expires,Cookie将在指定的日期和时间后过期。如果没有设置,则Cookie将在浏览器关闭时失效
max-age指定Cookie的生存期,以秒为单位。当max-age为0时,表示立即删除Cookie;当设置为正数时,表示Cookie将在多少秒后过期
path指定了Cookie应该发送到服务器的哪些页面路径。如果设置了path,Cookie将只发送到与之匹配的路径下的请求
secure是否使用安全协议传输,比如SSL等。有助于防止Cookie被拦截或窃取
version版本号
isHttpOnly设置这个属性,Cookie将不会通过客户端脚本(如JavaScript)被访问,有助于减少跨站脚本攻击(XSS)的风险,只有浏览器发出 HTTP 请求时,才会带上该 Cookie

cookie特点:

  • 存储在客户端
  • 不可跨域,如果设置了 domain,那么可以在一级域名和二级域名之间进行共享

session

Session是一种用于存储用户会话信息的技术,在服务器端生成并存储,它允许网络应用程序在多个页面请求之间保持用户的状态和数据共享

注意:
Session通常存储在服务器的内存中,有利于数据的读取。但是,如果服务器重启或发生故障,Session数据可能会丢失。因此,一些应用程序可能会选择将Session数据进行持久化,如存储在数据库或文件系统中。

禁用cookie的情况,如何保证session机制

Session是依赖Cookie来存储sessionId的,默认情况下,如果禁用了Cookie,Session就不能使用了。另外一些客户端本身就不支持cookie。我们可以通过特殊的手段让session机制继续使用:

  • URL中携带sessionId:通过URL重写的方式将sessionId添加到所有的URL中。服务器生成sessionId后,将其作为URL的一部分传递给客户端,客户端后续的请求将sessionId携带在URL中;服务器端需要解析URL拿到sessionId,获取用户的会话状态。
  • 隐藏表单字段传递sessionId:将sessionId添加到Html表单的隐藏字段中。在每个表单中添加一个隐藏字段,用以存储sessionId;客户端提交表单时会将sessionId一块儿发送到服务器端,服务器通过解析表单拿到sessionId,获取用户的会话状态。

产生了新的问题:

  1. 代码复杂度提高
  2. 安全风险增加

cookie和session的联系与区别

联系:
cookie和session两者是通过session Id关联起来的(session Id是两者之间的桥梁)

区别:

  • cookie存储于客户端;session存储于服务器端
  • cookie适用于存储少量的,不敏感的用户数据;session适合存储大量的,需要安全保护的用户数据;也就是session更加安全
  • cookie只支持存储字符串数据;session可存储任意数据

token

token是一种认证机制,用于在客户端和服务器之间传递信息和权限

token是一串由服务器生成的字符串,它作为客户端请求的一个令牌或标识,具有权限的作用。Token的主要目的是为了减少频繁的用户名和密码验证过程,提高系统的安全性和效率。其主要由三部分组成:

  • 标头(Header):包含算法和类型,用于指定如何对有效载荷进行编码和签名。常见的算法有HMAC、RSA、SHA等。
  • 有效载荷(Payload):包含用户相关信息:用户ID,角色,权限等。用于身份验证和授权。可以是明文也可以是密文。
  • 签名(Signature):对标头和有效载荷进行签名后得到的值,用于验证token的完整性和真实性。签名通常使用私钥进行签名,并使用公钥进行验证。

session和token的区别

  • session是典型的空间换时间,每次对用户完成认证后都需要将会话信息session存储在服务器上,可能会导致:
    • 服务器重启,用户需重新认证
    • 分布式系统中如果请求到没有session的服务模块上,导致用户需重新认证
  • token就是时间换空间了,因为数学算法的唯一性,在分布式系统中每个节点都可完成认证,多个服务之间可以公用一个token,但是token校验会涉及复杂的解析和运算,在响应时间上会略逊一筹。

综上:session适用于用户量较小的web系统,通过缓存机制即可快速实现用户认证;而token适用于session无法使用的分布式系统、移动应用、小程序等。

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

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

相关文章

代码随想录算法训练营第36天(贪心算法05 ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

贪心算法 part05 435. 无重叠区间解题思路 763.划分字母区间解题思路补充 56. 合并区间解题思路不熟悉的基础语法知识 详细布置 今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。 都属于那种看起来好复杂,但一看贪心解法&#x…

【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]

阅读导航 引言一、设计模式概念(了解)二、单例模式1. 饿汉模式(1)概念(2)模拟实现(3)优缺点(4)适用场景 2. 懒汉模式(1)概念&#xff…

vue使用富文本

1、安装 cnpm install vue-quill-editor2、在main.js中引入 // 富文本 import VueQuillEditor from vue-quill-editor // require styles 引入样式 import quill/dist/quill.core.css import quill/dist/quill.snow.css import quill/dist/quill.bubble.css Vue.use(VueQuill…

cesium-球体透明

在开发的过程&#xff0c;要求cesium加载的地球透明 只是地表透明还不能满足要求&#xff0c;只加载部分区域的方式来解决的 代码如下&#xff1a; <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"…

【C++进阶08】哈希的应用(位图and布隆过滤器)

一、位图 1.1 位图的概念 面试题 给40亿个不重复的无符号整数&#xff0c;没排过序 给一个无符号整数&#xff0c;如何快速判断一个数是否在 这40亿个数中。【腾讯】 能想到的解决思路&#xff1a; 遍历&#xff0c;时间复杂度O(N)排序(O(NlogN)) 利用二分查找: logN放到哈…

centos搭建ftp踩坑记录

ftp服务器搭建参考b站视频 第1坑&#xff0c;开放端口后仍然无法连接&#xff1a; 这里不仅需要在防火墙打开20和21端口&#xff0c;还需要打开被动访问所使用的端口&#xff0c;也就是在配置文件vsftpd.conf中指定的被动访问接收端口。 pasv_enableYES pasv_min_port40000 p…

小红书论文刷新 SOTA:人体动作预测再升级,能精准到指尖

想象一下&#xff0c;你在玩一款 VR 游戏&#xff0c;准备伸手拿起一个虚拟杯子喝水。‍​​‌​‌​‎‎ 在传统的交互系统中&#xff0c;这通常需要你按下控制器上的特定按钮。但如果游戏集成了 EAI 框架&#xff0c;这一过程将变得无比自然。当你的手缓缓接近虚拟杯子时&…

数据库基础知识(一)

数据库基础知识&#xff08;一&#xff09; 一、数据库基本概念 1.1 数据 数据&#xff08;Data&#xff09;是指对客观事物进行描述并可以鉴别的符号&#xff0c;这 些符号是可识别的、抽象的。它不仅指狭义上的数字&#xff0c;而是有多 种表现形式&#xff1a;字母、文…

如何开通GitHub Copilot

GitHub Copilot 是由GitHub 和OpenAI共同开发的人工智能代码辅助工具&#xff0c;可以自动地生成高质量代码片段、上下文信息等。 通过自然语言处理和机器学习技术&#xff0c;能够通过分析程序员编写的代码、注释和上下文信息&#xff0c;自动生成代码&#xff0c;减轻程序员的…

在线摸头GIF生成系统源码

在线摸头GIF在线生成器html网页源码&#xff0c;可以点击选择文件按钮&#xff0c;或者直接将图片拖入&#xff0c;即可生成导出

Python爬虫---Scrapy框架---CrawlSpider

CrawlSpider 1. CrawlSpider继承自scrapy.Spider 2. CrawlSpider可以定义规则&#xff0c;再解析html内容的时候&#xff0c;可以根据链接规则提取出指定的链接&#xff0c;然后再向这些链接发送请求&#xff0c;所以&#xff0c;如果有需要跟进链接的需求&#xff0c;意思就是…

Code - VQ-VAE (Vector Quantised Variational AutoEncoder) 的实现源码

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135936848 VQ-VAE&#xff0c;即Vector Quantized Variational AutoEncoder&#xff0c;向量量化变分自编码器。VQ-VAE 的创新之处是引入了一个向…

ArcGIS学习(二)属性表的基本操作

ArcGIS学习(二)属性表的基本操作 1.查看属性表 ArcGIS是处理空间数据的平台。对于空间数据,大家可以理解成它是由两个部分构成:1.一个是空间形体,也就是点、线、面三种。线又可以分为直线、曲线,面又分为圆形、正方形、不规则形体等;2.另外一个部分是空间形体所附带的…

Unix/Linux上的五种IO模型

a.阻塞 blocking 调用者调用了某个函数&#xff0c;等待这个函数返回&#xff0c;期间什么也不做&#xff0c;不停的去检查这个函数有没有返回&#xff0c;必须等这个函数返回才能进行下一步动作。 注意&#xff1a;阻塞并不是函数的行为&#xff0c;而是跟文件描述符有关。通…

离谱题 3236:练39.1 书香阁座位

3236正常写法 #include<bits/stdc.h> using namespace std; int main() {int sum,a,b;a1;b10;sumb;cout<<a<<" "<<b;cout<<" "<<sum<<endl;do{a;b2;sumx;cout<<a<<" "<<b<<&…

uniapp本地存储日志

uniapp本地存储日志 背景实现代码实现使用查看生成log读取 注意事项尾巴 背景 我们的APP开发完成之后&#xff0c;在我们测试环境或者自测的时候都好好的&#xff0c;但是发布到生产环境客户使用总会出现一些奇奇怪怪的问题。这时候因为没在开发环境&#xff0c;我们无法查看到…

力扣hot100 买卖股票的最佳时机 贪心 经典题

Problem: 121. 买卖股票的最佳时机 文章目录 思路复杂度Code 思路 假设今天卖出&#xff0c;那怎么样收益最大呢&#xff1f;之前买入价是最低的 复杂度 ⏰ 时间复杂度: &#xff1a; O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) Code class Solut…

c++之IO流

1.C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键 盘)读取数据&#xff0c;并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。 注意宽度输出和精度输出控制。C语言借助了相应的缓…

tsmc12: m0po max length问题(H384.M0_PO.L.1)

更多学习内容请关注「拾陆楼」知识星球 拾陆楼知识星球入口 在pt eco之后会有一些m0po max length问题出现,大部分问题都可以通过替换decap来解决,少部分由于局部density过高,需要手动调整。

2023强网杯复现

强网先锋 SpeedUp 要求2的27次方的阶乘的逐位之和 在A244060 - OEIS 然后我们将4495662081进行sha256加密 就得到了flag flag{bbdee5c548fddfc76617c562952a3a3b03d423985c095521a8661d248fad3797} MISC easyfuzz 通过尝试输入字符串判断该程序对输入字符的验证规则为9…