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

xiaoxiao2021-02-28  107

​ 做数据产品时,我们会经常遇到用户隐私问题(如,禁止追踪)。在最新的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 ""; } 奋飛 认证博客专家 技术管理 前端工程化 乐观、勇气、专注、果断、好奇、公正、慎思、真诚、追求极致追求完美、诚信!独立撰写了多个前端专题模块,访问量达百万级。多次负责组织大数据可视化前端架构平台开发工作。对前端新技术、新潮流具有很强的敏锐力和洞察力!
转载请注明原文地址: https://www.6miu.com/read-22643.html

最新回复(0)