首页 > 其他分享 >cookie,session,token它们到底是怎么一回事?一篇文章,彻底明白!

cookie,session,token它们到底是怎么一回事?一篇文章,彻底明白!

时间:2024-07-02 17:55:58浏览次数:20  
标签:请求 Session 用户 token session cookie Cookie 服务器

前言

web1.0强调的是资源的共享:http协议是无状态的

web2.0强调资源的交互:为了防止信息被篡改,请求与请求之间就涉及到了身份的验证

web3.0强调共赢

cookie

cookie是一种客户端存储技术

cookie的产生背景与HTTP协议的无状态特性密切相关。HTTP协议本身无法识别两个请求是否来自同一个浏览器,也无法记住用户之前的活动或状态。为了解决这个问题,需要一种机制来在客户端和服务器之间保持状态,这就是cookie技术诞生的初衷。通过使用cookie,服务器可以在用户的浏览器上存储一些信息,以便在用户进行后续请求时,服务器能够识别并记住用户的状态和偏好。

cookie的运行机制

首先客户端向服务器发起HTTP请求

然后服务器收到请求后处理请求,并在响应数据的响应头中添加上一个cookie响应回客户端

客户端接收到响应后把cookie存储到本地浏览器中

然后在以后的请求中都会自动的携带这个cookie以便让服务器知道我是谁(确认身份)

然后服务器识别请求头中的cookie,服务器根据cookie中的信息,执行相应的操作,如用户认证、个性化设置等

cookie的优缺点

说完cookie的运行机制,那么接下来就分析一下cookie具有哪些优缺点

优点:

  1. 数据持久性:Cookie存储在用户的浏览器中,即使在浏览器关闭后,数据依然可以保持,直到过期或被清除。
  2. 减轻服务器负担:由于Cookie存储在客户端,因此不需要服务器资源来维护状态信息。
  3. 简单性:Cookie基于文本的轻量结构,易于使用和实现。
  4. 安全性:通过加密和安全传输技术(如SSL),可以减少Cookie被破解的可能性。
  5. 扩展性:可以通过编程控制Cookie的大小和生命周期,适应不同的应用需求。
  6. 个性化服务:网站可以根据Cookie中的信息提供个性化服务,如保存用户偏好设置。

缺点: 

  1. 大小和数量限制:每个Cookie的大小通常限制在4KB左右,每个域名下的Cookie数量也有限制,通常是20个。
  2. 安全性问题:如果Cookie被拦截或篡改,可能会泄露用户的会话信息。
  3. 用户配置限制:有些用户可能会禁用浏览器接受Cookie的功能,这会限制Cookie的使用。
  4. 不适合存储复杂数据:由于大小和格式的限制,Cookie不适合存储复杂的数据类型。
  5. 每次HTTP请求都会发送:Cookie会在每次HTTP请求中发送,这可能会增加不必要的网络流量和响应时间。
  6. 不能跨域请求:cookie不支持跨域之间的请求,所以在不同域中,cookie无法使用,仍然存在问题

 session(会话管理机制):

Session是一种服务器端的存储机制

本质上session还是基于cookie技术来实现的,无非就是session照比cookie增加了一个session ID,你客户端向我服务端发送请求时,我服务端自动的生成一个session保存到我服务端,并且我返还给你客户端一个sessionID,下次客户端再向我发送请求时,会自动的携带上这个sessionID,然后我拿到这个sessionID后,就在我服务端的session中去检查是否存在这样的sessionID,如果有,那么就证明你的身份是对的,我给你放行,如果没有,那就证明你是伪造的sessionID,我就不给你放行,你也就访问不了我数据库中的数据,这样一来,就比cookie的安全性又强了一个等级,但是,也有不好的地方,因为是基于cookie来升级的技术,所以底层的cookie面临的跨域问题,session自然也存在,另外就是,后端要有一个足够大的空间来存储成千上百万个session数据,这样一来,就又多了一大笔开销,而且不同域名之间的请求也不方便。

