问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

深入讲解一下session 和cookie

发布网友 发布时间:2022-04-07 11:27

我来回答

3个回答

懂视网 时间:2022-04-07 15:48

发展史

1、很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记住是谁刚刚发了HTTP请求, 每个请求对我来说都是全新的。这段时间很嗨皮。

2、但是随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等等,马上就面临一个问题,那就是要管理会话,必须记住哪些人登录系统, 哪些人往自己的购物车中放商品, 也就是说我必须把每个人区分开,这就是一个不小的挑战,因为HTTP请求是无状态的,所以想出的办法就是给大家发一个会话标识(session id), 说白了就是一个随机的字串,每个人收到的都不一样, 每次大家向我发起HTTP请求的时候,把这个字符串给一并捎过来, 这样我就能区分开谁是谁了

3、这样大家很嗨皮了,可是服务器就不嗨皮了,每个人只需要保存自己的session id,而服务器要保存所有人的session id !如果访问服务器多了, 就得有成千上万,甚至几十万个。

这对服务器说是一个巨大的开销 , 严重的限制了服务器扩展能力, 比如说我用两个机器组成了一个集群, 小F通过机器A登录了系统, 那session id会保存在机器A上, 假设小F的下一次请求被转发到机器B怎么办?机器B可没有小F的 session id啊。

有时候会采用一点小伎俩: session sticky , 就是让小F的请求一直粘连在机器A上, 但是这也不管用, 要是机器A挂掉了, 还得转到机器B去。

那只好做session 的复制了, 把session id 在两个机器之间搬来搬去, 快累死了。

1565603049(1).png

后来有个叫Memcached的支了招:把session id 集中存储到一个地方, 所有的机器都来访问这个地方的数据, 这样一来,就不用复制了, 但是增加了单点失败的可能性, 要是那个负责session 的机器挂了, 所有人都得重新登录一遍, 估计得被人骂死。

1565603058(1).png

也尝试把这个单点的机器也搞出集群,增加可靠性, 但不管如何, 这小小的session 对我来说是一个沉重的负担。

4、于是有人就一直在思考, 我为什么要保存这可恶的session呢, 只让每个客户端去保存该多好?

可是如果不保存这些session id , 怎么验证客户端发给我的session id 的确是我生成的呢? 如果不去验证,我们都不知道他们是不是合法登录的用户, 那些不怀好意的家伙们就可以伪造session id , 为所欲为了。

嗯,对了,关键点就是验证 !

比如说, 小F已经登录了系统, 我给他发一个令牌(token), 里边包含了小F的 user id, 下一次小F 再次通过Http 请求访问我的时候, 把这个token 通过Http header 带过来不就可以了。

不过这和session id没有本质区别啊, 任何人都可以可以伪造, 所以我得想点儿办法, 让别人伪造不了。

那就对数据做一个签名吧, 比如说我用HMAC-SHA256 算法,加上一个只有我才知道的密钥, 对数据做一个签名, 把这个签名和数据一起作为token , 由于密钥别人不知道, 就无法伪造token了。

1565603067(1).png

热心网友 时间:2022-04-07 12:56

SESSION 是保存在服务器上的会话文件,
COOKIE 是保存在用户本地浏览器中的会话文件,
所谓会话文件,就是当用户访问网站时候,用来记录临时信息的文件,从而不必每一次都去读取数据库中用户的一些资料、设置等等,减轻服务器压力。
SESSION 是要依托与 COOKIE 的,每一次用户访问,浏览器会提交URL(http://,,,,)还有COOKIE的数据到服务器,然后服务器进行数据处理,根据 COOKIE 中的 SESSIONID 来读取服务器上的SESSION文件。追问我们是不是可以认为 Session 和 Cookie 是一种由浏览器搞出来的一种机制?

追答这个和浏览器无关,应该是W3C提出的吧~

热心网友 时间:2022-04-07 14:14

session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放
cookie:用来存储连续访问一个页面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。
两者都可通过时间来设置时间长短。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
水浒揭秘贞芸劫张若贞结局 阴茎的大与小有何区别? 男人的生殖气有大有小吗 穿甲弹和破甲弹哪个好 如何从外表区分尾翼稳定脱壳穿甲弹和尾翼稳定破甲弹 穿甲弹、破甲弹和碎甲弹有什么区别?介绍_穿甲弹、破甲弹和碎甲弹有... ...脱壳穿甲弹、乌金穿甲弹、破甲弹都有什么区别? 超前消费还有什么消费 成子湖面临问题 力学试验过程监测 鲁滨逊漂流记一到三十章概括 鲁滨逊漂流记 的主要内容 wow公会商人卖的传家宝能给小号吗 魔兽世界部落大号能把传家宝给联盟小号吗? 没有80的号,小号自己可以买传家宝么?现在4.2的点数是不能交易的吗? 鲁滨逊漂流记主要内容 魔兽世界我的小号5级了 还可以用传家宝吗? 传家宝能由未满级的号买么? 数控车,产品前端是球形该怎样用g71编程? 求赐教! 数控车床上怎样车球体? 数控车半圆球如何编程 数控车床怎么车球体? 淘宝卖家在未发货的状态下,买家申请退款了,会使退款率上升吗? 数控车床做半球面怎么编程序? 淘宝未发货退款要计入退款率吗 美团借款额度没有申请借款会放款吗 未发货的订单申请退款会记入退款率吗 由于以前下刚的工人工厂只给社保交15年后耒没交到退休能拿多少钱? 数控车床车100圆球该怎么编程 我在佛山工厂买了15年06个月社保然后今年退休每个月才领800元的工资是否太少? 《鲁滨逊漂流记》第1章主要内容是什么? 鲁滨逊漂流记前三章主要内容 鲁滨逊漂流记第十三章到第十九章主要内容 lumion10.3.2怎么复制成列 lumion怎么把几个object一起选中 复制 lumion怎么拉长物体 如题 就是lumion4.0 有什么办法 复制 内置模型库的模型时~不会变动 原本的模型的位置 以及方向?个 excel中颜色函数如何操作? 20*20方木多少米一方 想请教一下建筑用的方木都有哪些尺寸,长宽高一半是多少,多长?有的说是什么6X9等等,这些是什么意思呢 泡脚的生姜需要剖皮吗 怎样调word纸张一页颜色 EV 录屏PPT 录出来不是全屏,这是为什么? 我的EV录屏 每次两个小时的视频录播 都会超过 2G 有什么办法 能小点... 掌中通软件发短信如何修改编号 掌中通被上级停用了怎么回事 中通快递掌中通里面的钱提现多久到账? 自己录的视频怎么放大 掌中通充值想充话费,误充成短信怎么追回? 为什么我用优酷桌面录屏时选取录屏区域时屏幕会自动放大,我不想让他放大,就想录整个屏幕?