大多数网站在用户登录时会提供一个“记住我”或者“保持登录状态”的选项,只知道是用Cookie实现的,但是具体来说的工作流程是什么?因为要实现一个网站登录的东西,所以想从细节方面了解这个问题的朋友就一起来学习下吧。
先说说结论:
1.cookie和session都可以用来保持登录状态。
2.如果使用cookie,用于保存用户状态的cookie需要加密,并且可被识别,但不必须可以解密。这个意思就是说,加密后的存储了用户登录信息的cookie数据在服务端可被还原,即使不能还原也要可以用于识别和比对(即唯一),php的加密函数可以去网上找,一搜一大把。
3.如果使用session,在不考虑安全的情况下,可以简单的使用$_SESSION这个全局数组达到目的,但是如果需要更高的安全性,需要额外的参数进行安全性验证,可以是加密字符串也可以是某串数据的MD5指纹。
4.使用session可以保证登录数据的一致性,如果登录数据中有在登录时间内可能会发生变动的项目,但是依然需要用到额外的参数去提取原来的session数据。
5.cookie比起session会有个滞后性,这一点需要注意,有时候有益,有时候也不方便。
6.在完全理解session的工作机制后,可以尝试抛弃php本身的session机制,建立自定义session机制。
终极结论:
为了保证安全性,既然都需要加密cookie,那么,为什么不把用户登录数据都存储在cookie里呢?session还会浪费服务器端存储。
终极进阶结论:
当你学会使用内存数据库的时候,比如memcached或者redis之类的,cookie和它们结合才是绝佳的解决方案。
下面扯点别的:
说起状态维持这件事情,一直是http的痛处,因为http是无状态协议,要让无状态协议支持状态维持,于是产生了cookie,早期浏览器对cookie戒心甚大,于是勉为其难用一下GET参数也是无妨,现代浏览器都是默认开启cookie的,甚至大部分都已经支持了浏览器端存储(storage)以及少部分支持了浏览器端数据库,后两者仅是存储,在请求时并不会向服务器反馈数据。而session是建立在cookie或者其他从浏览器传回的数据之上的,脱离了cookie或者其他从浏览器传回的参数(比如GET参数)就是无源之水、无根之木。
有人说,甚至有不少人说,session比cookie安全,我觉得这是不恰当的看法。cookie和session具有同等的安全性,并不会因为cookie存储于客户端而session存储于服务端而使cookie的安全性低于session,可以这么说,cookie和session的安全性都取决于cookie或者前文提到的传回服务器的参数的安全性。
而且session也不仅仅是局限于php本身提供的session库,任何存储于服务器端的数据都有可能扮演session的角色,本质上session是一种特殊的数据库,只不过这个数据库只允许已被识别的唯一合法客户端去访问。
虽然我在上面一段文字中强调了唯一,但是识别过程并不可靠ÿ