状态管理小能手: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猿意码

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

后话 

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

autoxjs 安卓爬虫自动化

autoxjs 安卓爬虫自动化 我这里只是测试请勿用于违法的 我这里是小红书 文章目录 autoxjs 安卓爬虫自动化前言一、自动刷直播间并且抓取商品已经粉丝数量等?总结 前言 欢迎来到AutoXJS的世界,这是一个充满创新、挑战和技术探索的领域。在这个引领未来的…

Embedded-Project项目介绍

Embedded-Project项目介绍 Server后端项目后端启动连接数据库启动时可能遇到的问题架构介绍 web前端项目前端启动启动时可能遇到的问题架构介绍 前后端分离开发流程 项目地址: https://github.com/Catxiaobai/Embedded-Project Server后端项目 系统后端项目&#…

非工程师指南: 训练 LLaMA 2 聊天机器人

引言 本教程将向你展示在不编写一行代码的情况下,如何构建自己的开源 ChatGPT,这样人人都能构建自己的聊天模型。我们将以 LLaMA 2 基础模型为例,在开源指令数据集上针对聊天场景对其进行微调,并将微调后的模型部署到一个可分享的…

深入理解 Hadoop (五)YARN核心工作机制浅析

概述 YARN 的核心设计理念是 服务化(Service) 和 事件驱动(Event EventHandler)。服务化 和 事件驱动 软件设计思想的引入,使得 YARN 具有低耦合、高内聚的特点,各个模块只需完成各自功能,而模…

红帽宣布CentOS 7和RHEL 7将在2024年6月30日结束支持,企业面临紧迫的迁移压力!

2020 年红帽 (RedHat,已在 2019 年被 IBM 收购) 单方面宣布终止 CentOS Linux 的开发,此后 CentOS Linux 8 系列的更新已经在 2021 年 12 月结束,而 CentOS Linux 7 系列的更新将在 2024 年 6 月 30 日结束。 与 CentOS Linux 7 一起发布的 R…

SWM341系列之SWM34SRET6介绍

SWM341系列的介绍 本文介绍了华芯微特SWM341系列主要性能,和其系列之一的SWM34SRET6-50驱动4.3寸800*480 TFTLCD显示的例程应用。 SWM341系列性能 SWM341是一款基于ARM Cortex-M33的32位微控制器,片上包含精度为 1%以内的 20MHz/40MHz 时钟,最…

“To-Do Master“ GPTs:重塑任务管理的趣味与效率

有 GPTs 访问权限的可以点击链接进行体验:https://chat.openai.com/g/g-IhGsoyIkP-to-do-master 部署私人的 To-Do Master 教程:https://github.com/Reborn14/To-Do-Master/tree/main 引言 在忙碌的日常生活中,有效地管理日常任务对于提高生…

格式工厂怎么转换视频方向

格式工厂因为其免费、操作简单、功能齐全的多重优势,深受大家的喜欢。格式工厂具有可以转换视频、音频、去水印、转换GIF、图片转换、PDF合并、PDF转换等功能,然而在对视频进行剪辑的时候,往往会发现找不到格式工厂的转换视频方向的功能&…

影视视频知识付费行业万能通用网站系统源码,三网合一,附带完整的安装部署教程

在数字化时代,知识付费行业逐渐成为主流。人们对高质量内容的需求日益增长,越来越多的人愿意为有价值的知识和信息服务付费。为了满足这一市场需求,罗峰给大家分享一款全新的影视视频知识付费网站系统源码,为用户提供一站式的知识…

wy的leetcode刷题记录_Day74

wy的leetcode刷题记录_Day74 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间:2024-01-10 前言 目录 wy的leetcode刷题记录_Day74声明前言2696. 删除子串后的字符串最小长度题目介绍思路代码收获 64. 最小路径和题目介绍思路代码收获 63.…

查看Linux系统内存、CPU、磁盘使用率和详细信息

一、查看内存占用 1、free # free -m 以MB为单位显示内存使用情况 [rootlocalhost ~]# free -mtotal used free shared buff/cache available Mem: 11852 1250 8668 410 1934 9873 Swap: 601…

linux环境安装docker

一、Docker是什么? 当我们开发一个应用程序时,通常需要配置和安装各种软件、库和依赖项。而这些环境配置可能会因为不同的操作系统或版本而存在差异,导致应用在不同环境中运行出现问题。 Docker就像是一个集装箱,可以将应用程序及其所有依…

服务器组网方案

在当今数字化时代,服务器组网方案不仅是企业信息管理的关键,更是支撑业务运作的核心架构 。为了实现高效的数据处理和存储,服务器组网方案成为企业不可或缺的一部分。本文将深入探 讨服务器组网方案的核心要素和实施策略,明确其在…

React入门 - 04(从编写一个简单的 TodoList 说起)

继上一节我们已经对 React组件和 ”JSX语法“有了大概的了解,这一节我们继续在 react-demo这个工程里编写代码。这一节我们来简单实现一个 TodoList来更加了解编写组件的一些细节。 1、在编辑器中打开 react-demo这个工程 2、打开 index.js文件,将组件 …

NR cell配置带宽时,如何设置carrierBandwidth?

NR中带宽在38.101中有规定。 如上是FR1 38.101-1中与带宽设定有关的table,协议中根据SCS规定的传输带宽和可以配置的RB 数如上表,也就是说在实网下或者lab测试配置带宽时要根据上表内容去配置,举例如下。 如上图分别是几种带宽的配置参数&…

虽迟但到!MySQL 可以用 JavaScript 写存储过程了!

任何能用 JavaScript 来干的事情,最终都会用 JavaScript 来干 背景 不久前,Oracle 在 MySQL 官方博客官宣了在 MySQL 中支持用 JavaScript 来写存储过程。 最流行的编程语言 最流行的数据库。程序员不做选择,当然是全都要。 使用方法 用 J…

c#自动更新升级工具

c#更新工具,wpf开发,所有windows桌面程序均可使用,基于.net 4.0,最低支持windos xp系统 更新工具优点 使用简单批量更新跨版本更新数据备份手动还原数据体积小 程序更新使用效果 使用简单 只需添加两个类,以及三个路径的指定,就可以从任何地方下载更新包,并解压到主程序目录…

哥伦比亚电影平台,影业之路的的新起点

哥伦比亚影业(英语:Columbia Pictures)作为与米高梅公司同为美国历史悠久的电影公司,其发展历程可以说是世界电影行业的缩影,从创立时的CBC电影行销公司(英语:CBC Film Sales Corporation&#…

构建自己的私人GPT-支持中文

上一篇已经讲解了如何构建自己的私人GPT,这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型,GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品,llama.cpp 不再…

Fedora Linux 中安装 nginx

Fedora 35 中安装 nginx 的方法非常简单。 运行下面的命令: sudo dnf install nginx 在提示你需要确认的地方,输入 y 后回车即可。 开机自动启动 如果你希望在你的操作系统重启的时候自动启动 nginx,请输入下面的命令: syst…