状态管理小能手:Cookie 和 Session

1. 引言

大家好,我是小❤,一个漂泊江湖多年的 985 非科班程序员,曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。

假期抢票的尴尬事件

最近小❤在抢出行的高铁票时,发生了一件尴尬的事情。

这不是临近假期了嘛,按以往经验,抢票应该比较难。于是我通过渠道找了一牛子哥,帮忙抢票,抢票时间在第二天早上 9 点。

好巧不巧,第二天 8点多的时候正好打开了手机,就想着上 12306 去看看票。

输手机号,拿验证码,登录,一气呵成!

结果,到 9 点多的时候牛子哥给我说抢票失败了!原因竟然是中途账号被顶了,而 12306 一个账号同一时间只能让一部手机登录。

啊这?!

我还以为牛子哥用了什么高端渠道,或者是神奇 App,原来...

于是,我就趁此机会复习一下 12306 的登录机制,便有了这篇文章!

设备限制的底层逻辑

如今,网站或者手机应用限制登录设备个数已经屡见不鲜了。

不管是限制登录个数,还是保持登录状态,都和网络交互的 HTTP 协议,以及客户端和服务端的 Cookie、Session 技术息息相关

虽然咱每天都在与它们打交道,但你是否真的理解它们的原理和使用方式呢?接下来,让我们一起来揭开它们的神秘面纱吧!

2. 产生背景

我们都知道,HTTP 是一个无状态协议。

无状态是指服务端不会跟踪和记录请求,即对请求处理没有记忆能力,这意味着每个请求都是独立的。

它的优缺点分别是:

  • 优点:服务器处理请求时不需要上下文信息,因此应答很快,每一次请求都是“点到为止”,提升了请求处理的效率。

  • 缺点:缺少访问状态意味着如果后续请求和之前有关联,比如 APP 登录功能,就会导致切换 APP 页面时,就必须重传请求。

想象一下,每次在手机上切换应用,或者把应用收到后台就需要我们重新登录一次,那也太恶心了。

一般应用或者网站都会有这种登录状态:

所以,我们对登录功能的诉求是:

  • 登陆 APP 时,需要记住登录用户名密码信息,避免每次都进行用户名密码输入操作。

  • 登陆 APP 时,需要记住用户登陆的状态,避免每次都进行重复登录的操作。

除此之外,在一些其它 Web 交互场景下也需要记住状态,比如:

  • 购物车添加商品时,需要标识和跟踪某个用户,才能知道购物车里面有几本书。

于是,两种用于保持 HTTP 连接状态的技术应运而生,分别是 Cookie 和 Session。

3. Session:身份的标识符

Session,就像你的身份证一样,是一种在服务器和客户端之间传递身份信息的方式。

用户登录生成 Session 的时序图如下:

当你登录一个网站时,服务器会生成一个唯一的 SessionID,并将它存储在服务器端,然后将这个 ID 发送到你的浏览器,通常以 Cookie 的形式。

Postman 请求登录接口,响应如下:

postman请求登录接口

这个 SessionID 就像是你的通行证,每当你访问需要登录的页面时,浏览器都会将它发送给服务器。

服务器通过这个 ID 来识别你,就像保安看到你的身份证一样。

4. Cookie:保持记忆

Cookie 是一个小小的文本文件,它被存储在你的浏览器中。

正如 Cookie 本身的含义,它就像一个小甜点,作用是让服务器能够在不同的 HTTP 请求之间"记住"你。

当你登录一个网站时,服务器已经将一些信息存储在 Cookie 中,比如你的用户名或一些用户首选项。

然后,每当你再次访问这个网站时,浏览器都会将这些信息发送给服务器,这样服务器就能够"认识"你,而不需要你重新登录。

用户通过 Cookie 与应用交互的时序图如下:

通过将 SessionId 放在缓存里,每次用户交互时只要带上 Cookie,应用层就可以解析出对应的 SessionId,验证用户的身份,获取用户信息。

Postman 交互如下:

postman调用业务接口

有时,为了信息隐私,我们可以在浏览器设置不记录 Cookie。

但是,这样我们每次在页面交互时都需要重新登录,体验就会比较差。

5. Session与 Cookie 的关系

PS:这个是 Web 和后台开发面试的常考题,赶快拿小本本记下来 😄

1)联系

如上所示,Session 和 Cookie 之间有着密切的关系。

通常,服务器会将 SessionId 存储在一个 Cookie 中,并将它发送给你的浏览器或其它设备。

然后,浏览器在每次请求中都会自动包含这个 Cookie,这样服务器就能够识别你的 SessionId,从而知道你是谁。

所以,你可以将 Session 看作是服务器的身份验证标识,而 Cookie 则是浏览器/用户设备的记忆工具,用于保存一些有关你的信息。

2)区别

