Cookie,Session,Token的区别是什么?

概念

Cookie、Session和Token是用于在Web应用程序中管理用户状态和身份验证的技术。因为在Web应用中,HTTP的通信是无状态的,每个请求都是完全独立的,所以服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。
Cookie是由服务器发送给用户浏览器的小型文本文件,存储在客户端的浏览器中。它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。服务器可以读取Cookie并使用其中的信息来进行识别和个性化处理。

每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的。cookie 是不可跨域的,并且每个域名下面的Cookie的数量也是有限的,

Session是在服务器端创建和管理的一种会话机制。当用户首次访问网站时,服务器会为该用户创建一个唯-的Session ID,通常通过Cookie在客户端进行存储。会话标识符在后续的请求中用于标识具体是哪个用户。通常情况下,session 是基于cookie 实现的,session 存储在服务器端,sessionld 会被存储到客户端的cookie 中。

Cookie 和 Session 的区别

  1. 存储位置不同: Session 是存储在服务器端的,Cookie 是存储在客户端的。
  2. 安全性不同:因为Session存储在服务器端,所以Session 比 Cookie 安全。需要将其
  3. 存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据转换成字符串,Session 可以存任意数据类型。
  4. 有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。
  5. 存储大小不同: 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于Cookie,但是当访问量过多,会占用过多的服务器资源。

有了cookie和session之后,基本可以实现用户的各种验证、鉴权及身份识别了。但是,还是有一些场景中,不是特别适合这两种方案,或者说这两种方案的话还不够,那么就需要token上场了。

Token也是一种用于用户身份鉴权的手段。他其实是一种代表用户身份验证和授权的令牌。在Web应用程序中,常用的身份验证方案是基于令牌的身份验证(Token-basedAuthentication)。当用户成功登录时,服务器会生成一个Token并将其返回给客户端。客户端在后续的请求中将Token包含在请求头或请求参数中发送给服务器。服务器接收到Token后,会进行验证和解析,以确定用户的身份和权限。Token通常是基于某种加密算法生成的,因此具有一定的安全性。

主要由以下几个场景:

  1. 跨域请求:Cookie是不支持跨域的,当在不同的域名之间进行通信时,使用Token可以更方便地在跨域请求中传递身份验证信息,而不受Cookie限制。
  2. 分布式场景:Session是存储在服务器上的,但是随着现在很多都是集群部署,这就使得Session也需要实现分布式Session,而如果能用Token的话,就可以不用这么复杂。
  3. API交互:当我们使用浏览器访问后端服务的时候,可以用cookie和session,但是如果是API调用,比如Dubbo交互,就没办法做cookie的存储和传递了,而使用Token是常见的身份验证方式。客户端通过提供Token来证明其身份,并获得对受保护资源的访问权限。
  4. 跨平台应用程序:Token可以轻松地在不同的平台和设备之间共享和传递,而无需依赖特定的会话机制或Cookie支持,
  5. 前后端分离项目:现在很多项目都是前后端分离的了,这种项目中,前端和后端之间通过API的方式交互,这种的话用Token也会更加方便一些。

总之,因为Cookie和Session存在各种限制,所以Token也是目前常见的身份验证和状态管理方式,它具有更大的灵活性和适用性,特别适用于现代的应用程序架构和需求。它提供了一种无状态、可扩展和安全的身份验证和授权机制。
而且,有了token之后,还可以基于Token做防重检测。

扩展

1、不用Cookie如何实现Session

Cookie是实现Session的主要手段,但是有些场景中是不能使用的,比如有的浏览器可以禁用cookie,或者某些网站的cookie数量也有限制,而且跨域场景也不能用cookie。所以,如果不能用cookie,那么改如何实现session呢?

首先就是可以将SessionID作为查询参数附加在URL中。例如http://www.aaa.com?sessionid=xxx。服务器会解析URL中的Session ID,并使用它来识别和恢复用户的会话状态。这种方式在某些情况下可以工作,但也存在一些安全性和隐私方面的考虑。

其次,也可以在页面的在表单中添加一个隐藏字段来存储SessionID。当用户提交表单时,会话标识符会随着请求一起发送到服务器。服务器接收到请求后,从隐藏字段中提取SessionID,并使用它来识别和恢复会话状态。这种方法通常用于Web应用程序中的表单提交和POST请求。

2、怎么实现分布式Session?

在分布式系统中,我们的应用可能是以集群形式对外提供服务的,有可能出现在A服务器登录后,用户下一次访问的时候请求到B服务器,就需要有一个分布式的Sesssion来告诉B服务器用户是登录过的,并且需要拿到用户的登录信息。
在业内,实现分布式Session通常有以下几个方案:

1、客户端存储:

用户登录后,将Session信息保存在客户端,用户在每次请求的时候,通过客户端的cookie把session信息带过来。这个方案因为要把session暴露给客户端,存在安全风险。

2、基于分布式存储(最常用):

将Session数据保存在分布式存储系统中,如分布式文件系统分布式数据库等。不同服务器可以共享同一个分布式存储,通过SessionID查找对应的Session数据。唯一的缺点就是需要依赖第三方存储,如Redis、数据库等。

3、粘性Session:

