【快速弄懂!cookie与session】

部分资料参考于B站:https://www.bilibili.com/video/BV1qu411Z745

为什么需要session和cookie:

他们源于web系统的发展和变迁

web发展:

web1.0:

强调的是资源的共享(基本是静态资源,资源与资源之间没有联系。比如你看小说,第一章和第二章之间是不需要交互的)——http协议是一种无状态的协议

web2.0:

  • 强调的是交互(比如今天我向你借钱,明天要你还的时候你就不记得了。这就是无状态的坏处。)
  • 交互意味着有多步操作,请求和请求之间是存在依赖关系的。所以我们引入了session和cookie机制来实现状态的记录(一方面是状态记忆,一方面是数据校验。比如你欠我3000块我不能随便乱写数据,比如我随意写一个5000块,这样是不行的。所以会有数据校验不让你随便乱写)——为了解决http协议无状态的缺点,cookie不是随意生成的。

web3.0:

强调的是双赢

session与cookie的特征:

  • session和cookie都是由服务器生成的,都是用来存储特定的值(键值对应)
  • session是存储在服务器的,而cookie是会返回给客户端的。
  • 客户端(浏览器)在发送请求的时候,会自动将存活、可用的cookie封装在请求头中和请求一起发送——自行完成,不需要手动操作
  • cookie也会在客户端(浏览器)进行缓存

tip:

为什么用request不能实现封装cookie的操作实现会话维持: 从通讯的角度来讲,如果把所有发送请求的东西都看作是客户端的话。客户端和客户端之间是存在差异的,浏览器和Postman等一些工具是可以自行完成的,但是用python的request模块发送请求的时候,他是不具备封装cookie的能力的。但是你可以用session库来实现这个封装操作

SessionID(会话标识符):

  • 一般来说,SessionID会以类似于cookie的方式返回给客户端
  • SessionID是服务器用来识别、操作存储session值的对象的。
  • 一般来说,在服务器端。session的存储方式有文件方式、数据库方式。那么SessionID就是用来识别这个文件的(文件名相关)、识别数据库的某一条记录。
  • SessionID不等于session值。(类似于一把钥匙,对应的是一个seesion)
  • 客户端的cookie中总是包含SessionID,以便在每个请求中将 Session ID 发送回服务器来关联正确的会话

总结:

  • 通常情况下,sessionid会存储在服务器的session中。session是一种服务器端的机制,用于跟踪和管理与特定用户相关的状态信息。

  • 在Web应用程序中,当用户首次访问服务器时,服务器会为该用户创建一个唯一的sessionid,并将其作为session的标识符。服务器将sessionid发送给浏览器并存储在Cookie中,以便在后续的请求中将sessionid带回服务器。

  • 当浏览器发送新的请求时,它会自动将sessionid包含在HTTP请求的Cookie中。服务器使用sessionid来查找相应的session,从而恢复与该用户相关的状态信息。

  • 在session中,服务器可以存储与用户相关的数据,例如登录状态、用户首选项、购物车内容等。这些数据可以在用户的连续请求之间共享和访问,以提供一致的体验和个性化功能。

对于服务器:

服务器将 Session ID 与用户的会话数据关联起来,并将其存储在服务器端的会话存储区域中,以便在后续的请求中可以通过 Session ID 检索和识别用户的会话数据。

对于客户端:

客户端的浏览器通常会将 Session ID 存储在 cookie 中,并在后续的请求中自动发送给服务器,以便服务器可以识别和关联正确的会话数据。Web 应用程序可以使用 Session ID 来跟踪用户的登录状态、维护用户的会话状态和数据,以及提供个性化的功能和服务。

session与cookie的生命周期:

cookie的生命周期:

受两个因素影响:

  • cookie自身的存活时间,是服务器生成cookie时去设定的。(你可以把cookie理解为一张优惠券,这个券是有时间限制的)
  • 客户端是否保留了cookie。客户端是否保留cookie,只对客户端自身有影响,对其他封包工具是没有影响的(相当于自动携带优惠券,但是要是你客户端扔了也就没了。而且优惠券没了,别人捡起来一样可以用)

session的生命周期:

受两个因素影响:

  • 服务器对于session对象的保存的最大时间的设置(一般是1440秒)
  • 客户端进程是否关闭(session是直接绑定进程写在内存里面的)。客户端进程关闭,只对客户端自身有影响,对其他封包工具是没影响的
  • cookie和session都是有其作用域的(一般是根域)

set-cookie:

  • 当服务器要创建或更新一个会话时,它通常会使用 Set-Cookie 标头将SessionID和相关cookie数据传回给客户端。
  • 客户端的浏览器接收到这个标头后,会将SessionID存储在本地的 cookie 中。
  • 实际的会话数据通常不存储在 Set-Cookie 标头中,而是存储在服务器端的会话存储区域中,如内存、数据库或其他持久化存储中。服务器使用会话标识符来查找和检索相关的会话数据(相当于一把钥匙),从而实现对会话状态和数据的管理。

其他:

服务端和客户端都可以对 cookie 进行操作

服务端:

服务端可以通过发送 HTTP 响应头中的 Set-Cookie 标头来创建、修改或删除客户端的 cookie。服务器可以设置 cookie 的属性,如名称、值、过期时间、域名、路径等,并在之后的请求中自动发回给服务器

客户端:

客户端(通常是浏览器)可以通过 JavaScript 或浏览器提供的相关 API 来对 cookie 进行操作。常见的操作包括创建新的 cookie、读取 cookie 值、修改 cookie 的值、设置 cookie 的过期时间等。客户端可以使用 document.cookie 属性或相关的浏览器 API(如 document.cookie 和 Document.cookie)来访问和操作 cookie。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如桃花来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值