前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【HTTP】客户端识别与cookie机制

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

作者头像
奋飛
发布2021-08-30 10:53:05
6800
发布2021-08-30 10:53:05
举报
文章被收录于专栏:Super 前端Super 前端

​ 做数据产品时,我们会经常遇到用户隐私问题(如,禁止追踪)。在最新的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,可以强制指定!

代码语言:javascript
复制
<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就被删除了;持久Cookie会存储在硬盘上,浏览器退出、计算机重启都会存在。如果设置了Discard参数,或者没有设置Expires或Max-Age参数来说明扩展的过期时间,则为会话Cookie。

不同站点使用不同的Cookie

(1)cookie的域属性

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

代码语言:javascript
复制
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站点关联起来。

代码语言:javascript
复制
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常规操作

代码语言:javascript
复制
/**
 * 设置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 "";
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-06-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • HTTP首部
    • 客户端IP地址
      • 用户登录
        • 胖URL
          • Cookie
            • 不同站点使用不同的Cookie
          • Cookie常规操作
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档