Cookie 和用户识别

为让 Google Analytics(分析)能够确定两个不同匹配是否属于同一用户,必须将与特定用户关联的唯一标识和每个匹配一同发送。

analytics.js 库通过 Client-ID 字段来完成此任务,Client-ID 是随机生成的独一无二的字符串,生成后的 ID 存储在浏览器的 Cookie 中,这样即可在用户和其访问过的相同网站之间建立关联。

默认情况下,analytics.js 使用一个名为 _ga 的第一方 Cookie 来存储该 Client-ID,但该 Cookie 的名称、网域和有效期均可自定义。analytics.js 创建的其他 Cookie 包括 _gidAMP_TOKEN_gac_<property-id>。这些 Cookie 存储用户的其他随机生成 ID 和广告系列信息。

analytics.js 能够借助 Cookie 跨浏览会话识别唯一身份用户,但无法跨浏览器或跨设备识别唯一身份用户。如果您的网站拥有自己的身份验证系统,则除了客户端 ID 之外您还可以使用 User ID 功能,从而更准确地在用户用于访问您网站的所有设备上跨设备识别用户。

本指南介绍如何自定义 Cookie 设置和如何设置 User ID 字段,以便更准确地跨会话跟踪用户。

下表显示了 analytics.js 使用的默认 Cookie 字段值:

字段名称 值类型 默认值
cookieName 文字 _ga
cookieDomain 文字 以下 JavaScript 表达式的结果:
document.location.hostname
cookieExpires 整数 63072000(两年,以秒为单位)

要修改其中任何一个值,可以在传递 create 命令的 fieldObject 中进行指定。例如:

ga('create', 'UA-XXXXX-Y', {
  'cookieName': 'gaCookie',
  'cookieDomain': 'blog.example.co.uk',
  'cookieExpires': 60 * 60 * 24 * 28  // Time in seconds.
});

由于经常需要设置的 Cookie 字段是 cookieDomain,为方便起见 create 命令接受 cookieDomain 字段作为可选的第三个参数:

ga('create', 'UA-XXXXX-Y', 'blog.example.co.uk');

推荐的 JavaScript 跟踪代码段为 cookieDomain 字段设置了字符串 'auto'

ga('create', 'UA-XXXXX-Y', 'auto');

cookieDomain 指定为 'auto' 会启用自动 Cookie 网域配置,它指示 analytics.js 自动确定要使用的最佳 Cookie 网域。

自动 Cookie 网域配置会在可能的最高级网域上设置 _ga Cookie。例如,如果您的网址为 blog.example.co.uk,analytics.js 就会将 Cookie 设置到 .example.co.uk 网域上。此外,如果 analytics.js 检测到您在本地运行服务器(例如 localhost),则会自动将 cookieDomain 设为 'none'

每次当匹配发送至 Google Analytics(分析)时,Cookie 过期时间都会更新为当前时间加上 cookieExpires 字段的值。这意味着,如果您使用默认的 cookieExpires 时间(两年),而用户每个月都会访问您的网站,那么他们的 Cookie 永远都不会过期。

如果您将 cookieExpires 时间设为 0(零)秒,Cookie 将变成基于会话的 Cookie,并在当前浏览器会话结束后马上过期:

您不应该直接访问 analytics.js 设置的 Cookie,因为 Cookie 格式以后可能会变更。相反,开发者应该使用 readyCallback 等待 analytics.js 加载完成,然后获取存储在跟踪器上的 clientId 值。

ga(function(tracker) {
  var clientId = tracker.get('clientId');
});

停用 Cookie

在某些情况下,您可能希望使用自己的存储机制(例如 localStorageService Worker)来跨会话存储客户端 ID,而不是使用 Cookie。为此,您可以将 storage 字段设置为 'none' 来禁止 analytics.js 设置 Cookie。

ga('create', 'UA-XXXXX-Y', {
  'storage': 'none'
});

如果您以自己的方式存储 clientId 字段,则需要确保在创建跟踪器时对 cliendId 字段进行设置。

ga('create', 'UA-XXXXX-Y', {
  'storage': 'none',
  'clientId': '76c24efd-ec42-492a-92df-c62cfd4540a3'
});

要停用 _gac_<property-id> Cookie,请在 create 命令中将 storeGac 字段设置为 false

ga('create', 'UA-XXXXX-Y', {
  storeGac: false,
});

使用 localStorage 来存储客户端 ID

以下代码示例显示了如何修改 JavaScript 跟踪代码段以便使用 localStorage(而非 Cookie)来存储客户端 ID:

var GA_LOCAL_STORAGE_KEY = 'ga:clientId';

if (window.localStorage) {
  ga('create', 'UA-XXXXX-Y', {
    'storage': 'none',
    'clientId': localStorage.getItem(GA_LOCAL_STORAGE_KEY)
  });
  ga(function(tracker) {
    localStorage.setItem(GA_LOCAL_STORAGE_KEY, tracker.get('clientId'));
  });
}
else {
  ga('create', 'UA-XXXXX-Y', 'auto');
}

ga('send', 'pageview');

User ID

借助 User ID,您可以使用一个代表用户的固定不变、独一无二的非个人身份 ID 字符串来跨设备分析会话组。要了解为何应实现 User ID,请查看使用 User ID 功能的优势

要通过 analytics.js 实现 User ID,请按以下步骤操作:

  1. 提供您自己用于代表每个登录用户的字符串 ID,该 ID 必须具备唯一性,持久化存储,且不可用于识别个人身份。此 ID 通常由身份验证系统提供。
  2. 在跟踪器上设置 User ID:
ga('create', 'UA-XXXXX-Y', 'auto', {
  userId: USER_ID
});
ga('send', 'pageview');

页面加载后处理身份验证

如果创建初始网页加载后处理用户登录的单页应用或其他动态网站,在创建时不能执行在跟踪器上设置 User ID 值的过程。

在这种情况下,您可以使用 set 命令在获知该值后立即在跟踪器上进行设置。

// Creates the tracker and sends a pageview as normal
// since the `userId` value is not yet known.
ga('create', 'UA-XXXXX-Y', 'auto');
ga('send', 'pageview');

// At a later time, once the `userId` value is known,
// sets the value on the tracker.
ga('set', 'userId', USER_ID);

// Setting the userId doesn't send data to Google Analytics.
// You must also use a pageview or event to send the data.
ga('send', 'event', 'authentication', 'user-id available');

如果使用此方法,在设置 userId 字段前发送的匹配不会包含 User ID 值。然而,利用会话统一这一过程,Google Analytics(分析)可以在处理过程中将这些匹配与正确的用户关联。