那么,Session和 Cookie 有什么不同呢?

访问机制

Cookie 通过检查客户端的用户“通行证”来确定用户身份,Session 检查服务器的“客户档案表”来确认用户状态。

安全程度

不法分子可能会分析存放在本地的 Cookie 进行 Cookie 欺骗,而 Session 是有人登陆或者启动某个会话时才会产生,且 Session 是加密和定时失效的,所以 Session 安全系数更高。

会话机制

简单来说,Session 的隐私度更高,因为它的数据存储在服务器端,用户无法直接修改。

而 Cookie 存储在用户的浏览器中,用户可以看到和修改它们的内容,所以不适合存储敏感信息。

使用场景方面,Session 通常用于存储用户的登录状态和其他敏感信息,而 Cookie 可以用于存储一些用户首选项或跟踪用户的行为,比如购物车中的商品。

6. 小结

登录设备限制

明白了 Cookie 和 Session 的底层逻辑,限制设备的登录个数是不是就很简单了。

我们只需要在登录时,根据账号密码,记录一下当前设备已有的 Session 数量,就可以控制登录设备的个数了。

如果要根据客户端类型去限制,比如可以允许电脑和手机同时在线,我们就可以在登录时记录用户的设备类型,以此控制每一种设备类型只能有一个 Session。

更进一步,如果基于安全考虑,我们可以在登录时记录用户的设备 Id

比如手机在通话框输入 *#06#,就可以拿到手机的唯一标识码 IMEA

每次用户用新设备登录时,需要先通过手机号或人脸验证,再记录设备的 IMEA 码,以此来保证登录设备的可靠性。

结语

Session 与 Cookie 是构建现代网站的重要组成部分。它们为用户提供了方便的登录和个性化体验,同时也保障了用户的隐私和安全。

通过深入理解这两者的原理和用法,我们可以更好地构建安全、高效的网络应用程序。

希望这篇文章让你对 Session与 Cookie 有了更清晰的认识,如果大家有任何问题或想要了解更多,请随时留言。

感谢阅读,如果有帮助的话,请点赞、关注、分享、加入在看哦!

xin猿意码

鲜衣怒码少年时,一朝看尽长安花

后话 

错过了牛子哥的抢票,只能继续捡漏了!还好,当天下午又放了一波高铁票,如愿以偿可以在节假日之前回家了~~

预祝屏幕前的各位节日快乐呀,不知道大家都抢到节日出行的票没

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

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

相关文章

WPF真入门教程26--项目案例--欧姆龙PLC通讯工具

1、案例介绍 前面已经完成了25篇的文章介绍,概括起来就是从0开始,一步步熟悉了wpf的概念,UI布局控件,资源样式文件的使用,MVVM模式介绍,命令Command等内容,这节来完成一个实际的项目开发&#…

MIB 变更周期

MIB 始终以 80 ms 的周期在 BCH 上传输并在 80 ms 内重复,并且它包括从小区获取 SIB1 所需的参数;如果 SSB 的周期大于 80 ms,则 MIB 的发送周期与 SSB 的周期相同。 在UE初始搜索时,SSB在半帧内的周期是20ms;所以对于…

鸿蒙开发基础-UIAbility内页面间的跳转

基于Stage模型下的UIAbility开发,实现UIAbility内页面间的跳转和数据传递。 创建两个页面 启动DevEco Studio,创建一个新工程。在工程pages目录中,选中Index.ets,点击鼠标右键 > Refactor > Rename,改名为Inde…

如何配置 VS Code 实现 git 密码免输入

目录 问题描述尝试过的失败方法问题分析最终采用的解决方案:利用 ssh key 提供密码免输入功能安装 git windows 命令工具在windows本地生成 ssh key将公钥安装到 git 服务器第一种方法第二种方法调试方法 参考资料: 问题描述 在 Windows 上,使用 Visual…

Redis不同环境缓存同一条数据,数据内部值不同

背景 现实中,本地环境(dev)和开发环境(feature)会共同使用相同的中间件(本篇拿Redis举例),对于不同环境中的,图片、视频、语音等资源类型的预览地址url,需要配…

Cesium笔记 初始化 使用Vue-Cesium 组件

参考 A Vue 3 based component library of CesiumJS for developers | Vue for CesiumVue for Cesium, a Vue 3.x based component library of CesiumJS for GISerhttps://zouyaoji.top/vue-cesium/#/zh-CN/component/quickstart

Spring boot 3 集成rocketmq-spring-boot-starter解决版本不一致问题

安装RocketMQ根据上篇文章使用Docker安装RocketMQ并启动之后&#xff0c;有个隐患详情见下文 Spring Boot集成 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2…

基于 SpringBoot + vue 的医院管理系统(含源码,数据库,文档)

