cookie与session
# cookie
与 session
# 一、http
是一个无状态协议
什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。这种无状态的的好处是快速。坏处是假如我们想要把www.zhihu.com/login.html
和www.zhihu.com/index.html
关联起来,必须使用某些手段和工具
# 二、cookie
# 2.1 简介
浏览器在电脑硬盘中开辟的一块空间,主要供服务器端存储数据。“Cookie
”是小量信息,由网络服务器发送出来以存储在网络浏览器上,从而下次这位独一无二的访客又回到该网络服务器时,可从该浏览器读回此信息。这是很有用的,让浏览器记住这位访客的特定信息,如上次访问的位置、花费的时间或用户首选项(如样式表)。Cookie
是个存储在浏览器目录的文本文件,当浏览器运行时,存储在 RAM 中。一旦你从该网站或网络服务器退出,Cookie
也可存储在计算机的硬驱上。cookie
中的数据是以域名的形式进行区分的。
# 2.2 生命周期
Cookie
在生成时就会被指定一个Expire
值,这就是Cookie
的生存周期,在这个周期内Cookie
有效,超出周期Cookie
就会被清除。有些页面将Cookie
的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie
,不会记录用户信息,更加安全。
# 2.3 什么时候产生
客户端向服务器端发送一个请求的时,服务端向客户端发送一个Cookie
然后浏览器将Cookie
保存,Cookie
有两种保存方式,一种是浏览器会将Cookie
保存在内存中,还有一种是保存在客户端的硬盘中,之后每次HTTP请求浏览器都会将Cookie
发送给服务器端。cookie
中的数据会随着请求被自动发送到服务器端。
# 2.4 缺陷
1、数量受到限制。一个浏览器能创建的 Cookie
数量最多为 300 个,并且每个不能超过 4KB,每个 Web 站点能设置的 Cookie
总数不能超过 20 个
2、安全性无法得到保障。通常跨站点脚本攻击往往利用网站漏洞在网站页面中植入脚本代码或网站页面引用第三方法脚本代码,均存在跨站点脚本攻击的可能,在受到跨站点脚本攻击时,脚本指令将会读取当前站点的所有 Cookie 内容(已不存在 Cookie 作用域限制),然后通过某种方式将 Cookie
内容提交到指定的服务器(如:AJAX)。一旦 Cookie 落入攻击者手中,它将会重现其价值。
3、浏览器可以禁用Cookie
,禁用Cookie
后,也就无法享有Cookie
带来的方便。
# 三、session
# 3.1 简介
在计算机中,尤其是在网络应用中,称为“会话控制”。Session
对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session
对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session
对象。当会话过期或被放弃后,服务器将终止该会话。实际上session
就是一个对象,存储在服务器端的内存中,在session
对象中也可以存储多条数据,每一条数据都有一个sessionid
做为唯一标识。
# 3.2 为什么要用session
因为很多第三方可以获取到这个Cookie
,服务器无法判断Cookie
是不是真实用户发送的,所以Cookie
可以伪造,伪造Cookie
实现登录进行一些HTTP请求。如果从安全性上来讲,Session
比Cookie
安全性稍微高一些,我们先要知道一个概念--SessionID
。SessionID
是什么?客户端第一次请求服务器的时候,服务器会为客户端创建一个Session
,并将通过特殊算法算出一个session
的ID
,下次请求资源时(Session
未过期),浏览器会将sessionID
(实质是Cookie
)放置到请求头中,服务器接收到请求后就得到该请求的SessionID
,服务器找到该id的session
返还给请求者使用。
# 3.3 缺陷
因为Session
是存储在服务器当中的,所以Session
过多,会对服务器产生压力。
# 四、cookie与session
由于http
的无状态性,为了使某个域名下的所有网页能够共享某些数据,session
和cookie
出现了。客户端访问服务器的流程如下
- 首先,客户端会发送一个
http
请求到服务器端。 - 服务器端接受客户端请求后,建立一个
session
,并发送一个http
响应到客户端,这个响应头,其中就包含Set-Cookie
头部。 - 在客户端发起的第二次请求,假如服务器给了
set-Cookie
,浏览器会自动在请求头中添加cookie
- 服务器接收请求,分解
cookie
,验证信息,核对成功后返回response
给客户端
# 注意
cookie
只是实现session
的其中一种方案。虽然是最常用的,但并不是唯一的方法。禁用cookie
后还有其他方法存储,比如放在url
中- 现在大多都是
Session + Cookie
,但是只用session
不用cookie
,或是只用cookie
,不用session
在理论上都可以保持会话状态。可是实际中因为多种原因,一般不会单独使用 - 用
session
只需要在客户端保存一个id
,实际上大量数据都是保存在服务端。如果全部用cookie
,数据量大的时候客户端是没有那么多空间的。 - 如果只用
cookie
不用session
,那么账户信息全部保存在客户端,一旦被劫持,全部信息都会泄露。并且客户端数据量变大,网络传输的数据量也会变大
# 小结
简而言之, session 有如用户信息档案表, 里面包含了用户的认证信息和登录状态等信息. 而 cookie 就是用户通行证