还不知道Cookie和Session吗
Cookie和Session是什么
Cookie
夏洛:大爷,楼上322住的是马冬梅家吧?
大爷:马都什么?
夏洛:马冬梅。
大爷:什么都没啊?
夏洛:马冬梅啊。
大爷:马什么没?
夏洛:行,大爷你先凉快着吧…
在了解这三个概念之前我们先要了解HTTP是无状态的Web服务器,什么是无状态呢?就像上面夏洛特烦恼中经典的一幕对话一样,一次对话完成后下一次对话完全不知道上一次对话发生了什么。如果在Web服务器中只是用来管理静态文件还好说,对方是谁并不重要,把文件从磁盘中读取出来发出去即可。
但是随着网络的不断发展,比如电商中的购物车只有记住了用户的身份才能够执行接下来的一系列动作。所以此时就需要我们无状态的服务器记住一些事情。
那么Web服务器是如何记住一些事情呢?既然Web服务器记不住东西,那么我们就在外部想办法记住,相当于服务器给每个客户端都贴上了一个小纸条。上面记录了服务器给我们返回的一些信息。然后服务器看到这张小纸条就知道我们是谁了。
什么是Cookie?
Cookie实际上是由服务器生成,发送给浏览器客户端一小段的文本信息。
客户端请求服务器,如果服务器需要记录该用户状态,就使用response
向客户端浏览器颁发一个Cookie,客户端会把Cookie保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态,服务器还可以根据需要修改Cookie的内容。
浏览器把Cookie以 key-value
形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该Cookie发送给服务器。由于Cookie是存在客户端上的,所以浏览器加入了一些限制确保Cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的Cookie数量是有限的。
就是像是在某宝浏览商品时,没有登陆账户,但还是可以将商品加入到购物车中;登陆之后发现商品已经在自己账户的购物车中了。就是通过Cookie来保存你客户端的临时信息的。
Cookie什么时候产生?
在客户端第一次请求服务器时,Cookie会从服务器端发送的响应报文内的一个叫做Set-Cookie
的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie 值后发送出去。
服务器端发现客户端发送过来的Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
- 没有Cookie信息状态下的请求
- 第2次以后(存有Cookie信息状态)的请求
Session
Session 从字面上讲,就是会话。就像你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征表明他就是张三。
Session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用Cookie 的方式。服务器使用Session把用户的信息临时保存在了服务器上,用户离开网站后Session会被销毁。
其实,说白了就是:
服务器和客户端都不认识,各自相忘于江湖(网络)。但是,为了能够让他们相互认识并且来保存我们用户的信息,就通过Cookie 和 Session来给它们发放各自的身份证让他们相认。
- Cookie:服务器给客户端发的身份证,来记录客户端的请求的。客户端每次请求服务器时,必须持证上岗
- Session:服务器自己留的备份名单,来存储特定用户(就是指发送请求的客户端)会话所需的属性及配置信息
什么是Session?
Session是另一种记录客户状态的机制,Session 对象存储特定用户会话所需的属性及配置信息。 当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
Session什么时候产生?
当用户请求f服务器时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
Cookie和Session的关联
-
数据存储位置:Cookie数据存放在客户的浏览器上,Session数据放在服务器上。
-
安全性:Cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗,Session比Cookie更具有安全性.
-
服务器性能:Session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用Cookie。
-
数据大小:单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。
-
信息重要程度:可以考虑将登陆信息等重要信息存放为Session,其他信息如果需要保留,可以放在Cookie中。
Token
Session是将要验证的信息存储在服务端,并以SessionId和数据进行对应,SessionId由客户端存储,在请求时将SessionId也带过去,因此实现了状态的对应。
Token是在服务端将用户信息经过Base64Url
编码过后传给在客户端,每次用户请求的时候都会带上这一段信息,因此服务端拿到此信息进行解密后就知道此用户是谁了,这个方法叫做JWT(Json Web Token)
Token的优势
- 简洁:可以通过URL,POST参数或者是在HTTP头参数发送,因为数据量小,传输速度也很快
- 自包含:由于串包含了用户所需要的信息,避免了多次查询数据库
- JWT跨语言,因为Token是以Json的形式保存在客户端的,所以跨语言
- 不需要在服务端保存会话信息,特别适用于分布式微服务
【参考链接】