Cookie和Session详解
Cookie和Session详解
Cookie
Cookie只存储在客服端
Cookie是什么:Cookies是web服务器存放在用户硬盘的一段文本,Cookies允许一个wen站点在用户的机器存放一些文本的信息,并可以在以后重新获取它。这个基于文本的信息存储着一些“键-值”对。
Cookie在http浏览器里面的使用过程
1.当浏览器发送请求时,它会查看你机器上跟域名www.test.com有关的Cookie文件,如果存在同www.test.com有关的 Cookie,浏览器就会把相关的Cookie“键-值”对数据跟请求一起发送到服务器(),如果不存在同www.test.com有关的 Cookie,则浏览器不发送Cookie到服务器。
http协议中,在Request Headers里面通过Cookie:PHPSESSIS=123456发送
2.服务器如果返回Cookie,浏览器会把Cookie存储在域名www.test.com有关的Cookie文件中,提供给下次请求调用
http协议中,在Response Headers里面通过Set-Cookie:PHPSESSIS=123456(名字,值,过期时间,路径和域)返回
3.当然,不是全部Cookie都会存储起来,Set-Cookie设置的过期时间
- 持久性cookie,设置了cookie的时间,以文件方式存在硬盘上
- 会话cookie,没有设置cookie时间,cookie的生命周期也就是关闭浏览器前就消失,一般不会保存在硬盘,而是保存在内存上
4.所以单纯使用Cookie不安全
Cookie其实就是键值对存储在文件中,如果一些用户名都存储在里面,只需简单修改文件里面的用户名,就可以达到模仿他人登录,所以相对不安全,当然可以通过其他手段避免,例如加密加盐
Session
Session存储在服务端(中介是Cookie或者直接url,使用url传递session_id不详说,这种使用场景比较少)
简单来说,一个请求到达的时候,服务器会先判断是否带有Session信息。如果有,则根据Session ID去数据库中查找是否具有对应的用户身份信息。此处可能会出现Session失效、非法的Session信息等可能性,那么服务器视同无Ssession信息的情况,重新的产生一个随机的字符串,并且在Http返回头中写入新的Session ID信息。另一者,如果服务器成功获取了用户的身份信息则以该身份为请求者提供服务。在http中,客服端的请求里面的session id一般是通过cookie带过来的,所以Session也依赖于cookie。
以php里面Session举例,session_start()开启
- 首先会去获取客户端cookie里的session_id,如果不存在,会重新创建一个
- 根据session_id,取到所有相关的信息,放入$_SESSION全局变量里以供使用
- 如果写session,也是根据session_id写入相关文件,并放入$_SESSION全局变量里以供使用
设置登录态的过期时间,需要设置session的过期时间以及cookie的过期时间才可以真正生效(ini_set修改)
- session.cookie_lifetime
这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废
- session.gc_maxlifetime
这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除
Cookie 和 session 传输的区别
Cookie主域名和子域名之间的共享
- 总结一下顶级域名和子级域名之间的cookie共享和相互修改、删除
- 顶级域名只能设置domain为顶级域名,不能设置为二级域名或者三级域名等等,否则cookie无法生成
- 二级域名可以设置domain为二级域名或者顶级域名
总的来说,设置cookie的话只能在本域名下或者domain级别高于自身的域名下才会生效!
- 二级域名能读取设置了domain为顶级域名或者自身的cookie,不能读取其他二级域名domain的cookie。例如:要想cookie在多个二级域名中共享,需要设置domain为顶级域名,这样就可以在所有二级域名里面或者到这个cookie的值了。
- 顶级域名只能获取到domain设置为顶级域名的cookie,domain设置为其他子级域名的无法获取。
多系统共用登录态的方法一(cookie共享)
- 在顶级域名下开启session
- 使用同一个session_id
- 必须是二级域名,不同域名不适合使用
多系统共用登录态的方法一(SSO,限制没这么多)
- 浏览器访问单点登录的网站,如果session存在就返回数据,如果不存在就跳转到cas server(一个单独域名的服务)
- 如果有已经登录过,通过检测cookie,cas server就会302跳转通过url返回Ticket(Ticket是随机且唯一)到网站,如果没有登录过,就跳转到cas server登录页面进行登录,登录成功设置cookie,然后302跳转返回Ticket到网站,同时cas server会存储改Ticket、cookie和网站host的对应关系。
- 网站接收到Ticket后通过cas server提供的校验url去校验Ticket,cas server确认后返回成功,网站写入当前域名的sessionid
- 当用户再访问网站的时候,就会判断当前session是否登录
两种登陆方式图
更多内容请关注微信公众“p12310086”,一个程序员和hr一起运营的公众号!
有趣的开发
php
推荐阅读
php实现只需要一个QQ号就可以获得用户信息
{代码...} DEMO:[链接]此处输入你的QQ号
TANKING赞 27阅读 7.3k评论 5
初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。
王中阳Go赞 4阅读 1.8k评论 2
一分钟搞明白!快速掌握 Go WebAssembly
最近因为各种奇怪的原因,更多的接触到了 WebAssembly。虽然之前很多博客也翻过写过各种文章,但总感觉欠些味道。于是今天梳理了一版,和大家一起展开学习。
煎鱼赞 4阅读 2.3k
Laravel入门及实践,快速上手ThinkSNS+二次开发
【摘要】自从ThinkSNS+不使用ThinkPHP框架而使用Laravel框架之后,很多人都说技术门槛抬高了,其实你与TS+的距离仅仅只是学习一个新框架而已,所以,我们今天来说说Laravel的入门。
ThinkSNS赞 1阅读 2.5k
悬赏任务源码+开源威客系统网站源码+部署教程
威客悬赏任务发布系统源码是用来进行日常在线任务接单处理的威客系统。系统可以用来发布或处理悬赏任务,甚至可以知道一个帐户的信息,如任务类型和处理状态等,它们很方便,易于使用,它允许雇主和威客执行快速...
火爆的筷子赞 1阅读 3.8k评论 1
我让chatGPT用PHP写一个MVC框架,不仅写出来,还能跑!
没想到写出来的框架确实挺简单的,但是又没觉得哪里不对,于是我尝试把这个框架放到服务器试试能不能跑起来,最后还真的可以跑起来,为了让大家能够看到这个框架的演示,我直接爬一个热搜,然后便于展示数据。
TANKING赞 1阅读 1.7k
开发一个全网搜索引擎的大致流程
由于对搜索引擎技术很感兴趣,便开始尝试开发一个搜索引擎。在参考了网上有限的资料后,加上自己钻研,最终开发出了一个小型的全网搜索引擎,底部有项目地址和搜索测试图片。
会飞的鸟赞 1阅读 5.8k评论 1
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。