基于 SpringBoot vue 的医院管理系统 †前后端分离思想&#xff0c;这个系统简直太棒了&#xff01;屯 光这个系统采用了 前后端分离思想&#xff0c;后端使用 SpringBoot和 SpringMVC框架&#xff0c;让代码更高效&#xff0c;更易于维护。前端则使用了 vue js 和ElementU…

竞赛保研 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

SUDA-计算机网路-期末复习提纲

写在前面 帮苏大的同学整理的计网复习材料&#xff0c;用的是他们老师划定的范围。 1.负责互联网协议开发、标准制定、地址分配的国际组织名称及其主要职责 (1) 地址支持组织&#xff08;ASO&#xff09;负责IP地址系统的管理。 (2) 域名支持组织&#xff08;DNSO&#xff09;…

实用Unity3D Log打印工具XDebug

特点 显示时间&#xff0c;精确到毫秒显示当前帧数&#xff08;在主线程中的打印才有意义&#xff0c;非主线程显示为-1&#xff09;有三种条件编译符(如下图) 注&#xff1a;要能显示线程中的当前帧数&#xff0c;要在app启动时&#xff0c;初始化mainThreadID字段条件编译符…

开源加解密库之GmSSL

一、简介 GmSSL是由北京大学自主开发的国产商用密码开源库&#xff0c;实现了对国密算法、标准和安全通信协议的全面功能覆盖&#xff0c;支持包括移动端在内的主流操作系统和处理器&#xff0c;支持密码钥匙、密码卡等典型国产密码硬件&#xff0c;提供功能丰富的命令行工具及…

在k8s集群中部署多nginx-ingress

关于ingress的介绍&#xff0c;前面已经详细讲过了&#xff0c;参考ingress-nginx详解和部署方案。本案例ingress的部署使用deploymentLB的方式。 参考链接&#xff1a; 多个ingress部署 文章目录 1. 下载ingress的文件2. 文件资源分析3. 部署ingress3.1 部署第一套ingress3.1…

日志系统一(elasticsearch+filebeat+logstash+kibana)

目录 一、es集群部署 安装java环境 部署es集群 安装IK分词器插件 二、filebeat安装&#xff08;docker方式&#xff09; 三、logstash部署 四、kibana部署 背景&#xff1a;因业务需求需要将nginx、java、ingress日志进行收集。 架构&#xff1a;filebeatlogstasheskib…

【数据库原理】期末突击(1)

有不会的题可以后台问我的哦&#xff0c;看见了就会回。 本文章主要是选择题、填空题&#xff0c;下章将更新综合题&#xff0c;祝大家期末心想事成。 一、选择题 下列关系运算中&#xff0c;&#xff08; C &#xff09;运算不属于专门的关系运算。 A&#xff0e;选择 …

Tensorflow2.0笔记 - 创建tensor

tensor创建可以基于numpy&#xff0c;list或者tensorflow本身的API。 笔记直接上代码&#xff1a; import tensorflow as tf import numpy as np import matplotlib.pyplot as plttf.__version__#通过numpy创建tensor tensor0 tf.convert_to_tensor(np.ones([2,3])) print(te…

Mysql 分割字符串,一行变多行,@rownum,mysql.help_topic

1 前言 朋友最近遇到一个比较棘手的 sql 问题&#xff0c;让我帮忙看看&#xff1a; 他有两张表 testa 和 testb &#xff0c;一个表存的日期&#xff0c;另一个表存字符串例如 2023-11-01,2023-11-02&#xff0c;如何将这两张表关联起来&#xff0c;只查 testa 表的数据&#…

<Python>PyQt5中UI界面和逻辑函数分开写的一种方式

前言 如果经常使用PyQt5这种模块来编写带UI界面的程序&#xff0c;那么很自然的就会涉及到&#xff0c;一旦程序比较大&#xff0c;UI控件多的时候&#xff0c;需要将UI和逻辑程序分离&#xff0c;这样方便管理&#xff0c;也方便维护。 配置&#xff1a; 平台&#xff1a;win…

三、yolov8训练结果查看和模型预测

训练结果查看 1、在模型训练结束后&#xff0c;如下图所示&#xff0c;找到该文件夹。 2、然后找到weights文件夹中的best.pt文件&#xff0c;这就是该数据训练后的模型。 模型预测 1、在assets文件夹下创建FPC-2文件夹&#xff0c;放入一些同类FPC预测结果。 2、和训练…

什么是活动的DWDM网络?

DWDM系统被认为是一个基于应答器的系统&#xff0c;可以帮助在数据中心互连设置中在站点之间传输大量数据。不同于无源DWDM网络&#xff0c; DWDM网络通常包括OEO、主动DWDM Mux Demux、EDFA、DCM和其他主动WDM组件&#xff0c;更适合远程传输。此外&#xff0c;主动DWDM网络还…