这个方案指的是把一个用户固定的路由到指定的机器上,这样只需要这台服务器中保存了session即可,不需要做分布式存储。但是这个存在的问题就是可能存在单点故障的问题。

4、Session复制:

当用户的Session在某个服务器上产生之后,通过复制的机制,将他同步到其他的服务器中。这个方案的缺点是有可能有延迟。

Tomcat支持Session复制,配置方式可以参考官方文档:https://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html

Spring中也提供了对Session管理的支持--Spring Session,他集成了很多Session共享的方案,如基于Redis、基于数据库等。

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

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

相关文章

图解Vue组件通讯【一图胜千言】

Vue的每个组件都有独自的作用域,组件间的数据是无法共享的,但实际开发工作中我们常常需要让组件之间共享数据,今天我们来学习下面三种组件通信方式: 父子组件之间的通信 兄弟组件之间的通信 祖先与后代组件之间的通信 1. 父子组件…

2024年混合云:趋势和预测

混合云环境对于 DevOps 团队变得越来越重要,主要是因为它们能够弥合公共云资源的快速部署与私有云基础设施的安全和控制之间的差距。这种环境的混合为 DevOps 团队提供了灵活性和可扩展性,这对于大型企业中的持续集成和持续部署 (CI/CD) 至关重要。 在混…

PPT母版页码设置

PPT母版页码设置 一、需求介绍二、达到效果三、具体操作1. 插入页码2. 设置起始页码为03. 进入母版编辑页面4. 内容格式调整5. 删去最后一个板式的三个模块信息6. 尾页处理7. 最终效果 一、需求介绍 PPT的母版可以设定PPT的基调,且在非母版页面不会误改PPT中的固定…

【数据结构与算法】之排序系列-20240202

这里写目录标题 一、389. 找不同二、414. 第三大的数三、455. 分发饼干四、506. 相对名次五、561. 数组拆分六、594. 最长和谐子序列 一、389. 找不同 简单 给定两个字符串 s 和 t ,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添…

如何使用wireshark解析二进制文件

目录 目录 1.将已有的packet raw data按照下面格式写入文本文件中 a. Raw IP packet b. Ethernet packet 2.用wiershark导入hex文件 3.设置对应的packet类型 a. Raw IP packet b. Ethernet packet 1.将已有的packet raw data按照下面格式写入文本文件中 a. Raw IP pac…

C#代码添加脚本头

目录 前言 代码展示 前言 创建脚本的时候添加脚本的介绍 代码展示 using System.IO;/// <summary> /// 创建脚本自动添加头注 /// </summary> public class CommentFirst : UnityEditor.AssetModificationProcessor {/// <summary>/// 在资源创建生成.me…

STM32CAN2进入bus off 模式

工作遇到的问题记录 无人机CAN2整个进不了中断&#xff0c;通过查看寄存器判定出CAN节点进入了bus off mode 为何进入bus off &#xff0c;最后通过示波器看到整个CAN2总线波形就不对&#xff0c;总线出现了错误 Busoff的产生是一定是因为节点自身识别到自己发送错误&#xff…

WordPress SMTP发信避坑指南

前言 Clip_2024-01-31_19-46-18803285 10.5 KB 目前不少主题已经内置了SMTP发信功能&#xff0c;这是因为WordPress自带的mail()函数发信时基本无法发送。 但是在之前&#xff08;约2021年末&#xff09;貌似可以通过WordPress自带的函数发信&#xff0c;并且收信方提示由xxx代…

某站平台的签名算法分享

先charles抓包&#xff0c;api.xxxxxx.com域名的包 分析包 看到路径参数如下 appkey1d8b6e7d45233436&build5531000&channeldw056&mobi_appandroid&mode0&oid326052200&plat2&platformandroid&ps20&statistics%7B%22appId%22%3A1%2C%22p…

Unity Meta Quest MR 开发(三):Scene API 配置+实现虚拟与现实之间的碰撞

文章目录 &#x1f4d5;教程说明&#x1f4d5; Scene 配置⭐开启场景理解功能和应用访问空间数据的权限⭐OVRSceneManager⭐制作 Plane Prefab 和 Volume Prefab⭐运行场景⭐添加透视材质 &#x1f4d5;虚拟与现实物体的碰撞&#xff08;弹球 Demo&#xff09;&#x1f4d5;Mes…

TCP/IP协议以及TCP/IP邮件详细介绍

目录 1. TCP/IP 协议 2. 协议族 3. TCP - 传输控制协议 4. IP - 网际协议&#xff08;Internet Protocol&#xff09; 5. HTTP - 超文本传输协议(Hyper Text Transfer Protocol) 6. HTTPS - 安全的 HTTP&#xff08;HTTP Secure&#xff09; 7. SSL - 安全套接字…

LISN究竟是什么?有什么作用?

在电子领域中&#xff0c;LISN是一个充满神秘感的工具&#xff0c;常常被用于电磁兼容性测试。本文将深入探讨LISN的本质是什么&#xff0c;以及它在电子领域中扮演的关键角色。 1. 认识LISN LISN&#xff0c;全称为Line Impedance Stabilization Network&#xff0c;即线路阻…