《HTTP权威指南》笔记:第十一章-客户端识别与cookie机制

一、个性化

HTTP最初是一个匿名,无状态的 请求/响应 协议,Web服务器几乎没有什么信息可以用来判定是哪一个用户发来的请求,后来开发者们总结了一些识别机制来标识用户:

  1. 包含用户信息的HTTP首部
  2. 通过客户的IP地址来识别
  3. 用认证的方式识别
  4. URL,把用户信息嵌入在URL

二、通过首部识别

以下是常见用来承载用户相关的HTTP请求首部:

  • from,用户的邮箱地址
  • user-agent,用户的浏览器软件
  • referer,请求来自的页面
  • authorization,用户名和密码
  • client-ip,客户端ip地址(扩展)
  • x-forwarded-for,客户端ip地址(扩展)
  • cookie,用户标识

一般来说,没有浏览器或者用户会使用from,因为担心邮箱泄露导致大量的垃圾邮件,这个头部一般用于正规爬虫。user-agent可以告诉服务端请求来自何种服务器,实现与浏览器相关的定制内容返回。referer这个首部也不可靠,因为可以手动伪造(有的浏览器会禁止修改这个首部)。

三、客户端IP地址

web浏览器可以找到承载HTTP请求的tcp连接对应的目的ip,但是用ip来标识客户并不可靠,主要有以下原因:

  1. ip描述的是机器而非用户
  2. ip一般由服务商动态分配
  3. ip地址是有限的,所以很多用户是通过NAT接入网络的
  4. 有时只能获取到代理的ip而非客户端的

四、用户登录

首先服务端返回错误码401 login required,此时浏览器弹出登录对话框,用户输入并确认后浏览器会把用户的信息放在authorization首部中发送给服务端,并且会保存下来,之后每次请求都会带上该首部。这样做的好处是用户只需要登录一次,并且相对可靠。缺点是不安全,把用户名密码直接放在首部很容易被其他观察者直接看到并泄露。

五、胖URL

有的网站会为每个用户生成特殊的识别码并嵌入url中,并以此来标识用户,而且还可以在url中追加一些用户状态等等,这样做对用户来说很方便,几乎无感知,因为主要通过服务端重写url来完成,但是缺点也很多:

  1. 过长的url
  2. 无法共享连接,因为你的连接中包含你的个人信息
  3. 无法缓存,因为缓存是和url相关的,如果每个人的url都不相同,那么缓存就失效了
  4. 加重服务器负载
  5. 不稳定,如果用户在该页面已经操作了很多内容,一旦用户丢失了该连接,那么将永远无法找到

六、cookie

cookie是目前实现持久会话的最好的方式,现在所有主流浏览器都支持。

6.1 cookie的类型

我们可以吧cookie大致分为2类:会话cookie和持久cookie。会话cookie在关闭页面后就会失效,而持久cookie即使关闭页面也能保存一定时间。

6.2 客户端侧状态

cookie的基本思想是让浏览器积累一组服务器特有的信息,每次访问服务器时提供这些信息,因为信息是存储在客户端的,所以此系统被称为客户端侧状态。

6.3 不同的站点使用不同的cookie

浏览器内部存有很多的cookie,但是不会在访问网站的时候带上所有的cookie,因为cookie只是一些键值对,只对设置这些cookie`的网站有效,对其他人来说都是不可读的垃圾数据。

6.3.1 cookie的域属性

set-cookie可以给响应首部添加一个domain属性来控制那些站点可以使用该cookie

set-cookie: user="sadhgiaq3124jaklh"; domain="xxx.com"

6.3.2 cookie的path属性

除了设置域,还可以设置path,这样可以减少无用cookie传播,只有访问特定的path才会携带该cookie

set-cookie: pref="color"; domain="xxx.com"; path="/pages/"

如果设置了以上2个cookie,访问www.xxx.com时携带:

cookie:user="sadhgiaq3124jaklh";

访问www.xxx.com/pages/index.html时携带:

cookie:user="sadhgiaq3124jaklh";pref="color"

6.4 cookie的组成

目前使用的cookie有2个版本:版本0和版本1,后者是前者的扩展,但应用不及前者广泛

6.4.1 版本0(Netscape)

set-cookie首部:

  • name=value,必须的
  • expires=date,可选的,指定cookie过期时间
  • domain=value,可选的,设置cookie指定域,如果没有设置,那么默认为当前主机名
  • path=value,可选的,指定路径,如果没设置,那么默认当前路径
  • secure,可选的,如果包含这个属性,那么只有在https连接中才会携带该cookie

使用set-cookie设置的cookie在请求时会被合并到一个cookie首部中。

6.4.2 版本1(RFC2965)

RFC2109定义了一个cookie的扩展版本,引入了set-cookie2cookie2首部,下面是set-cookie2的可用首部:

  • name=value,必须的,同版本0
  • version,必须的,一个整数,set-cookie2:version= "1"
  • comment,可选的,说明服务器如何使用该cookie
  • comment-url,可选的,提供一个url指针,指向的文档详细说明cookie使用文档
  • discard,可选的,表示当前cookie为会话cookie,会话结束后直接销毁
  • domain,同版本0
  • max-age,可选的,相对过期时间
  • path,可选的,同版本0
  • port,可选的,只能向指定端口提供cookie
  • secure,同版本0

该规范的cookie2首部里所有关键字都以$开头。

6.4.3 版本协商

因为版本1的cookie扩展功能更多,所以当请求链路上的设备都支持版本1的话,那应该使用版本1,下面描述各设备之间如何协商cookie版本:

  1. 服务器响应请求时会发送set-cookieset-cookie2,客户端如果支持版本1cookie,那么会丢弃set-cookie的值
  2. 如果服务端未使用set-cookie2,客户端可以发送cookie2: $version=1告知服务端可以使用set-cookie2

6.5 cookie与缓存

当公共缓存缓存带有set-cookie的响应时应该格外小心,下面是一些处理缓存需要注意的规则:

  1. 如果该文档可以缓存,但是不希望缓存set-cookie首部,服务器应道注明cache-control:no-cache="set-cookie"
  2. 当服务端通过某个请求去设置cookie的时候,需要让这个请求使用协商缓存,即每一个请求必须到达服务器,否则当代理缓存中有该请求的缓存,那么其他客户端就无法获得cookie。有些比较严格的代理会舍弃一切带有set-cookie首部的副本。
  3. 当服务端接收到带有cookie的请求时一定要注意,这个响应可能是私有的,那么服务端应该设置好响应首部避免该响应被公共缓存保存。

参考资料

[1]《HTTP权威指南》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容