状态管理小能手:Cookie 和 Session

news2025/2/23 3:54:44

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.coloradmin.cn/o/1370812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数字图像处理】水平翻转、垂直翻转

图像翻转是常见的数字图像处理方式,分为水平翻转和垂直翻转。本文主要介绍 FPGA 实现图像翻转的基本思路,以及使用紫光同创 PGL22G 开发板实现数字图像水平翻转、垂直翻转的过程。 目录 1 水平翻转与垂直翻转 2 FPGA 布署与实现 2.1 功能与指标定义 …

SSM 基础知识点

1. IoC IoC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在 Java 开发中,IoC 意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 谁控制谁,控制什么&…

Linux网络配置

一、查看网络配置 1、查看网络接口信息ifconfig 1.查看所有活动的网络接口信息 2.查看指定网络接口信息 ifconfig 网络接口 ifconfig -a #显示所有活动及非活动的连接 ifconfig网络接口 ifconfig -a #显示所有活动及非活动的连接 主机的网络接口卡(网卡)通常称为网络接口…

QT上位机开发(动态添加控件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 开发界面的时候,大多数情况下,我们都是推荐优先使用designer来进行界面开发。但凡事总有例外,如果控件本身数量…

C#编程-实现在文本文件中的读和写

实现在文本文件中的读和写 Stream类用于从文本文件读取数据和向文本文件写入数据。它是一个抽象类,支持向流读写字节。如果文件的数据仅是文本,那么您可以使用StreamReader类和StreamWriter类来完成相应的读和写任务。 StreamReader类 StreamReader类继承自从抽象类TextRea…

扩展边界opencv

扩展图像的边缘(如上边增加50像素)通常是通过添加额外的像素行来实现的 使用cv2.copyMakeBorder函数 valueborder_color指定了边框的颜色 import cv2 import numpy as np# 读取图像 image cv2.imread(th.jpg)# 设置边框宽度 top_border_width 50 # …

三、nginx代理功能

目录 SQUID代理服务器配置安装squid编辑squid配置文件 定义拒绝访问启动squid服务 linux客户端配置linux客户端配置正向代理测试http代理服务器上查看日志/var/log/squid/access.log windows 也可以配置网页代理 SQUID代理服务器配置 安装squid yum install squid -y 编辑squ…

Hive基础知识(六):Hive 配置运行日志信息、打印当前库和表头、参数配置方式

1. Hive 运行日志信息配置 1)Hive 的 log 默认存放在/tmp/atguigu/hive.log 目录下(当前用户名下) 2)修改 hive 的 log 存放日志到/opt/module/hive/logs (1)修改/opt/module/hive/conf/hive-log4j2.prop…

【GNN 1】PyG实现图神经网络,完成节点分类任务,人话、保姆级教程

我们来做一个节点分类的任务,选择的数据集是Karate Club,Karate是空手道的意思,所以这就是一个空手道俱乐部的数据。 简而言之,这个数据集,包含34个节点,156条无向无权边,结点总共分为4类&…

AI绘画:Midjournety的使用体验

今天的时间少,没有给大家做一些教程,就单纯分享使用体验,还不错,体验感很好。 后需如果有需要,我可以出一些教程类的视频。 下面是一组复刻fated的saber的一组提示词,效果相当不错。我后续会分享一些学习经…

uniapp自定义顶部导航并解决打包成apk后getMenuButtonBoundingClientRect方法失效问题

需求:要在app上的顶部导航提示哪里添加一些东西进去,用uniapp自带的肯定不行啊,所以自定义了所有的页面的顶部导航,之后自定义后用手机调试发现 uni.getMenuButtonBoundingClientRect()这个方法的top获取不到....网上找了很多种方…

基于 InternLM 和 LangChain 搭建你的知识库

基于 InternLM 和 LangChain 搭建你的知识库 大模型开发范式LLM的局限性:RAG 检索增强生成 LangChain简介构建向量数据库搭建知识库助手Web Demo部署环境配置下载 NLTK 相关资源下载本项目代码 大模型开发范式 LLM的局限性: 知识实效性受限&#xff1a…

模型\视图一般步骤:为什么经常要用“选择模型”QItemSelectionModel?

一、“使用视图”一般的步骤: //1.创建 模型(这里是数据模型!) tabModelnew QSqlTableModel(this,DB);//数据表 //2.设置 视图的模型(这里是数据模型!) ui->tableView->setModel(tabModel); 模型种类: QStringListModel…

vue element plus Typography 排版

我们对字体进行统一规范,力求在各个操作系统下都有最佳展示效果。 字体# 字号# LevelFont SizeDemoSupplementary text12px Extra SmallBuild with ElementBody (small)13px SmallBuild with ElementBody14px BaseBuild with ElementSmall Title16px MediumBuild w…

了解不同方式导入导出的速度之快

目录 一、用工具导出导入 Navicat(速度慢) 1.1、导入: 共耗时: 1.2、导出表 共耗时: 二、用命令语句导出导入 2.1、mysqldump速度快 导出表数据和表结构 共耗时: 只导出表结构 导入 共耗时&…

Linux 网络层收发包流程及 Netfilter 框架浅析

1. 前言 本文主要对 Linux 系统内核协议栈中网络层接收,发送以及转发数据包的流程进行简要介绍,同时对 Netfilter 数据包过滤框架的基本原理以及使用方式进行简单阐述。 内容如有理解错误而导致说明错误的地方,还请指正。如存在引用而没有添…

怎样的摆渡系统,能实现安全可管控的跨网数据传输?

大数据时代,数据在流通与传输的过程中,更需要注意到数据的安全防护,护航数据价值。“让数据主宰一切的隐忧”,数字战争的时代,各国早已认识到网络安全愈发重要,数据也成为各国发展的重要武器。 出于安全性和…

vmware虚拟机内存异常占用问题一例

关键词 vmware esxi、hypervisor虚拟化平台内存模式 Guest virtual memory 一、问题现象 业务一台vmware虚拟机出现内存使用率告警,运维人员登录系统检查内存确实高水位状态 检查各进程使用内存不高,合计内存总数与使用率占用情况明显不匹配&#xf…

面试题:什么是雪花算法?啥原理?

SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。 其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的,后面的代码中有详细…