Cookie 和 Session的关系和区别

117 阅读7分钟

什么是HTTP

HTTP协议的定义

HTTP是超文本传输协议,通过浏览器和服务器进行数据交互,进行文本、图片、视频等传输的规定。

HTTP协议的特点

1.HTTP协议是无状态的:一个用户的所有请求操作是同一个会话,而另一个用户的所有请求操作则属于另一个会话,HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务端的连接就会关闭,再次交换数据需要建立新的连接,这就意味着服务器无法从连接上跟踪会话,也就是服务端单从网络连接上无法具体知道是哪个客户端在请求服务器。

2.多次HTTP请求,在客户端请求网页时并不是输入网址后就一次请求到了网页的所有内容,服务端首先是响应HTML页面,然后浏览器收到响应之后就加载渲染HTML页面,在加载时就会发现还引用了其他的资源,例如CSS,JS文件,图片等,此时客户端就再次向这些资源网址所在的服务器发送HTTP请求这些资源。现在的HTTP版本支持管道机制,可以同时请求和响应多个请求,大大提高了效率。

3.基于TCP协议,HTTP协议目的是规定客户端和服务端数据传输的格式和数据交互行为,并不负责数据传输的细节。底层是基于TCP实现的。现在使用的版本当中是默认持久连接的,也就是多次HTTP请求使用一个TCP连接。

为什么需要 Cookie 和 Session

因为HTTP协议是无状态的,浏览器不知道是哪一个用户在请求服务端,服务端单从网络连接上也无法具体知道是哪个客户端在请求服务器。所以客户端就需要有一个机制来告诉服务端,本次操作用户是否登录以及是哪个用户在执行操作。

什么是 Cookie

Cookie是客户端保存用户信息的一种机制,Cookie实际上是服务器发送到客户端并在客户端本地存储的一小段文本,用来记录用户的一些信息。

客户端请求服务器,服务端需要记录该用户的状态和一些信息就会在响应报文的Set-Cookie的首部字段信息来通知客户端保存Cookie。当客户端再向服务端发起请求时,客户端会自动在请求报文中加入保存的Cookie值发送给服务端。服务器接收到客户端发送过来的Cookie后会检查是从那个客户端发送过来的请求,以此来辨认用户状态。

Cookie 主要用于以下三个方面:

1.会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)

2.个性化设置(如用户自定义设置、主题等)

3.浏览器行为跟踪(如跟踪分析用户行为等)

image.png

以下就是Cookie交互的情景,HTTP请求报文和响应报文的内容。客户端在请求服务器后,服务端在响应报文的Set-Cookie的首部字段信息来通知客户端保存Cookie。

image.png

当客户端再次发送请求到服务器时,就携带了cookie信息一同发送给了服务器。

image.png

什么是 Session

Session是服务端保存用户信息的一种机制,客户端请求服务器时,服务器把客户端信息记录在服务器上。

每个请求服务器的客户端都对应一个Session对象,所有该用户的状态信息都保存在这个Session对象里。Session对象是在客户端第一次请求服务器时创建的。客户端浏览器再次请求时,只需要从该Session对象中查找该用户的状态。

Cookie 和 Session 有什么不同

1.作用范围不同:Cookie 保存在客户端(浏览器),Session 保存在服务器端。

2.存取方式不同:Cookie 保存中文属于Unicode字符,在内存中占4个字节,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码,因此Cookie中保存中文只能编码,一般使用UTF-8编码即可。Session 可以存任意数据类型。

3.隐私策略不同:Cookie 存储在客户端且是明文显示,比较容易导致信息被窃取;Session 存储在服务端发送给客户端时会经过加密处理在客户端显示就是乱码,安全性相对 Cookie 要好一些。当访问者增多时,Session 存储在服务端就会增加服务器的负载压力,所以一些私密信息可以Session 存储,其他的可以用Cookie 存储。

image.png

image.png

4.存储大小不同:一个服务端在客户端存放的cookie不能超过3K,Session 可存储数据远高于 Cookie。

Cookie 和 Session的关系

用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的 Session对象,服务端响应返回时将此 Session对象的唯一标识信息 SessionID 返回给客户端,浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie会记录此 SessionID 属于哪个域名。当用户第二次请求服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session对象信息,如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。

根据以上流程可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。

image.png

服务端是根据 Cookie 中的信息判断用户是否登录,当浏览器中禁止了 Cookie时其解决方案:

第一种方案,POST方式请求可以在每次请求中都携带一个 SessionID 的参数,,GET方式请求可以在请求的地址后面拼接 xxx?SessionID=123456...。

第二种方案,Token 机制。Token 机制多用于 App 客户端和服务器交互的模式,也可以用于 Web 端做用户状态管理。 Token 的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。Token 机制和 Cookie 和 Session 的使用机制比较类似。当用户第一次登录后,服务器根据提交的用户信息生成一个 Token,响应时将 Token 返回给客户端,以后客户端只需带上这个 Token 前来请求数据即可,无需再次登录验证。

egg框架中配置Cookie 和 Session

通过this.ctx.cookies可以在 Controller 中便捷、安全的设置和读取 Cookie,get方法获取cookie信息,set方法设置cookie信息

//设置登录成功的储存信息cookies
 //在设置cookie时有个对象类型的可选参数,可以对cookie进行相关设置:maxAge:1000*60*60*24*30表示有效时间是30天
this.ctx.cookies.set("acount",ziduan.acount,{maxAge:1000*60*60*24*30});
// 取出登录成功的储存信息cookies
 let act=this.ctx.cookies.get("acount");

清除cookie把值设置为null即可

_)WLB4K24`EJV7L{APVS@O5.png

maxAge:设置cookie的有效期,单位毫秒,默认浏览器关闭消失;
httpOnly:设置cookie是否允许js访问,默认true,不允许;
overwrite:如果设置为true,相同的键值对会被覆盖,否则发送两个;
signed:如果为true表示对cookie进行签名,不是加密,只是防止被篡改,注意在获取的时候也要提供该设置进行匹配;
encrypt:是否加密,true加密后客户端看不到明文,只能在服务器端获取,注意在获取的时候也要提供该设置进行匹配;

Session配置

config.session = {
	key: 'AOTU_SSION',//客户端cookies的name
	maxAge: 24 * 3600 * 1000, // 1 天
	httpOnly: true,
	encrypt: true,
};
this.ctx.session.userid = 12345;//设置储存数据this.ctx.session.maxAge = ms('30d')//单独设置过期时间
let userid=this.ctx.session.userid;//获取储存数据

如果要删除userid,可以直接将它赋值为 null

5){KT(S_4$)5)LLELFKIJTJ.png