cookie

  首先了解下 cookie 的作用, cookie 可为 web 应用程序保存用户相关信息。例如我们在浏览一些网站,需输入账号与密码,这时浏览器会弹出对话框,是否保存账号与密码,这样下次浏览此网站,就不需要输入账号与密码了而是直接登录了,这就是 cookie 在起作用了。那么 cookie 是怎么生成的,其机制与流程是什么呢?浏览器又是怎么找到相应 cookie 并发送出呢?最近浅入研究了下 cookie 及其机制,现总结一下。

Cookie 是 Web 服务器向用户的浏览器发送的一段 ASCII 码文本。一旦收到 Cookie,浏览器会把 Cookie 的信息片断以"名 / 值"对 (name-value pairs) 的形式储存保存在本地。这以后,每当向同一个 Web 服务器请求一个新的文档时,Web 浏览器都会发送之站点以前存储在本地的 Cookie。浏览器与 Web 服务器通过 HTTP 协议进行通讯,而 Cookie 就是保存在 HTTP 协议的请求或者应答头部(在 HTTP 协议中,数据包括两部分,一部分是头部,由一些名值对构成,用来描述要被传输数据的一些信息。一部分是主体 (body),是真正的数据(如HTML 页面等))进行传送的。

在 HTML 文档被发送之前,Web 服务器通过传送 HTTP 包头中的 Set-Cookie 消息把一个 cookie 发送到用户的浏览器中。例如:

Set-Cookie:customer=zyr;path=/foo; domain=.163.com;  

 expires= Wednesday, 19-OCT-0523:12:40 GMT; [secure]

Set-Cookie 的每个属性解释如下:

  • Customer=zyr 一个"名称=值"对,把名称 customer 设置为值"zyr",这个属性在 Cookie 中必须有。
  • path=/foo 控制哪些访问能够触发 cookie 的发送。如果没有指定 path,cookie 会在所有对此站点的 HTTP 传送时发送。如果 path=/directory,只有访问 /directory 下面的网页时,cookie 才被发送。在这个例子中,用户在访问目录 /foo 下的内容时,浏览器将发送此 cookie。如果指定了 path,但是 path 与当前访问的 url 不符,则此 cookie 将被忽略。
  • domain=.163.com 指定 cookie 被发送到哪台计算机上。正常情况下,cookie 只被送回最初向用户发送 cookie 的计算机。在这个例子中,cookie 会被发送到任何在 .163.com 域中的主机。如果 domain 被设为空,domain 就被设置为和提供 cookie 的 Web 服务器相同。如果 domain 不为空,并且它的值又和提供 cookie 的 Web 服务器域名不符,这个 Cookie 将被忽略。
  • expires= Wednesday, 19-OCT-05 23:12:40 GMT 指定 cookie 失效的时间。如果没有指定失效时间,这个 cookie 就不会被写入计算机的硬盘上,并且只持续到这次会话结束。
  • secure 如果 secure 这个词被作为 Set-Cookie 头的一部分,那么 cookie 只能通过安全通道传输(如SSL 通道)。否则,浏览器将忽略此 Cookie。

一旦浏览器接收了 cookie,这个 cookie 和对远端 Web 服务器的连续请求将一起被浏览器发送。例如:前一个cookie 被存入浏览器并且浏览器试图请求 URL http://www.163.com/foo/index.html时,下面的 HTTP 包头就被发送到远端的 Web 服务器。

GET/foo/index.html HTTP/1.0

Cookie:customer=zyr

一次典型的网络浏览过程

在了解了cookie协议的一些基本内容之后,我们来看一次典型的网络浏览过程中浏览器如何识别和处理 Cookie:

  • 浏览器对于 Web 服务器应答包头中 Cookie 的操作步骤:
    1. 从 Web 服务器的应答包头中提取所有的 cookie。
    2. 解析这些 cookie 的组成部分(名称,值,路径等等)。
    3. 判定主机是否允许设置这些 cookie。允许的话,则把这些 Cookie 存储在本地。
  • 浏览器对 Web 服务器请求包头中所有的 Cookie 进行筛选的步骤:
    1. 根据请求的 URL 和本地存储 cookie 的属性,判断那些 Cookie 能被发送给 Web 服务器。
    2. 对于多个 cookie,判定发送的顺序。
    3. 把需要发送的 Cookie 加入到请求 HTTP 包头中一起发送。

例如,如下所示是901项目nginx中userid的配置(User ID模块可发布cookie),

指令userid 表示是否启用发出cookie;userid_name 设置cookie的名称;userid_domain 指定cookie的域名;userid_path 设置cookie路径;userid_expires 设置cookier 过期时间。

         上述配置表示,如果名叫usertrack的cookie在本地主机存下后(365天后过期),那么客户端浏览器只要访问study.163.com,就会在HTTP请求头里面包含usertarck的cookie并发送给服务器。当然你也可以设置userid_path,比如userid_path /res;那么只有在访问study.163.com/res才会发送cookie。

最后说一下,使用cookie的注意事项:

         1、当前设置的cookie不是立即生效的,而是要等到下一个页面时才能看到。这是由于在设置的这个页面里cookie由服务器传递给客户端浏览器,在下一个页面浏览器才能把cookie从客户的机器里取出传回服务器的原因。

2、cookie限制是在客户端的。一个浏览器能同时存储的Cookie数量最多为300个,并且每个不能超过4KB(但我通过浏览器控制台看到有些cookie超过这些值,不解),每个WEB站点能设置的Cookie总数不能超过20个。

3、不同浏览器对cookie的处理机制不一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值