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

相关