美文网首页
HTTP 的 Cookie 机制

HTTP 的 Cookie 机制

作者: Drew_MyINTYRE | 来源:发表于2022-01-27 11:03 被阅读0次

    什么是 Cookie?

    HTTP 里“无状态”的 Web 服务器,只不过服务器的“失忆症”比他还要严重,连一分钟的记忆也保存不了,请求处理完立刻就忘得一干二净。那该怎么样让原本无“记忆能力”的服务器拥有“记忆能力”呢?

    既然服务器记不住,那就在外部想办法记住。相当于是服务器给每个客户端都贴上一张小纸条,上面写了一些只有服务器才能理解的数据,需要的时候客户端把这些信息发给服务器,服务器看到 Cookie,就能够认出对方是谁了。

    Cookie 的工作过程

    • 当用户通过浏览器第一次访问服务器的时候,服务器肯定是不知道他的身份的。所以,就要创建一个独特的身份标识数据,格式是 key=value,然后放进 Set-Cookie 字段里,随着响应报文一同发给浏览器。

    • 浏览器收到响应报文,看到里面有 Set-Cookie,知道这是服务器给的身份标识,于是就保存起来,下次再请求的时候就自动把这个值放进 Cookie 字段里发给服务器。

    因为第二次请求里面有了 Cookie 字段,服务器就知道这个用户不是新人,之前来过,就可以拿出 Cookie 里的值,识别出用户的身份,然后提供个性化的服务。

    不过因为服务器的“记忆能力”实在是太差,一张小纸条经常不够用。所以,服务器有时会在响应头里添加多个 Set-Cookie,存储多个 key=value。但浏览器这边发送时不需要用多个 Cookie 字段,只要在一行里用 ; 隔开就行。

    Cookie 是由浏览器负责存储的,而不是操作系统。所以,它是“浏览器绑定”的,只能在本浏览器内生效。

    Cookie 的属性

    Cookie 就是服务器委托浏览器存储在客户端里的一些数据,而这些数据通常都会记录用户的关键识别信息。所以,就需要在 key=value 外再用一些手段来保护,防止外泄或窃取,这些手段就是 Cookie 的属性。

    • 设置 Cookie 的生存周期

    Cookie 的有效期可以使用 ExpiresMax-Age 两个属性来设置。

    • 设置 Cookie 的作用域

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

    • Cookie 的安全性

    属性 HttpOnly 会告诉浏览器,此 Cookie 只能通过浏览器 HTTP 协议传输,禁止其他方式访问,还有一个属性叫 Secure,表示这个 Cookie 仅能用 HTTPS 协议加密传输,明文的 HTTP 协议会禁止发送。但 Cookie 本身不是加密的,在浏览器里还是以明文的形式存在。

    Cookie 的应用

    Cookie 最基本的一个用途就是身份识别,保存用户的登录信息,实现会话事务。

    比如,你用账号和密码登录某电商,登录成功后网站服务器就会发给浏览器一个 Cookie,内容大概是 name=yourid,这样就成功地把身份标签贴在了你身上。之后你在网站里随便访问哪件商品的页面,浏览器都会自动把身份 Cookie 发给服务器,所以服务器总会知道你的身份,一方面免去了重复登录的麻烦,另一方面也能够自动记录你的浏览记录和购物下单(在后台数据库或者也用 Cookie),实现了“状态保持”。

    总结:

    • Cookie 是服务器委托浏览器存储的一些数据,让服务器有了“记忆能力”;

    • 响应报文使用 Set-Cookie 字段发送 key=value 形式的 Cookie 值;

    • 请求报文里用 Cookie 字段发送多个 Cookie 值;为了保护 Cookie,还要给它设置有效期、作用域等属性,常用的有 Max-AgeExpiresDomainHttpOnly 等

    • Cookie 最基本的用途是身份识别,实现有状态的会话事务。

    Tips:

    • Cookie 并不属于 HTTP 标准(RFC6265,而不是 RFC2616/7230),所以语法上与其他字段不太一致,使用的分隔符是 ;,与 Accept 等字段的 , 不同,小心不要弄错了。

    • 浏览器对 Cookie 的数量和大小都有限制,不允许无限存储,一般总大小不能超过 4K。

    • 如果不指定 Max-AgeExpires 属性,那么 Cookie 仅在浏览器运行时有效,一旦浏览器关闭就会失效,这样就被称为会话。

    session 和 token 不在 http 范围之内,下面单独说说:

    session 和 token

    • session: 标识用户用户身份,服务端生成,服务端保存(产生 sessionID,会发送 sessionID 给客户端在 cookie 里面),占用内存,增大服务器负担,请求带上 sessionID,服务器通过 sessionID 找到对应 session

    • token: 标识用户身份的一串字符串,服务端加密生成的令牌,保存在客户端,客户端请求带上 token,服务端对 token 解密对比即可验证身份和密码。 Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

    cookie 和 session 的区别:

    • 存储容量不同

    单个 cookie 保存数据小于等于4kb,一个站点最多保存20个 cookie;session 没有上限,但是由于服务器内存性能考虑,session 不要存太多东西,并有删除机制。

    • 存取方式不同

    cookie 只能保存 ASCII 字符串;session 能存取任何类型的数据。

    • 隐私策略不同

    cookie 是对客户端是可见的,可以分析存放在本地的 cookie;session 存储在服务器上,对于客户端是透明的,不存在敏感信息泄露的风险。

    • 服务器压力不同

    session 是保存在服务端,每个用户都会产生一个 session。加入并发访问的用户太多,会产生很多的 session,对服务器是一个很大的负担,耗费大量内存。cookie 保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie 是一个很好的选择。

    • 浏览器的支持不同

    session 不支持新建窗口,只支持子窗口。而 cookie 都支持。

    相关文章

      网友评论

          本文标题:HTTP 的 Cookie 机制

          本文链接:https://www.haomeiwen.com/subject/phpnhrtx.html