session的运行机制

首先用户通过浏览器向服务器发送请求,请求可能包含登录信息。然后服务器接收到请求后,就开始验证用户的登录信息。如果用户验证成功,服务器会创建一个新的Session,并生成一个唯一的Session ID。服务器将Session ID发送给用户的浏览器,通常这个ID会存储在Cookie中,但也可以作为URL参数或隐藏表单字段发送。服务器在内存或数据库中存储Session数据,这个数据与Session ID关联。用户在进行后续请求时,浏览器会自动将存储的Session ID发送给服务器(如果存储在Cookie中)。服务器通过接收到的Session ID识别用户的Session,并获取关联的数据。服务器根据Session中的数据来处理用户的请求,例如,如果用户已经登录,服务器可以提供相应的用户界面或数据。服务器可能在处理请求的过程中更新Session数据,例如更新用户的最后活动时间。Session通常有一个过期时间,当用户长时间不活动或显式登出时,Session会被销毁。服务器和浏览器都可以在适当的时候销毁Session,通常是通过设置Session ID为无效或删除存储在浏览器端的Session ID。

session的优缺点:

优点:

  1. 安全性:与Cookie相比,Session数据存储在服务器端,因此更难被用户或第三方访问和篡改。
  2. 存储容量:Session理论上没有大小限制,可以存储大量数据,适合需要存储复杂或大量信息的场景。
  3. 灵活性:服务器可以灵活地控制Session的生命周期和内容,包括创建、更新和销毁Session。
  4. 个性化体验:网站可以根据Session中存储的用户信息提供个性化的用户体验。
  5. 跨设备支持:Session不依赖于客户端浏览器的设置,即使用户禁用了Cookie,Session仍然可以正常工作。

缺点:

  1. 服务器资源:Session数据存储在服务器端,因此会占用服务器的内存或存储资源,尤其是在高并发的情况下。
  2. 扩展性问题:在分布式系统中,Session共享和管理可能会变得复杂,需要额外的配置和优化。
  3. 性能影响:每次用户请求都需要在服务器上查找和验证Session,可能会对服务器性能产生一定影响。
  4. Session丢失:如果用户关闭浏览器或Session过期,Session数据将丢失,需要重新登录或重新创建Session。
  5. 跨域限制:Session通常与创建它的域绑定,不能跨域使用,除非通过一些技术手段实现跨域Session共享。

token (令牌机制)

cookie和session都解决了一些问题,但是也重新引入了更复杂的问题,经过前两种技术手段的锤炼,token令牌技术的诞生绝对是一个开天辟地的事,我直接最精炼的说一下token的机制

你客户端向我服务端发送请求,我对携带过来的登录信息进行编码和签名,生成一个包含用户信息和有效期限的JWT响应给你,我服务器不需要存储任何信息,下次你再向我发送请求时,服务器验证JWT的签名,如果有效,根据JWT中的信息处理请求

JWT的结构

