为什么需要 cookie 和 session
1: 为什么需要 Cookie
在Web发展史中,我们知道浏览器与服务器间采用的是 HTTP 协议,而这种协议是无状态的
什么是无状态的?
我们在打开一个网页 A 后,再打开一个网页 B ,这个时候网页 B 知不知道我们是打开网页 A 的人呢?答案是不知道,这就是无状态。
据说这么设计是为了保证服务器不会因为保存当前的传输信息而爆炸(毕竟当时电脑的性能很低),并且当时都是静态网页,不需要保存用户登录,也就没有必要设计成有状态的了。
但是不久之后,随着 Web 的发展,我们开发出了需要登陆的,能够与服务器交互的动态网站。这个时候采用无状态的 HTTP 协议的服务器就会出出现一个问题:一旦有用户登陆了一个网站 A,然后他点击了网站 A 的一个连接跳转到网站 B ,但是由于 HTTP 协议的无状态性,在向网站 B 传输数据包时,不能向网站 B 传输他在网站 A 中登录的信息,结果在网站 B 上,我们的用户还得再登录一遍。这样无状态的设计在这个时候就很不合理了。
为了解决 HTTP 的无状态问题,人们设计出了 Cookie 和 Session 技术。
2: Cookie
cookie
是浏览器保存在用户电脑上的一小段文本,通俗的来讲就是当一个用户通过 http
访问到服务器时,服务器会将一些 Key/Value
键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器时,数据通过请求头又被完整地给带回服务器,服务器根据这些信息来判断不同的用户。
Cookie 是服务器传给客户端并保存在客户端的一段信息,这个 Cookie 是有大小,数量限制的!!
3: Session
Cookie 是有大小限制和数量限制的,并且越来越多的 Cookie 代表客户端和服务器的传输量增加,可不可以每次传的时候不传所 Cookie 值,而只传一个唯一ID,然后将用户信息存在服务器的一个文件上,通过这个ID直接在服务器查找用户信息所在的 Session 文件呢?答案是有的,这就是我们的 session。
这个时候我们在传输 Cookie 的时候就没有必要传输所有的用户信息了,我们只要传输一个 Session ID 就可以了,这样就能节省传输的压力,并且信息量大的数据包在传输的时候越容易丢失部分信息,况且现在计算机的硬盘速度和容量都很好,所以现在将用户信息存储在远程服务器完全是划算的。
而且 Session 机制能在一定程度上防止黑客通过篡改 Cookie 包来实现越权漏洞等问题。比如说一个 Cookie 中一对键值对, Key 是 Admin 值是 1,来表示普通用户。那么黑客可能就能想到,假如这个地方值修改为 0,是不是服务器就能把我识别成管理用户呢。所以 Cookie 这种用来鉴别用户身份和权限的东西,要尽可能少的暴露给客户端。所以用 Session 机制将部分 Cookie 存在服务器端可以在一定程度上避免这个问题。只要黑客拿不到管理员或者其他用户的 Session ID,他就不能通过篡改 Cookie 冒充管理员。并且 Seesion ID 为随机生成,一般被黑客拿到的猜出来其他用户的 Seesion ID 的难度很低。