Actualizado el 1 de octubre de 2019 Con PTI 2.3 Parece que Safari está reduciendo la utilidad de
localStorage
Además, esta solución debería no considerarse a prueba de futuro. La única forma estable de conservar los datos del lado del cliente en este momento parece ser Cookies HTTP.
Actualizado el 7 de marzo de 2019 – Se agregaron algunos extras advertencias a esta solución. Además, asegúrese de leer mi artículo sobre PTI 2.1que tiene muchos más detalles sobre qué es la Prevención de Seguimiento Inteligente y cómo trabajar con ella.
Parece que Safari está estrechando el cerco sobre las cookies del navegador con la introducción de PTI 2.1 (Prevención de seguimiento inteligente). Entre otras cosas, PTI 2.1 Limita la expiración de las cookies del lado del cliente a 7 días. Cookies del lado del cliente En este contexto se refieren a las cookies configuradas con el doc.cookie
API, que cubriría prácticamente todas las cookies configuradas por bibliotecas de JavaScript vendidas como Google Analytics. análisis.js.
Personalmente, creo que cualquier cosa que obligue a repensar el modelo de cookies es bienvenida. Es extraño y retorcido que todavía dependamos de un almacenamiento del navegador tan frágil y endeble para almacenar datos importantes como identificadores de análisis anónimos, indicadores de autenticación y, básicamente, cualquier cosa que deba conservarse de una página a la siguiente.
Dicho esto, esto puede hacer potencialmente benévolo seguimiento como el que se hace con Google analitico En un sitio internet, es bastante difícil para los usuarios que utilizan el navegador Safari. Dado que GA depende de una cookie del navegador con un vencimiento de dos años (por defecto), este máximo de siete días puede perjudicar seriamente la calidad de los datos.
En este artículo quiero mostrarte cómo utilizar customTask
con localStorage
servir como un respaldo de algún tipo para la persistencia de su ID de cliente basada en cookies.
No es perfecto. Mira el advertencias Capítulo 1 para más detalles. Considere esto como una demostración de tecnología en lugar de una solución definitiva para los problemas de las cookies. Tendremos que confiar en que los proveedores y los navegadores lleguen a un consenso sobre cómo hacerles la vida más difícil a los agentes maliciosos sin comprometer el trabajo que nosotros, la “gente común” debemos hacer para mejorar nuestros sitios internet con datos analíticos propios.
X
El boletín informativo de Simmer
Suscríbete a la Boletín informativo de Simmer ¡Para recibir las últimas noticias y contenidos de Simo Ahava en tu bandeja de entrada de correo electrónico!
Consejo 96: Preserve el ID del cliente en localStorage
No es un truco novedoso. De hecho, el propio Google… Te muestro cómo hacer esto en la documentación para desarrolladores. El problema es que Google solo te muestra cómo reemplazar almacenamiento de cookies con localStorage
Aún quiero aprovechar las cookies, porque hacen que sea mucho más fácil hacer cosas como el seguimiento entre dominios.
El proceso es básicamente este:
-
Cuando se crea un rastreador de Google Analytics, verifique si el ID del cliente persiste en
localStorage
. -
Si este es el caso, verifique si su vencimiento es futuro.
-
Si este es el caso, cree el rastreador con el ID de cliente de
localStorage
(el rastreador generará el_ga
cookie con estos datos también). -
Si no hay ningún ID de cliente en
localStorage
Utilice los mecanismos de creación y almacenamiento de ID de cliente predeterminados de GA. -
Cuando se energetic la etiqueta, escriba el ID del cliente en
localStorage
.
Debería ser una navegación bastante tranquila. Dado que el _ga
galleta y localStorage
se mantienen sincronizados, esto debería funcionar en todos los orígenes, lo cual es algo que localStorage
Por defecto no lo hace.
¡NOTA! Ya que siempre estás comprobando localStorage
En primer lugar, esto significa que si el usuario elimina sus cookies, en realidad no elimina el ID del cliente, porque eso requeriría localStorage
También se debe tirar por la borda. Tal vez quieras hablar de esta solución con tu equipo authorized antes de seguir adelante.
Cómo configurar el ID de cliente
Necesitarás Dos variables de JavaScript personalizadas. Uno para colocar el ID del cliente y uno a conseguir él.
A colocar el ID del cliente, vaya a la customTask
Herramienta de construcciónseleccione la opción denominada Utilice localStorage para conservar ClientIdy luego haga clic en Copiar al portapapeles.
En Administrador de etiquetas de Googlecree una nueva variable de JavaScript personalizada y pegue el contenido del portapapeles en ella. Luego, realice las dos operaciones de mantenimiento siguientes:
-
Eliminar el siguiente texto del inicio del bloque de código:
var customTask =
.Solo eso, nada más. -
Elimina el último carácter de todo el bloque de código, que debe ser un punto y coma.
Luego, modifique el objeto de configuración, si lo desea.
var localStorageCid = {
objectName: 'ga_client_id',
expires: 1000*60*60*24*365*2
};
Si desea que el nombre del objeto esté escrito en localStorage
ser algo diferente a 'ga_client_id'
cambia el valor de la cadena respectiva. expires
El valor es un número en milisegundos Indica cuánto tiempo debe permanecer almacenado el objeto. Se actualiza cada vez que se activa una etiqueta con este customTask
script. Si desea que el almacenamiento caduque antes o después de dos años, cambie el valor de expires
respectivamente.
¡NOTA! No existe un mecanismo de expiración automático con
localStorage
“Caduca” aquí simplemente significa que si la fecha de vencimiento del artículo es anterior a esta, se sobrescribirá con el ID de cliente generado por GA.
Por último, añade esto customTask
a Todas tus etiquetas de Google AnalyticsLa forma más sencilla de hacerlo es utilizar un Variable de configuración de Google AnalyticsAgregalo así:
Recuerda que solo puedes agregar uno customTask
por etiqueta o variable de configuración de Google Analytics. Utilice el customTask
Herramienta de construcción Para compilar un customTask
que incorpora múltiples funciones diferentes.
Cómo obtener el ID de cliente
El segundo Variable de JavaScript personalizada Lo que necesitarás es algo que extraiga el ID del cliente. localStorage
y usar eso en lugar del valor almacenado en el _ga
cookie (si la hay).
Así es como se ve el código de la variable JavaScript personalizada:
operate() {
var objectName = 'ga_client_id';
if (window.localStorage) {
var jsonObj = window.localStorage.getItem(objectName) || '{}';
var obj = JSON.parse(jsonObj);
var now = new Date().getTime();
if (obj.clientId && obj.expires) {
if (now <= obj.expires) {
return obj.clientId;
}
}
}
return;
}
Cambiar el valor de objectName
para que coincida con el nombre de la localStorage
objeto que usted establece en el customTask
arriba. Por defecto, es 'ga_client_id'
.
Este script comprueba si se encuentra un ID de cliente de Google Analytics en localStorage
y que si se encuentra, su tiempo de expiración aún no ha transcurrido. Si se cumplen ambas condiciones, se devuelve el ID de cliente de localStorage
.
Si no se encuentra ningún elemento, o si el objeto ha expirado, o si el navegador no lo admite localStorage
la variable retorna undefined
lo que básicamente significa que GA vuelve a su método predeterminado de generación, recuperación y almacenamiento de ID de cliente.
Necesitas agregar esta variable a cada etiqueta a la que hayas añadido el customTask
desde arribaNuevamente, es imperativo que cada etiqueta use este nuevo localStorage
método de manera consistente, o podría terminar con etiquetas que se activan con el ID de cliente incorrecto, sesgando así sus datos.
Agrega esta variable con el nombre del campo clientId
como esto:
Eso es todo por esta sencilla solución. Hay Un gran problema Con este enfoque, sin embargo, será siempre Toma el ID del cliente de localStorage
Si está disponible y no ha caducado. Esto es problemático en un escenario específico: seguimiento entre dominios.
Cómo respetar el parámetro de enlace entre dominios de GA
Resulta que no es algo tan sencillo de hacer. Incluso si configuras el allowLinker
campo a true
En la etiqueta, el ID del cliente de localStorage
siempre sobrescribirá el campo respectivo en la etiqueta, sin importar cuán válido haya sido el parámetro del enlazador.
Entonces, necesitas replicar cómo allowLinker
funciona, verificando si la URL tiene un parámetro de enlace válido. Si es así, entonces debes omitir el localStorage
buscar, para que analytics.js pueda construir el ID de cliente con el parámetro del enlazador y luego escribir el ID actualizado en localStorage
en el customTask
.
Desafortunadamente, análisis.js No expone el allowLinker
funcionalidad como API: simplemente puede consultar para saber si la URL tiene un parámetro de enlace válido o no.
Esto nos deja con muy pocas opciones. Tu mejor apuesta es realmente reproducir qué allowLinker
No es trivial, así que hice el trabajo preliminar por ti (gracias a De David Vallejo generosa ayuda). Puedes encontrar el código fuente en Esta esencia.
Para agregarlo a su configuración, abra la variable JavaScript personalizada que creó en el capítulo anterior y edítela de esta manera:
operate() {
var objectName = 'ga_client_id';
var checkLinker=operate
if (checkLinker()) {
return;
}
if (window.localStorage) {
var jsonObj = window.localStorage.getItem(objectName) || '{}';
var obj = JSON.parse(jsonObj);
var now = new Date().getTime();
if (obj.clientId && obj.expires) {
if (now <= obj.expires) {
return obj.clientId;
}
}
}
return;
}
Ese gran bloque de código que comienza con var checkLinker=
contiene el código en el GitHubGist Simplemente minimizado para reducir el desorden.
El checkLinker()
El método analiza la URL en busca de un parámetro de enlace válido. Si se encuentra uno, la variable ignora el ID de cliente almacenado en localStorage
y permite que la etiqueta GA construya el ID del cliente a partir del parámetro del enlazador.
Continúe leyendo para conocer una advertencia importante sobre este enfoque.
Advertencias
Naturalmente, esta solución alternativa tiene algunas salvedades.
-
No hay ningún mecanismo involucrado para manejar múltiples
_ga
cookies. Por lo tanto, si tiene un conjunto de etiquetas que necesitan que su ID de cliente se gestione por separado (por ejemplo, debido a Seguimiento de roll-upsimplemente usa uno diferentelocalStorage
nombre del objeto para ese conjunto de etiquetas. -
A diferencia de lo que ocurre normalmente con
localStorage
no tiene que preocuparse por el seguimiento de origen cruzado, ya que_ga
La cookie persistiría en todos los subdominios (asumiendo que tiene lacookieDomain
campo establecido enauto
), y por lo tanto, cuando el usuario llega a un subdominio sin ellocalStorage
objeto, el_ga
En su lugar, se utiliza una cookie y esto se escribe enlocalStorage
en elcustomTask
. -
Sin embargo, el seguimiento entre subdominios es un problema, porque
_ga
La cookie solo sobrevive 7 días sin visitas posteriores. Por lo tanto, si el usuario visita un subdominio el día 1 y otro subdominio el día 8, la cookielocalStorage
La solución descrita aquí será de poca ayuda. -
El seguimiento entre dominios, incluso con el truco del enlazador mencionado en el capítulo anterior, sigue siendo un problema. Google está experimentando con diferentes parámetros del enlazador, por lo que la solución anterior podría quedar obsoleta pronto. Actualizaré el código cuando cambie el formato del parámetro del enlazador.
-
Hay potencial implicaciones legales de ignorar las purgas de cookies como se describe en este artículo (gracias a Brian Clifton) por señalar esto en los comentarios. Recomiendo seriamente tratar esta solución solo como una demostración técnica de lo que podría se hace, no lo que debería estar hecho.
-
Safari ya está bloqueando
localStorage.setItem()
en modo de navegación privada, y otros navegadores podrían seguir su ejemplo.
Y luego, por supuesto, la mayor advertencia:
Este no es el último ataque concentrado que veremos contra el almacenamiento de cookies del navegador.Es possible que otros navegadores sigan su ejemplo, después de que permitieran que Safari recibiera el golpe por ser el primero lo suficientemente audaz como para delimitar las cookies de origen de esta manera.
Pensamientos finales
Quiero que consideres esto como demostración técnica En primer lugar, no es lo suficientemente robusto como para soportar toda la configuración de análisis internet de su empresa, pero debería poder utilizarse en situaciones en las que desee minimizar la pérdida de datos, especialmente con los usuarios de Safari.
Tenga en cuenta que, potencialmente, está dificultando que sus visitantes eliminen sus identificadores de seguimiento. Deje en claro en su declaración de privacidad que este tipo de persistencia está ocurriendo, incluso si no es necesario según las regulaciones o leyes de su región. Es simplemente un buen comportamiento. Los usuarios deberían poder eliminar sus identificadores de seguimiento sin tener que ser científicos para hacerlo.
También espero que esta solución sea temporal. Todavía no está claro cómo evolucionará la Prevención de seguimiento inteligente. Uno de los propósitos del límite de 7 días para las cookies del lado del cliente es evitar que las bibliotecas JavaScript de terceros escriban cookies en un dominio y accedan a ellas en otro subdominio. Si Apple considera esto localStorage
Si bien es posible que intenten sortear esta limitación, es posible que inviertan en medidas para evitar que esto funcione también.
Además, espero que los grandes proveedores que más sufren por esto (como Google y Fb) presenten sus propias soluciones que ayuden a evitar la posible vulneración de la calidad de los datos que está en juego. Por eso, espero que este artículo quede obsoleto pronto, cuando las plataformas sugieran una forma oficialmente suitable de conservar los datos de manera confiable.
Por último, muchos podrían ahora estar aún más tentados a avanzar hacia el seguimiento del lado del servidor debido a la mayor fragilidad de la persistencia del lado del cliente. No necesita un proxy completo del lado del servidor para hacer frente a ITP 2.1. Dado que solo se dirige a las cookies escritas con doc.cookie
simplemente podría generar identificadores anónimos como el ID de cliente de GA del lado del servidor y configurarlos en el Set-Cookies
encabezado de la respuesta HTTP. Asegúrese de consultar mi artículo más extenso sobre ITP 2.1 y la analítica internet para más detalles.
¿Qué opinas de esta última versión de ITP 2.1? ¡Únete a la discusión en los comentarios!