【cookie 和 session 的那些事】

       个人学习整理,如有不足之处,请不吝指教。转载请注明:@CSU-Max


        cookie 与 session 是常用的会话跟踪技术。最近看了不少相关的知识,本篇文章就记录下我的一些学习心得。


基本原理

      

        cookie 是通过客户端记录信息确定用户身份, session 是通过服务器端记录信息确定用户身份。http 协议是无状态的协议(”连接-请求-应答-关闭连接“的模式),当每次用户从客户端请求页面时,服务器都会打开新的会话。cookie 的作用就是为了解决 http 协议这种无状态的不足。

       当用户访问某网站时,浏览器就会在本地硬盘上查找与该网站相关联的 cookie 。如果该 cookie 存在,浏览器就将它与页面请求一起通过 http 报头信息发送到用户要访问的站点,然后系统会比较 cookie 中各个属性和值是否与存放在服务器端(如数据库)的信息一致,并根据比较结果确定用户是”初访者“还是”老客户“。


       session 是以 cookie 或 url 重写或隐藏表单提交为基础的。默认情况下使用 cookie 实现(下面在谈到 session cookie 时提到),当用户发起一个访问请求时,服务器会检查该请求中是否包含 sessionid,若未包含,则系统会创造一个名为JSESSIONID 的输出 cookie (即 session cookie),并将其以 HashTable 的形式写到服务器的内存里,若已包含 sessionid,服务器会检查内存中是否有与该 session 相匹配的信息,若存在则直接使用该 sessionid,若不存在则重新生成新的 session 并在本次响应中返回给客户端;当浏览器的 cookie 被禁止后,web 服务器会采用 url 重写的方式传递  sessionid(一般采用的是 get 方式,我们可以在地址栏看到类似 sessionid = xxxxxx 的信息,也可以使用提交隐藏表单的形式来实现)。
       session 要么保存在服务器端,要么在客户端和服务器端传递(cookie 或 url rewritting 或 hidden input),若使用 cookie ,则会话 cookie 中就存储了 sessionid ,有访问请求时就是根据 sessionid 在服务端查找相关的 session。




生命周期


       cookie 一般用于标识用户,一般可以长久保存,用于用户跟踪和识别唯一用户;而 session 的生命周期与访问的进程一致,它记录了一次访问的开始到结束,当浏览器或或进程关闭后,session 也就消失了。
       cookie 是通过头部 header 返回到浏览器并保存在磁盘中,如果用户再次访问该服务器,浏览器会自动把 cookie传到服务器。cookie 的内容主要包括:名字,值,过期时间,路径和域。路径和域一起构成 cookie 的作用范围,若不设置过期时间,则表示这个 cookie 的生命周期为会话期间,关闭浏览器 cookie 就消失了。


       说到这里,我们就可以根据过期时间将 cookie 分为两种:
持久 cookie(persistent cookie) :设置了 cookie 的有效时间,一般用于长期保存,该 cookie 保存在磁盘中,在多个浏览器会话中是共享的。
会话 cookie(session cookie): 没有设置 cookie 的有效时间,此时 cookie 只存在浏览器的内存中,当用户退出或浏览器关闭,此时 cookie 就失效了,此种状况下 cookie 就和 session 很像了,默认情况下 session 就是通过会话 cookie 实现的。
注:
       一般我们所说的 cookie 指的是持久 cookie,持久 cookie 可以看到,而会话 cookie 存在内存中,一般看不到。
       cookie 是在客户端会话状态的存贮机制,要使用 cookie ,需要用户打开客户端的 cookie 支持。


       session 也是可以设置失效时间的,这里要分两个方面来看:浏览器和服务器。对服务器而言,session 与访问进程直接相关,当浏览器关闭时,session 也随之消失;而服务器端的 session 的失效时间一般是人为设置的,目的是能定期释放内存空间,减小服务器压力。一般都会设置一个定长时间,若这段时间内,当前会话处于非活动状态,就会清除该 session。所以说 session 的中断也不一定意味着用户离开了网站。
注:
       这里强调是浏览器关闭,是因为现在很多的浏览器都是多进程的 session 共享,即通过多个标签或页面打开多个进程访问同意网站时会共享 seesion,只有当浏览器关闭时才会被清除。也就是说有可能用户在标签中关闭了该网站,而未关闭浏览器,同时服务器端的 seesion 也还没有到自动清除的时间,那么若用户重新打开该网站,那么使用的还是原 session 进行浏览的。


其他

       cookie 一般不是很安全,针对 cookie 的攻击也是有很多,数据存储在客户端磁盘,因此信息很容易泄漏。
       session 则会在服务器上保存,当访问增多时,会在一定程度上影响服务器的性能。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值