cookie和session
cookie概述
cookie是http的状态管理机制,他是保存在客户端、由浏览器维护
可存放在内存或磁盘中
服务器生成的cookie在响应中通过set-cookie头部告知客户端(允许多个set-cookie头部传递多个值)
客户端得到cookie后,后续请求都会自动将cookie头部携带至请求中
cookie 头部可以存放多个name/value 键值对,而set-cookie头部一次只能传递1个name/value键值对,响应可以含有多个头部
cookie可能会造成的问题:
cookie附在每个http请求中,所以无形增加了流量
在http中cookie是明文传递,并可以进行cookie欺骗,安全性会有问题
cookie的大小不应该超过4kb,对于复杂存储的需求是不够用的
session概述
session也是HTTP的状态管理机制,session与cookie不同的是,session是记录在客户端的
可存放在内存、数据库、文件都有
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户端身上的“通行证”来确定身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户端身份。
当服务器需要为客户端创建一个session时,会首先检查客户端的请求头中是否包含session id,如果检索不到,则会创建一个,然后在本次响应中会返回给客户端
session可能会造成的问题:
访问量增多,会消耗服务器的性能
登录场景的cookie和session的使用
1、登录期权能够会发起post/login的操作,并户传递账号和密码
2、服务器收到请求后,与持久化数据的账号密码进行比对
3、比对通过后,把登录的状态生成session,session是有时效的。session会记录session id,对应的value会写到内存数据库中,会包含了哪个用户已经登录了,生效时长是多久
4、以set-cookie:session=xxx返回客户端中
5、按照session的时效保存session
6、浏览器发起的后续请求,会自动携带session信息
7、服务器接收到请求后,会根据session信息与内存数据库中进行比对
8、比对通过后才会执行业务查询
9、将业务信息返回给客户端
无状态的REST架构与状态管理
应用状态与资源状态
应用状态:应由客户端管理,不应该由服务器管理
例如浏览器在那一页
REST架构要求服务器不应该保存应用状态
资源状态:由服务器管理,不应该由客户端管理
如数据库中存放的数据状态:用户登录信息等(比较重要、涉及隐私等)
HTTP请求的状态
有状态的请求:服务器端保存请求的相关信息,每个请求可以使用以前保留的请求相关信息
服务器session机制使服务器保存请求相关的信息
cookie使请求可以携带查询信息(cookie中含有session id),与session配合完成有状态的请求。
无状态的请求:服务器能够处理的所有信息都来自当前请求所携带的信息
服务器不会保存session信息
请求可以通过cookie携带
参考资料:
https://time.geekbang.org/course/intro/100026801