热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

cookie和session区别

cookie和session都是用来跟踪浏览器用户身份的会话方式。Cookie的机制Cookie是浏览器(UserAgent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能

COOKIE和session都是用来跟踪浏览器用户身份的会话方式。
 
COOKIE的机制

COOKIE是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能。

COOKIE的Domain和Path属性标识了这个COOKIE是哪一个网站发送给浏览器的;COOKIE的Expires属性标识了COOKIE的有效时间,当COOKIE的有效时间过了之后,这些数据就被自动删除了。

如 果不设置过期时间,则表示这个COOKIE生命周期为浏览器会话期间,只要关闭浏览器窗口,COOKIE就消失了。这种生命期为浏览会话期的COOKIE 被称为会话COOKIE。会话COOKIE一般不保存在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把COOKIE保存到硬盘上,关闭后再次 打开浏览器,这些COOKIE依然有效直到超过设定的过期时间。存储在硬盘上的COOKIE可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存 在内存的COOKIE,不同的浏览器有不同的处理方式。
 
Session的机制

Session 是存放在服务器端的类似于HashTable结构(每一种Web开发技术的实现可能不一样,下文直接称之为HashTable)来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。

一 般情况下,服务器会在一定时间内(默认20分钟)保存这个HashTable,过了时间限制,就会销毁这个HashTable。在销毁之前,程序员可以将 用户的一些数据以Key和Value的形式暂时存放在这个HashTable中。当然,也有使用数据库将这个HashTable序列化后保存起来的,这样 的好处是没了时间的限制,坏处是随着时间的增加,这个数据库会急速膨胀,特别是访问量增加的时候。一般还是采取前一种方式,以减轻服务器压力。
 
Session的客户端实现形式(即Session ID的保存方法)

一般浏览器提供了两种方式来保存,还有一种是程序员使用HTML隐藏域的方式自定义实现:

[1] 使用COOKIE来保存,这是最常见的方法,本文“记住我的登录状态”功能的实现正式基于这种方式的。服务器通过设置COOKIE的方式将Session ID发送到浏览器。如果我们不设置这个过期时间,那么这个COOKIE将不存放在硬盘上,当浏览器关闭的时候,COOKIE就消失了,这个Session ID就丢失了。如果我们设置这个时间为若干天之后,那么这个COOKIE会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同 样会发送到服务器上。

[2] 使用URL附加信息的方式,也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIOnID=*一样的。这种方式和第一种方式里面不设置COOKIE过期时间是一样的。

[3] 第三种方式是在页面表单里面增加隐藏域,这种方式实际上和第二种方式一样,只不过前者通过GET方式发送数据,后者使用POST方式发送数据。但是明显后者比较麻烦。
 
COOKIE与session的区别:

COOKIE数据保存在客户端,session数据保存在服务器端。

简单的说,当你登录一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上面,客户端每次请求服务器的时候会发送 当前会话的sessionid,服务器根据当前sessionid判断相应的用户数据标志,以确定用户是否登录,或具有某种权限。由于数据是存储在服务器 上面,所以你不能伪造,但是如果你能够获取某个登录用户的sessionid,用特殊的浏览器伪造该用户的请求也是能够成功的。sessionid是服务 器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性,我曾经就遇到过一次。登录某个网站,开始显示的 是自己的信息,等一段时间超时了,一刷新,居然显示了别人的信息。

 如 果浏览器使用的是 COOKIE,那么所有的数据都保存在浏览器端,比如你登录以后,服务器设置了 COOKIE用户名(username),那么,当你再次请求服务器的时候,浏览器会将username一块发送给服务器,这些变量有一定的特殊标记。服 务器会解释为 COOKIE变量。所以只要不关闭浏览器,那么 COOKIE变量便一直是有效的,所以能够保证长时间不掉线。如果你能够截获某个用户的 COOKIE变量,然后伪造一个数据包发送过去,那么服务器还是认为你是合法的。所以,使用 COOKIE被攻击的可能性比较大。如果设置了的有效时间,那么它会将 COOKIE保存在客户端的硬盘上,下次再访问该网站的时候,浏览器先检查有没有 COOKIE,如果有的话,就读取该 COOKIE,然后发送给服务器。如果你在机器上面保存了某个论坛 COOKIE,有效期是一年,如果有人入侵你的机器,将你的  COOKIE拷走,然后放在他的浏览器的目录下面,那么他登录该网站的时候就是用你的的身份登录的。所以 COOKIE是可以伪造的。当然,伪造的时候需要主意,直接copy   COOKIE文件到 COOKIE目录,浏览器是不认的,他有一个index.dat文件,存储了 COOKIE文件的建立时间,以及是否有修改,所以你必须先要有该网站的 COOKIE文件,并且要从保证时间上骗过浏览器,曾经在学校的vbb论坛上面做过试验,copy别人的 COOKIE登录,冒用了别人的名义发帖子,完全没有问题。
 
更有效的方法就是自己定义一个浏览器,我们称之为黑客浏览器,比如我们可以自己改造firefox浏览器,可以自定义sessionid,自定义 COOKIE值,那样就可以随心所欲了。网络安全又将面临严峻的挑战。
 
两个都可以用来存私密的东西,同样也都有有效期的说法,区别在于:

session是放在服务器上的,过期与否取决于服务期的设定,

COOKIE是存在客户端的,过期与否可以在COOKIE生成的时候设置进去。

1、COOKIE数据存放在客户的浏览器上,session数据放在服务器上

2、COOKIE不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE

4、单个COOKIE在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。

5、300个的限制我没听说

6、所以个人建议:

将登陆信息等重要信息存放为SESSION,其他信息如果需要保留,可以放在COOKIE中
 
实现“记住我的登录状态”的功能

前面我们了解到,如果我们将Session ID通过COOKIE发送到客户端的时候设置其过期时间为1年,那么在今后的一年时间内,客户端访问我的网站的时候都回将这个Session ID值发送到服务器上,服务器根据这个Session ID从内存或者数据库里面恢复存放Key-Value对的Hashtable。

其 实这已经很好的实现了我们的功能了。但是,前面也提到了,实际上Session并不会一直都存在的,过了一定的时间之后,服务器上的Session就被销 毁了,以减轻服务器的访问压力。当服务器上的数据被销毁后,即使客户端上存放了COOKIE也没有办法“记住我的登录状态”了。

通 用的实现办法是,将用户的用户名和加密之后的密码也通过COOKIE的方式存放在客户端,当服务器上的Session销毁以后,使用COOKIE里面存放 的用户名和加密之后的密码重新执行一次登录操作,重建Session,并更新客户端上COOKIE中存放的的Session ID,而这个操作是发生在用户请求一个需要身份验证的页面资源的背后,对于用户来讲是透明的,于是就达到了“记住我的登录状态”的目的了。


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • asp中如何嵌入python的简单介绍
    本文目录一览:1、如何在IIS中执行Python脚本 ... [详细]
  • 本文介绍了一种处理AJAX操作授权过期的全局方式,以解决Asp.net MVC中Session过期异常的问题。同时还介绍了基于WebImage的图片上传工具类。详细内容请参考链接:https://www.cnblogs.com/starluck/p/8284949.html ... [详细]
  • 从高级程序员到CTO的4次能力跃迁!如何选择适合的技术负责人?
    本文讲解了从高级程序员到CTO的4次能力跃迁,以及如何选择适合的技术负责人。在初创期、发展期、成熟期的每个阶段,创业公司需要不同级别的技术负责人来实现复杂功能、解决技术难题、提高交付效率和质量。高级程序员的职责是实现复杂功能、编写核心代码、处理线上bug、解决技术难题。而技术经理则需要提高交付效率和质量。 ... [详细]
  • quartus管脚分配后需要保存吗_嵌入式必须会的一些硬件面试题,要试一试吗?你过来呀!...
    1、下面是一些基本的数字电路知识问题,请简要回答之。(1)什么是Setup和Hold时间?答:SetupHoldTime用于测试芯片对输入 ... [详细]
  • http:www.cnblogs.compirloarchive200909091563368.html以前操作Excel的话,一般都会去用Microsoft.Jet.OLEDB.4. ... [详细]
author-avatar
秦乐0_707
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有