Cookie-Session

107 阅读4分钟

HTTP 是无状态的

HTTP 协议是无状态的,即可以说服务器是无记忆的。每条 HTTP 请求都是全新的请求,不依赖上一条or下一条的请求。但现实是我们往往需要“记忆”,需要自动登录!!【电商、购物车...往往只有记住了用户的身份信息才能针对用户响应】。

客户端 ---> 服务器:我是用户XXX,我需要YYY数据

服务器:验证XXX是否有权限,有就响应

客户端 ---> 服务器:我是用户XXX,我需要ZZZ数据

服务器:再验证一下

可知,服务器对于 XXX 的每次请求都要检验一下权限,这就是 HTTP 的无状态。

“身份证”

类似于我们每个人都会有的身份证,每个人都只会有一个身份证号。当我们第一次访问服务器的时候,服务器也会给我们一个身份证明,我们需要把它保存好,并在需要的时候带上,以验证我们的身份!那现在的问题就变为客户端如何保存身份证? and 怎么带上它?

Cookie 出现 【保存“身份证”】

Cookie 其实就是客户端存储技术,工作流程如下:

image.png

  • 浏览器向服务器发起 HTTP 请求,服务端设置 Cookie 并随着响应返回
  • 响应回来时,浏览器自动将 Cookie 保存到浏览器本地
  • 接下来浏览器发起的请求都会带着 Cookie 【请求中】

Cookie 的过期时间

Cookie 也会有过期时间,超过该期限,浏览器就会认为是 Cookie 失效,在存储里删除,不会发送给服务器!!

Cookie的有效期可以使用两个属性字段来设置

  • “Expires” 俗称“过期时间”,用的是绝对时间点,可以理解为“截止日期”(deadline)。
  • “Max-Age” 用的是相对时间,单位是,浏览器用收到报文的时间点再加上 Max-Age,就可以得到失效的绝对时间。

Expires 和 Max-Age 可以同时出现,两者的失效时间可以一致,也可以不一致,但浏览器会优先采用 Max-Age 计算失效期。

Cookie 的作用域

类似我们的身份证,在中国绝对有效,但是出了中国就不一定有效了!Cookie也是这样的,我们不可以用服务器 A 的cookie 去访问服务器 B。

Cookie的作用于可以使用下面两个属性字段设置

  • “Domain” :指定了Cookie所属的域名
  • “Path” :指定了 Cookie 所属路径

浏览器在发送 Cookie 前会从 URI 中提取出 host 和 path 部分,对比 Cookie 的属性。如果不满足条件,就不会在请求头里发送 Cookie。

使用这两个属性可以为不同的域名和路径分别设置各自的 Cookie,比如“/avv-1”用一个 Cookie,“/avv-2”再用另外一个 Cookie,两者互不干扰。不过现实中为了省事,通常 Path 就用一个“/”或者直接省略,表示域名下的任意路径都允许使用 Cookie,让服务器自己去挑。

Session 【服务端存储技术】

Session是服务器端用于跟踪用户会话状态的一种机制。通过Session,服务器可以在用户访问不同网页或进行多次请求时,保持用户的状态信息的连续性和一致性。工作流程如下:

  • 用户首次访问网站,服务器检测到没有与该用户相关的 Session ,为其创建一个唯一的 Session ID 。
  • 服务器将 Session ID 发送给客户端,浏览器通过 Cookie 的形式保存在浏览器中。
  • 浏览器在后续的请求中携带 Session ID ,发送给服务器。
  • 服务器接收到请求后,根据Session ID查找对应的Session数据。
  • 服务器可以获取和更新Session中的用户状态信息,并根据需要做出相应的响应。

Session 存储的数据可以是用户的认证信息、购物车内容、用户偏好...

常见登录方案:Cookie-Session

image.png

  • 用户使用浏览器访问页面,输入俸禄账号和密码!

  • 服务器端收到请求,鉴权

    • 鉴权成功,将用户信息存储到 Session 中,并生成一个 Session ID 的 Cookie 返回。
    • 浏览器将该 Session ID 通过 Cookie 保存起来
    • 此后浏览器再去请求业务接口,就会把 Cookie 带上
    • 服务端根据 Session ID 响应