回复内容:
先不说Php里的session和cookie,我们来看看在正常的web中,session和cookie分别是什么。
Cookie其实是浏览器一端的技术。由于HTTP本身是无状态的,常规来说对于服务器端并不知道每次请求的分别是谁,于是一个web会话允许在HTTP头里通过set-cookie临时存储一些内容在客户端,客户端则需要在此会话中的每一个HTTP请求都附上当前cookie的内容(禁用cookie的话就不发了)。这里的会话一般是以域名来界定的。
但是cookie有两个很大的缺陷:1. cookie是存储在客户端的,所以cookie可以被读取、挪用和修改。这意味着,对于任何关键信息,例如登陆信息等,如果用cookie来保持,别人就能够随意读取删改。2. 其它伪装站点可能可以直接获取到你的cookie内容。
那么怎么样存取这些信息来使得用户端难以随意删改cookie伪装其它用户呢?通常来说有两大类方法:1. 对cookie进行加密;2.cookie里只存一个带自验证的特征码,然后把关键数据存储在服务器一端。这就是session了。
session是cookie的应用。加密存储在客户端的session是最容易实现的,不会给服务器带来额外的存储负担,很多的新型小微框架的session都是以此手段实现的(而并未存储在服务端)。其次就是存储在服务端,可选的存储的地方包括而不限于内存、文件、外部数据库等。
Php自带库里,cookie即往response里加入需要客户端存储等cookie,session则是在cookie里加一条session_id,然后默认以文件的形式将需要存储的东西存储在服务端。
顺带一提,现代浏览器里普遍都支持localStorage,一来它通过前端访问而后端不可取得,对用户而言安全性稍好,二来可以存储的量大多了,三来有一定的防低端爬虫的能力。如果不用考虑老旧浏览器兼容的话,用localStorage+前后端分离,以ajax形式通过js回报localStorage内容(session_id或者加密存储内容)以代替cookie更值得推荐。
cookie就是把数据存在客户端
session就是把数据存在服务器端,客户端只存一个id
一楼说的很好了。
其实最大的区别就是cookie存在客户端,session存在服务器端。而且一般情况下,session确实依赖cookie里面的session id,其实这个session id你也可以自己定,然后用session时指定这个session id。session id的作用就是指定session存放的文件,所以cookie禁用后,可以用这招。
再补充一点就是,在分布式架构中session要慎用,因为可能会出现session数据丢失的情况,当然你也可以重写session,让session存在缓存中或者数据库中。
你可以这么理解,cookie是别人家的箱子,session是自己家的箱子,箱子的好处是什么?存东西呗