【HTTP】客户端识别与cookie机制

来源:互联网 发布:软件外包公司管理制度 编辑:程序博客网 时间:2024/06/05 05:39

​ 做数据产品时,我们会经常遇到用户隐私问题(如,禁止追踪)。在最新的Chrome浏览器中该选项已被默认选中设置=>显示高级设置=>随浏览流量一起发送”不跟踪”请求开启该选项后,请求头中会增加DNT:1的字段。
这里写图片描述
​ 然而,大多数产品都希望提供一个类“免责声明”的文档,然后主动管理该DNT。所以我们只能借助其他方式(这里常用的方式是第三方Cookie,见文档Cookie章节)去实现,下述主要描述了一些用以进行客户端识别的机制。

写在前面

​ HTTP是无状态协议,通常情况下Web服务器几乎没有什么信息可以用来判断是哪个用户发送的请求。然而,现代的Web站点希望能够有更多的个性化接触,希望对连接的另一端有更多的了解。根据这些了解,可以做一些个性化接触。如,特别的问候语、特别推荐、存档信息、记录会话等等。

HTTP提供一些用以进行客户端识别的机制:

  • 承载客户身份信息的HTTP首部
  • 客户端IP地址跟踪,通过用户的IP地址对其进行识别
  • 用户登录,用认证方式来识别用户
  • 胖URL, 在URL中嵌入识别信息
  • cookie, 功能强大且高效的持久身份信息识别技术

HTTP首部

首部名称 首部类型 描述 From 请求 用户的E-mail地址 User-Agent 请求 用户的浏览器软件 Referer 请求 用户是从这个页面上依照链接挑战过来的 Authorization 请求 用户名和密码 Client-IP 扩展(请求) 客户端的IP地址 X-Forwarded-For 扩展(请求) 客户端的IP地址 Cookie 扩展(请求) 服务器产生的ID标签

(1)Form
​ 包含用户的Email地址,每个用户都有不同的E-mail地址。由于担心服务器会收集Email,很少浏览器会携带该字段。
(2)User-Agent
​ 将用户所有浏览器的相关信息告知服务器。通常可以利用User-Agent来进行设备和浏览器等判断。
(3)Referer
​ 提供用户来源页面的URL。
注意,部分情况下,从网站跳出的链接有时不会携带Reffer,可以强制指定!

<meta name="referrer" content="always">

客户端IP地址

在HTTP首部并不提供客户端的IP地址,但Web服务器可以找到承载HTTP请求的TCP连接另一端的IP地址。需要注意,使用客户端IP地址标识用户会有如下几个问题:(1)多人公用同一台电脑;(2)每次使用,动态分配IP地址;(3)共享的防火墙地址,将真实地址隐藏;(4)HTTP代理;

用户登录

为了使Web站点的登录更加简便,HTTP中包含了一种内建机制,可以用WWW-Authenticate首部和Authorization首部向Web站点传送用户的相关信息。一旦登录,浏览器可以不断地在每条发往这个站点的请求中发送这个登录信息。如果服务器希望在为用户提供对站点访问之前,先行登录,可以向浏览器回送一条HTTP响应代码401 Login Required,浏览器端会弹出一个登录对话框。

胖URL

有些Web站点会向每一个用户生成特定版本的URL(通常是向真正的URL中添加一些客户端识别信息进行扩展), 我们称之为胖URL。这看起来是一个不错的客户端识别机制,但是在实际使用中会有如下几个问题:(1)无法共享URL;(2)URL根据用户特定生成,破坏缓存;(3)额外的服务器负荷;(4)用户在访问一些特定URL时,可能就无意中离开了胖URL会话;(5)会话非持久,退出时所有信息丢失。

​ Cookie分为:会话Cookie和持久Cookie。会话Cookie是临时性的,用户退出浏览器会话Cookie就被删除了;持久Cookie会存储在硬盘上,浏览器退出、计算机重启都会存在。如果设置了Discard参数,或者没有设置Expires或Max-Age参数来说明扩展的过期时间,则为会话Cookie。

不同站点使用不同的Cookie

(1)cookie的域属性

产生cookie的服务器可以向Set-Cookie响应首部添加一个Domain属性来控制哪些站点可以看到该cookie。

Set-cookie: user="ligang"; domain="xxx.com"

数据行业中,针对浏览器级别的浏览器DNT(Do Not Track,禁止追踪),使用第三方Cookie实现,是一种常规解决方案。如,采集域名为collect.xxx.com,可以在其官网www.xxx.com下,设置Cookie表示DNT,指定其domain为xxx.com。在采集发包时,会在请求头中携带该Cookie信息(因为同域)。

(2)cookie的路径属性

Cookie规范允许用户通过Path属性将cookie于部分Web站点关联起来。

Set-cookie: user="ligang"; domain="xxx.com"Set-cookie: age="25"; domain="xxx.com"; path="/settings/"
  • 访问http://www.xxx.com/settings/(xxx.com域下的settings路径)时,会携带user和age;
  • 访问http://www.xxx.com/index.html(xxx.com域下的非settings路径)时,只会携带user。

Cookie常规操作

/** * 设置Cookie * @param name 名称 * @param value 值 * @param days 有效期(天) */function writeCookie(name, value, days) {    var expires = '';    if(days) {        var date = new Date();        date.setTime(date.getTime()+(days*86400000));        expires = "; expires=" + date.toGMTString();    }    document.cookie = name+"="+value+expires+"; path=/; domain=xxx.com";}/** * 获取Cookie * @param name 名称 */function getCookie(name){    var pattern = RegExp(name + "=.[^;]*");    matched = document.cookie.match(pattern);    if(matched){        var cookie = matched[0].split('=');        return cookie[1];    }    return "";}
原创粉丝点击