Cookie 和使用者身分識別

為了讓 Google Analytics (分析) 判斷兩個不同的命中屬於同一位使用者,每次命中都必須傳送與該使用者相關聯的不重複 ID。

analytics.js 程式庫會透過「Client ID」欄位完成這項操作。這是隨機產生的唯一字串,儲存在瀏覽器 Cookie 中,因此同一個網站的後續造訪也可與同一個使用者建立關聯。

根據預設,analytics.js 會使用名為 _ga 的單一第一方 Cookie 儲存用戶端 ID,但您可以自訂 Cookie 的名稱、網域和到期時間。analytics.js 建立的其他 Cookie 包括 _gidAMP_TOKEN_gac_<property-id>。這些 Cookie 會儲存其他隨機產生的 ID 和使用者廣告活動資訊。

使用 Cookie 可讓 analytics.js 識別不同的瀏覽工作階段中的不重複使用者,但分析不同瀏覽器或裝置就無法識別不重複使用者。如果網站有自己的驗證系統,則除了用戶端 ID 之外,您也可以使用 User ID 功能,更精確地在他們用來存取網站的所有裝置上識別使用者。

本指南說明如何自訂 Cookie 設定,以及如何設定 User-ID 欄位,以便更準確地評估各工作階段的使用者活動。

下表列出 analytics.js 使用的預設 Cookie 欄位值:

欄位名稱 值類型 預設值
cookieName text _ga
cookieDomain text 下列 JavaScript 運算式的結果:
document.location.hostname
cookieExpires 整數 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',
});

最常見的 Cookie 欄位是 cookieDomain,例如 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 網域設定會在可用的最高層級網域設定 _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 到期時間設為一週,而使用者每五天使用同一個瀏覽器造訪網站,則 Cookie 到期時間會在每次造訪時更新,因此永遠不會過期。

如果設為 false,系統就不會在每次載入網頁時更新 Cookie,而是會根據使用者首次造訪網站的時間,決定 Cookie 到期時間。

設定時可將其他標記附加到 Cookie。標記必須以半形分號分隔。

請勿直接存取 Cookie analytics.js 組合,因為 Cookie 格式日後可能會改變。開發人員應改用 readyCallback 等待 analytics.js 載入,然後再取得儲存在追蹤程式中的 clientId 值。

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

停用 Cookie

在某些情況下,您可能想要使用自己的儲存機制 (例如 localStorageService Worker) 在不使用 Cookie 的情況下,在多個工作階段中保留用戶端 ID。您可以將 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 儲存用戶端 ID,而不是 Cookie:

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 通常是由驗證系統提供。
  2. 在追蹤程式上設定 User ID:
ga('create', 'UA-XXXXX-Y', 'auto', {
  userId: USER_ID
});
ga('send', 'pageview');

處理頁面載入後的驗證作業

在建構單一頁面應用程式或其他動態網站,這類網站會在初次載入網頁後處理使用者登入作業,因此無法在建立追蹤器時設定追蹤器上使用者 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 欄位之前傳送的命中不會包含使用者 ID 值。不過,透過稱為工作階段統合的程序,Google Analytics (分析) 就能在處理期間,將這些命中與正確的使用者建立關聯。