一个JWT实际上由三部分组成,用点(.)分隔:

  1. Header(头部):描述了令牌的元数据,如使用的签名算法等。

    • 通常格式为:{"alg": "HS256", "typ": "JWT"}
  2. Payload(负载):包含了所谓的Claims(声明),即关于实体(通常是用户)和其他数据的声明。

    • 例如:{"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
  3. Signature(签名):用于验证消息在传输过程中未被篡改,并且,对于使用私钥签名的令牌,可以验证发送者的身份。

    • 签名通过使用Header中指定的算法和密钥生成。

JWT的优点:

  • 安全性:JWT可以通过使用强加密算法进行签名,确保数据不被篡改。
  • 简单性:JWT是JSON格式,易于理解和实现。
  • 无状态和可扩展性:由于不需要服务器存储会话信息,JWT适合大规模分布式系统。

JWT的缺点:

  • 性能:JWT通常比传统的会话Token更大,可能会增加请求/响应的大小。
  • 安全性:如果JWT被截获,由于它是自包含的,攻击者可以获取其中的所有信息,除非使用HTTPS。
  • 刷新机制:JWT一旦签发,其内容就固定了,如果需要刷新,必须重新颁发新的JWT。

标签:请求,Session,用户,token,session,cookie,Cookie,服务器
From: https://blog.csdn.net/weixin_73928401/article/details/140098737

相关文章

  • 保存到redis中的token乱码了
    示图:原因是缓存保存到redis需要序列化操作,没有序列化会出现这样的问题序列化redis第一步:packagecom.abliner.test.configure.redis;importcom.fasterxml.jackson.annotation.JsonAutoDetect;importcom.fasterxml.jackson.annotation.PropertyAccessor;importcom......
  • 自动化(爬虫)工具 DrissionPage SessionPage模式 API介绍 使用笔记(三)
    自动化(爬虫)工具DrissionPageSessionPage模式API介绍使用笔记(三)目录启动驱动启动配置常用方法(API)启动最简单的启动方式,更多启动方式见这里fromDrissionPageimportSessionPage#session_or_options:Session对象或SessionOptions对象#timeout:超时时间(秒)o......
  • net core 中如何使用session
    原文链接:https://zhuanlan.zhihu.com/p/6373955031,在ConfigureServices方法里加入services.AddSession()配置publicvoidConfigureServices(IServiceCollectionservices){services.AddSession();} 2,在Configure里介入app.UseSession()配置注意app.UseSession();这句要......
  • 3、爬虫-selenium-获取用户cookie的使用
    注意这里使用的是chrom浏览器、所以要下载对应版本的chromdriver.exe工具、且放在同一文件目录下或者在电脑中设置环境变量、或者放在pycharm安装目录下的 E:\installDir\python\Scripts 路径下即可chromedriver-120.exefromseleniumimportwebdriver#webdriver.Chrom......
  • 10、爬虫-requests的使用-session()、防盗链
    #会话-cookie的使用requests.session()"""先登录网站、找到llogin相关的url得到cookie、拿到formatData中的信息带着cookie去请求url使用cookie去访问(session-会话)该网站其它内容的时候都会带着cookie"""importrequests#创建会话session=requests.session()#用户......
  • 339 Refresh Tokens 01(生成RefreshToken)
    步骤1、appsettings.json"Jwt":{"Issuer":"http://localhost:7221","Audience":"http://localhost:4200","EXPIRATION_MINUTES":1,"Key":"thisissecretkeyforjwtthisisse......
  • [Aspire] Run session could not be started
    ErrordetailsRunsessioncouldnotbestarted:failedtoconnectedtoIDErunsessionnotificationendpoint:tls:failedtoverifycertificate:x509:certificatehasexpiredorisnotyetvalidSolutionRunningthedotnetdev-certscommandsbelowtore-g......
  • JavaWeb中Session的使用
     Session的工作应用以及工作流程    在浏览器和服务器建立请求访问时,通常会在服务器中开设一个新的JSessionID,用于储存用户的数据,在服务器响应请求后,将JSessionID返回浏览器中,下一次再次进行访问时,浏览器将会直接携带JSessionID进行访问,服务器则直接以此查找Session......
  • 高效获取网站cookie
    获取网站cookie_chrome插件推荐安装chrome插件EditThisCookiehttps://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg设置插件导出格式为:“分号分隔键值对”登录某个网站gotohttps://music.163.com/#使用EditThisCooki......
  • Spring MVC 获取三个域(request请求域,session 会话域,application 应用域)对象的方式
    1.SpringMVC获取三个域(request请求域,session会话域,application应用域)对象的方式@目录1.SpringMVC获取三个域(request请求域,session会话域,application应用域)对象的方式2.Servlet中的三个域对象3.准备工作3.1创建模块,添加依赖3.2添加web支持3.3编写web.xml文......