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 跨浏览会话识别唯一身份用户,但无法跨浏览器或跨设备识别唯一身份用户。如果您的网站拥有自己的身份验证系统,则除了 Client-ID 之外,您还可以使用 User ID 功能,从而更准确地在用户用于访问您网站的所有设备上跨设备识别用户。

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

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

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

要修改上述任意值,您可以在向 create 命令传递的 fieldObject 中指定具体的值。例如:

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

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

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

推荐使用的 Google Analytics(分析)代码将 cookieDomain 字段设置为字符串 'auto'

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

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

启用 Cookie 网域自动配置后,analytics.js 会在它能够设置的最高一级网域上设置 _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,并在当前浏览器会话结束后马上过期:

cookieUpdate 设置为 true(默认值)时,analytics.js 会在每次网页加载时更新 Cookie。这样一来,系统在更新 Cookie 有效期时会以最近一次访问网站的时间为起点。例如,如果将 Cookie 有效期设置为 1 周,假使某位用户每 5 天使用同一浏览器访问一次网站,那么 Cookie 有效期在用户每次访问时都会更新,实际上将永远不会过期。

设置为 false 时,Cookie 不会在每次网页加载时更新。这样一来,Cookie 有效期会以用户首次访问网站的时间为起点。

如果设置了“Cookie 标记”值,则会在 Cookie 后追加额外的标记。各标记间必须用英文分号分隔。

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

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

停用 Cookie

在某些情况下,您可能希望使用自己的存储机制(例如 localStorageService Worker)来跨会话存储 Client-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 来存储 Client-ID

以下代码示例展示了如何修改 JavaScript 代码以便使用 localStorage(而非 Cookie)来存储 Client-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 字符串(该 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(分析)可以在处理时将这些命中与正确的用户关联起来。