开发者:实现可靠持久设备 ID 的 5 个步骤 原文标题:Developers: 5 Steps to Reliable Persistent Device IDs
内容概要总结
本文是设备情报厂商 ShieldLabs 的技术博客(署名 Yahor Papou),系统讲解持久设备 ID 的概念、边界与工程实践。作者把持久设备 ID 定义为本地生成、本地存储、用于跨会话识别 App 实例或设备的稳定标识符,强调它只能用于诊断、限流和次级反欺诈信号,绝不能当作身份认证凭证,且必然会被清除数据、卸载或恢复出厂重置。文章区分安装级 ID(如 FID)、设备级 ID(锚定 Widevine/MediaDrm 或 Keychain)与会话级 ID 三类,并厘清它与硬件标识符(IMEI/MAC)、广告 ID 的差别。实现层面,文章对比 Android(Widevine/MediaDrm,回退到由 Keystore 支撑的 EncryptedSharedPreferences)与 iOS(Keychain,kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly 可避开 iCloud 备份)的持久化上限,给出“创建、持久化、读取、迁移、重新生成”的安全流程与迁移/对账模式。隐私合规部分援引 GDPR、CCPA、NIST SP 800-63B。文末为其托管设备信号产品做介绍。
翻译内容
原文内容(English)

最后更新于 2026 年 9 月 23 日 · 11 分钟阅读
持久设备 ID(persistent device id)是你的 App 或后端生成并存储在本地的一个稳定标识符,用于跨会话识别同一个 App 实例或设备。把它用于诊断、限流和次级反欺诈信号,绝不要当作身份认证凭证。它可以、而且确实会被清除 App 数据、卸载或恢复出厂设置重置,因此任何围绕它构建的系统都需要为身份丢失准备回退路径。
- 持久设备 ID 存储在本地,用于跨会话识别 App 实例,但在清除 App 数据、卸载或恢复出厂设置时会重置。
- Android 和 iOS 提供不同的存储方式,可以在重装后存活,但无法在整机擦除后存活,其中 Web 存储最易失。
- 使用系统 API,如 Firebase Installation ID 或平台特定的加密存储,校验写入并迁移遗留数据以确保可靠性。
- 绝不把设备 ID 当作身份证明或硬件标识符,并与广告 ID 和身份认证凭证保持清晰分离。
- 在设计之初就纳入对账(reconciliation)和服务端信号,限制保留期限,将设备 ID 严格绑定到隐私政策和法规合规。
什么是持久设备 ID,何时该使用它?
持久设备 ID 是一个本地生成、本地存储的值,能在 App 重启后存活,并视存储层而定,有时能在重装后存活。它与开发者常混淆的三个相邻概念不同:
- 安装级 ID(Install-scoped ids):每次 App 重装或清除 App 数据时重置。Firebase Installation ID(FID)属于此类。
- 设备级 ID(Device-scoped ids):通过锚定到硬件支撑的存储(如 Android 的 Widevine/MediaDrm 或 iOS 的 Keychain)来力求在重装后存活,尽管连这些也无法免于恢复出厂设置。
- 会话级 ID(Session-scoped ids):按设计仅在浏览器标签页或 App 会话存续期间存在,是 Web 上的常态。
正当的工程用途包括:诊断(把崩溃报告关联到一致的实例)、回访设备检测、对匿名流量做限流启发式判断,以及为更广泛的反欺诈模型提供次级信号。当你需要在用户登录前或无需用户登录就识别一个客户端时,适合构建设备 ID。每当操作涉及资金或账户风险时,都依赖服务端认证。二者是互补的,不可互换。
持久设备 ID 不是什么
设备 ID 不是身份证明,也不是凭证。任何把它当作登录因子的人,都是在建立一个会自我重置的地基上。
它也不等同于硬件标识符。IMEI 和 MAC 地址是与物理无线电或网络接口绑定的硬件级值。Android 和 iOS 多年来都已限制 App 访问这些值,从而推动开发者转向软件生成、以 App 为作用域的替代方案。
它也不是广告 ID,尽管二者在闲谈中常被捆绑在一起。广告 ID 可由用户重置、可在操作系统层面选择退出,而且 Android 自身的政策禁止缓存它。开发者必须每次重新调用 API,不能在违反平台规则的情况下悄悄把它与一个持久内部标识符关联。
一个快速厘清作用域混淆的直觉检查:
- 硬件 ID(IMEI/MAC):绑定物理硬件,如今 App 基本无法访问。
- 广告 ID:用户可重置、可选择退出,必须实时获取而非缓存。
- App 作用域的持久 ID:由开发者生成、本地存储,在清除数据或卸载时重置。
专家提示:如果你的合规团队问你的设备 ID“是不是像广告 ID”,他们需要听到的答案是“不是”,而他们应当追问的下一个问题是:你是否以一种可能意外与 PII 合并的方式在存储它。
Android、iOS 和 Web 如何处理持久化存储?
每个平台给你不同的持久化上限,而且它们都不承诺永久。
Android 提供两条现实路径。更强的选项使用 Widevine/MediaDrm——一个在大多数设备上可用的、硬件支撑的预置标识符,它往往比 App 私有存储存活更久。当 MediaDrm 不可用时,惯用回退方案是生成一个 UUID 并写入由 Android Keystore 支撑的 EncryptedSharedPreferences。当用户清除 App 数据、卸载 App 或执行恢复出厂设置时,两种方案都会重置。它们都无法在整机擦除后存活,而这是设计使然,不是你需要绕过的 bug。
iOS 形态不同。Keychain 是持久化、服务作用域存储的标准,把可访问性属性设为 kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly 可以让该值不进入 iCloud 备份,同时仍在同一设备上跨 App 重装存活——这与 Android 的 EncryptedSharedPreferences(通常无法在重装后存活)形成了有意义的区别。“仅此设备”这个条款很重要:备份并恢复到新手机时,Keychain 条目不会随之迁移。
Web 是三者中最易失的,且是刻意为之。PointerEvent.persistentDeviceId 会按浏览器会话重新分配,正是为了防止跨站点或跨会话指纹识别,而 Web Storage 承受着多年来一直在挤压长寿命 cookie 的同一隐私压力。把任何浏览器端 ID 当作会话级处理,除非你把它与一个有自己的生命周期规则的服务端下发 cookie 配对。
如果你的后端需要为同一用户跨 Android、iOS 和 Web 客户端对账身份,别指望单个设备 ID 能做到这件事。围绕账户级信号来构建对账,并把每个平台的设备 ID 当作本地线索,而不是共享密钥。
如何可靠地实现持久设备 ID?
先使用系统提供的选项,再考虑自建。对于 App 实例分析,Firebase Installation ID 是直接的选择,Android 自身的身份指引也推荐它,而不是自造一套自定义 UUID 方案。如果你涉及广告用例,请严格遵循广告 ID 规则,包括不得缓存的要求。
当你确实需要自定义设备 ID 时,一个安全的生成模式如下:
- 在客户端生成一个 UUID。
- 同步地把它写入加密存储(Android 上 EncryptedSharedPreferences,iOS 上 Keychain)。
- 在把该 ID 返回给 App 逻辑中的任何地方之前,先验证写入成功。
- 如果存在来自旧版 App 的遗留明文 ID,把它迁移到加密存储,并且只在确认加密写入后才删除明文副本。
- 如果持久存储完全无法初始化,返回 null,而不是返回一个会悄然消失并让下游分析困惑的临时内存 ID。
这个“创建、持久化、读取、迁移、重新生成”流程,正与 persistent_device_id Flutter 插件处理该问题的方式一致:Android 上优先 MediaDrm/Widevine,回退到 EncryptedSharedPreferences,iOS 上用 Keychain,当没有可用的持久存储时明确返回 null。
专家提示:绝不要让失败的加密写入静默通过。一个在内存中“存在”却从未落盘的设备 ID 会在下次冷启动时消失,而你将花一整个调试时段去追一个幻影般的身份分裂,而一行日志本可以捕捉到它。
错误处理应得到与正常路径同样的严谨。当存储再次可用时重试写入,而不是图省事回退到未加密存储。
设备 ID 在重置、重装或备份后会怎样?
若干日常事件会改变或摧毁设备 ID,你的系统需要预期所有这些事件,而不是把任何一个当作边缘情况:
- App 卸载并重装(重置 Android 上由 EncryptedSharedPreferences 支撑的 ID;iOS 上 Keychain ID 可能存活,取决于可访问性设置)。
- 清除 App 数据(立即重置两个平台本地存储的 ID)。
- 恢复出厂设置(重置一切,多数情况下包括 MediaDrm 派生的值)。
- 备份并恢复到新设备(标记为“仅此设备”的 Keychain 条目不会迁移)。
- 重大操作系统更新(罕见,但偶尔会使 Android 上由 Keystore 支撑的条目失效)。
避免重复身份的分裂(duplicate identities)的迁移模式在概念上很直接:在 App 启动时,检查旧存储位置中是否有遗留 ID,如果存在,则在签发新 ID 之前原子地把它迁移到新的加密存储中。绝不要先生成新 ID 再检查遗留 ID。这个顺序正是你最终得到两个 ID 代表同一个真实安装的原因。
在服务端,不要把设备 ID 改变当作身份的硬性丢失。通过短期活动签名、账户令牌或渐进式摩擦来关联档案的对账方法,往往比把每个新 ID 都当作全新访客更能站得住。
专家提示:记录你检测到的每一次 ID 变化,哪怕是预期内的变化。一次 App 更新后“ID 变化”事件的激增,往往是你发现某条迁移路径悄然断裂的第一信号。
如何处理隐私和政策要求?
把持久化当作你在管理的一项负债,而不是你在最大化的一个功能。几条运营规则能让你既站在平台政策正确的一边,也符合合理的用户预期:
- 尽量减少你保留设备 ID 的时间,并在产品语境合理时提供面向用户的重置路径。
- 绝不把广告 ID 与 PII 或你自己的持久内部 ID 关联。Play 政策把这种组合视为违规,而 API 的不得缓存要求部分正是为了强制执行这一点。
- 对于任何类似认证的东西,优先使用 WebAuthn 或 passkey——这些是来源作用域的加密凭证,NIST 的 SP 800-63B 指引将其视为更强的认证器类别。设备 ID 应当作为次级信号出现在同一个请求中,而不是决定性因素。
- 把你的保留窗口、轮换触发条件和同意立场记录在法律团队真正找得到的地方,而不只是写在代码注释里。
- 像记录任何其他存储错误一样记录 ID 生成失败。此处的静默失败会在数月后累积成混乱的分析数据。
包括欧盟的 GDPR 和加州的 CCPA 在内的监管框架,通常在持久设备标识符能够与个人关联时,将其视为个人数据,这意味着同意和披露义务会像对待 cookie 一样适用。请与法律顾问确认你所在具体司法辖区的要求,而不是想当然地认为一套通用工程模式就能覆盖你。
添加设备 ID 的实用检查清单是什么?
在你写下第一行存储代码之前,按这个顺序过一遍:
- 预先决定该信号的角色:分析与诊断,还是反欺诈检测输入。答案会改变实现需要多严谨。
- 先伸手去用系统 API。FID 覆盖了大多数 App 实例分析需求,无需自定义存储代码。
- 当自定义 ID 不可避免时,使用带原子写入的加密存储,并安全地迁移任何遗留明文回退,而不是留下两个相互竞争的值。
- 从第一天起就把服务端对账和日志纳入设计,而不是等到第一张关于重复账户的支持工单之后再打补丁。
- 在你的技术栈中处处把设备 ID 当作软信号。对任何敏感操作都要求更强的验证——密码、passkey 或 OTP。
设备信号在真实反欺诈栈中的位置
设备信号的价值在于作为更广泛风险评分的输入,而不是凭自身作为裁决。最强的配置会把设备 ID 与网络、行为和账户历史信号结合起来,然后让每个贡献信号都足够可见以便审计和调整。接入一个客户端 SDK 加服务端评分通常很快,而且它在调试上的回报不亚于检测。
Yahor Papou,ShieldLabs 首席营销官
ShieldLabs 如何融入你的设备信号策略
从头构建可靠的设备识别,意味着在你触及反欺诈逻辑之前,先要解决持久化、迁移和对账。ShieldLabs 为工程团队提供了已经组装好的这一基础:300+ 设备与网络信号、由这些信号构建的风险评分,以及覆盖 VPN、代理、Tor、Private Relay 和反检测浏览器检测的检测能力,通过一段 JavaScript 片段和面向 Node.js、Python、Go、PHP 的服务端 SDK 交付。每个评分都附带其背后的信号,因此你的团队能确切看到原因,并为每个案例选择处置方式,而不是信任一个黑盒。就持久化而言,该平台的回访者识别(returning-visitor recognition)即使在被清除 cookie、轮换 IP 之后也能实现 99.9% 的识别准确率。其设置旨在快速到达你的第一个信号,提供 5,000 次免费识别(一次性),无需信用卡即可开始。如果跨重置对账身份正在吞噬你的迭代时间,看看产品页,判断一个托管信号层是否比自建更快。
来源
- Work with advertising IDs | Android Developers
- PointerEvent.persistentDeviceId - MDN
- NIST SP 800-63B Digital Identity Guidelines
- persistent_device_id | Flutter package
推荐

用 W3C 隐私规范与 ShieldLabs 实现 4 步 Node.js 设备指纹识别
实现遵循 W3C 隐私指引的 Node.js 设备指纹识别。按 4 个步骤完成集成,涵盖来源(provenance)、置信度评分、漂移检查……
Yahor Papou 首席营销官2026 年 10 月 4 日

设备指纹识别网络信号
面向 Web 反欺诈团队的设备欺骗检测
浏览器、设备与 TLS 信号如何揭示 Web 上的欺骗行为,以及移动端证明应归于哪个独立的防御层。
Yahor Papou 首席营销官 2026 年 10 月 2 日

设备指纹识别反欺诈
反欺诈中的设备指纹识别:GDPR 与英国 PECR 考量
在英国和欧盟将设备指纹识别用于反欺诈时,关于目的、同意例外、保留期限与用户权利的实用指南。
Yahor Papou 首席营销官 2026 年 9 月 29 日

Last updated on September 23, 2026 · 11 min read
A persistent device id is a stable identifier your app or backend generates and stores locally to recognize the same app instance or device across sessions. Use it for diagnostics, rate limiting, and secondary fraud signals, never as an authentication credential. It can and will be reset by app data clears, uninstalls, or factory resets, so any system built around it needs a fallback path for identity loss.
- A persistent device id is stored locally to recognize app instances across sessions but resets when app data is cleared, uninstalled, or the device is factory reset.
- Android and iOS offer different storage methods that can survive reinstallations but not full device wipes, with Web storage being the most volatile.
- Use system APIs like Firebase Installation ID or platform-specific encrypted storage, verifying writes and migrating legacy data to ensure reliability.
- Never treat a device id as proof of identity or a hardware identifier, and keep clear separation from advertising IDs and authentication credentials.
- Build reconciliation and server-side signals into your design, and limit retention, linking device ids strictly to privacy policies and regulation compliance.
What Is a Persistent Device ID, and When Should You Use One?
A persistent device id is a locally generated, locally stored value that survives app restarts and, depending on the storage layer, sometimes survives reinstalls. It differs from three adjacent concepts developers often conflate:
- Install-scoped ids reset every time the app is reinstalled or app data is cleared. Firebase Installation ID (FID) falls into this category.
- Device-scoped ids aim to survive reinstalls by anchoring to hardware-backed storage like Android's Widevine/MediaDrm or iOS Keychain, though even these are not immune to a factory reset.
- Session-scoped ids exist only for the length of a browser tab or app session, by design, and are the norm on the web.
Legitimate engineering uses include diagnostics (tying crash reports to a consistent instance), returning-device detection, rate-limiting heuristics on anonymous traffic, and feeding a secondary signal into a broader fraud model. Prefer building a device id when you need to recognize a client before a user logs in or without requiring one. Rely on server-side authentication whenever the action carries financial or account risk. The two are complementary, not interchangeable.
What a Persistent Device ID Is Not
A device id is not proof of identity, and it is not a credential. Anyone treating it as a login factor is building on a foundation that resets itself.
It's also not the same thing as a hardware identifier. IMEI and MAC address are hardware-level values tied to the physical radio or network interface. Both Android and iOS have restricted app access to these for years, pushing developers toward software-generated, app-scoped alternatives instead.
It's not an advertising id, either, even though the two get bundled together in casual conversation. The Advertising ID is user-resettable, opt-outable at the OS level, and Android's own policy prohibits caching it. Developers must call the API fresh each time and cannot silently link it to a persistent internal identifier without violating platform rules.
A quick gut check for scope confusion:
- Hardware id (IMEI/MAC): tied to physical hardware, largely inaccessible to apps now.
- Advertising id: user-resettable, opt-outable, must be fetched live rather than cached.
- App-scoped persistent id: developer-generated, stored locally, resets on data clear or uninstall.
Pro Tip: If your compliance team asks whether your device id "is like an advertising id," the answer they need to hear is no, and the follow-up question they should ask is whether you're storing it in a way that could accidentally merge with PII.
How Do Android, iOS, and Web Handle Persistent Storage?
Each platform gives you a different persistence ceiling, and none of them promise permanence.
Android offers two realistic paths. The stronger option uses Widevine/MediaDrm, a hardware-backed provisioning identifier available on most devices, which tends to survive longer than app-private storage. When MediaDrm isn't available, the practiced fallback is generating a UUID and writing it to EncryptedSharedPreferences, backed by the Android Keystore. Both approaches reset when the user clears app data, uninstalls the app, or performs a factory reset. Neither survives a full device wipe, and that's by design rather than a bug you need to work around.
iOS takes a different shape. The Keychain is the standard for persistent, service-scoped storage, and setting the accessibility attribute to kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly keeps the value off iCloud backups while still surviving app reinstalls on the same device, a meaningful distinction from Android's EncryptedSharedPreferences, which typically does not survive reinstall. That "this device only" clause matters: back up and restore to a new phone, and the Keychain entry does not travel with it.
Web is the most volatile of the three, deliberately. PointerEvent.persistentDeviceId is re-assigned per browser session specifically to prevent cross-site or cross-session fingerprinting, and Web Storage sits under the same privacy pressure that has been squeezing long-lived cookies for years. Treat any browser-side id as session-scoped unless you're pairing it with a server-issued cookie that has its own lifecycle rules.
If your backend needs to reconcile identity across Android, iOS, and web clients for the same user, don't expect a single device id to do that job. Build reconciliation around account-level signals and treat each platform's device id as a local hint, not a shared key.
How Do You Implement a Persistent Device ID Reliably?
Start with the system-provided option before you build your own. For app-instance analytics, Firebase Installation ID is the straightforward choice, and Android's own identity guidance recommends it over rolling a custom UUID scheme. If you're touching advertising use cases, follow the Advertising ID rules exactly, including the no-caching requirement.
When you do need a custom device id, a safe generation pattern looks like this:
- Generate a UUID client-side.
- Write it to encrypted storage (EncryptedSharedPreferences on Android, Keychain on iOS) synchronously.
- Verify the write succeeded before returning the id anywhere in your app logic.
- If a legacy plaintext id exists from an older app version, migrate it into encrypted storage and remove the plaintext copy only after the encrypted write is confirmed.
- If durable storage can't be initialized at all, return null rather than a temporary in-memory id that will silently disappear and confuse downstream analytics.
This create, persist, read, migrate, regenerate flow mirrors how the persistent_device_id Flutter plugin handles the problem: MediaDrm/Widevine first on Android, EncryptedSharedPreferences as fallback, Keychain on iOS, and an explicit null return when nothing durable is available.
Pro Tip: Never let a failed encrypted write pass silently. A device id that "exists" in memory but never made it to disk will vanish on the next cold start, and you'll spend a debugging session chasing a phantom identity split that a single log line would have caught.
Error handling deserves the same rigor as the happy path. Retry writes when storage becomes available again, rather than falling back to an unencrypted store out of convenience.
What Happens to a Device ID After Reset, Reinstall, or Backup?
Several everyday events change or destroy a device id, and your system needs to expect all of them rather than treat any as an edge case:
- App uninstall and reinstall (resets EncryptedSharedPreferences-backed ids on Android; Keychain ids may survive on iOS depending on accessibility settings).
- Clearing app data (resets both platforms' locally stored ids immediately).
- Factory reset (resets everything, including MediaDrm-derived values in most cases).
- Backup and restore to a new device (Keychain entries marked "this device only" do not transfer).
- Major OS updates (rare, but occasionally invalidate Keystore-backed entries on Android).
The migration pattern that avoids duplicate identities is straightforward in concept: on app start, check for a legacy id in the old storage location, and if one exists, migrate it into the new encrypted store atomically before issuing a fresh id. Never generate a new id first and check for a legacy one second. That ordering is how you end up with two ids representing one real installation.
Server-side, don't treat a changed device id as a hard loss of identity. Reconciliation approaches that link profiles through short-term activity signatures, account tokens, or incremental friction tend to hold up better than treating every new id as a brand-new visitor.
Pro Tip: Log every id change you detect, even the expected ones. A spike in "id changed" events after an app update is often your first signal that a migration path silently broke.
How Do You Handle Privacy and Policy Requirements?
Treat persistence as a liability you're managing, not a feature you're maximizing. A few operating rules keep you on the right side of both platform policy and reasonable user expectations:
- Minimize how long you retain a device id, and offer a user-facing reset path where the product context makes that reasonable.
- Never link the Advertising ID to PII or to your own persistent internal id. Play policy treats that combination as a violation, and the API's no-caching requirement exists partly to enforce it.
- For anything resembling authentication, prefer WebAuthn or passkeys, origin-scoped cryptographic credentials that NIST's SP 800-63B guidance treats as the stronger authenticator class. A device id belongs in the same request as a secondary signal, not as the deciding factor.
- Document your retention window, rotation triggers, and consent posture somewhere your legal team can actually find it, not just in a code comment.
- Log id-generation failures the same way you'd log any other storage error. Silent failures here compound into messy analytics months later.
Regulatory frameworks including GDPR in the EU and CCPA in California generally treat persistent device identifiers as personal data when they can be linked to an individual, which means consent and disclosure obligations apply the same way they would to cookies. Confirm your specific jurisdiction's requirements with counsel rather than assuming a general engineering pattern covers you.
What's the Practical Checklist for Adding a Device ID?
Before you write a line of storage code, work through this order:
- Decide the signal's role upfront: analytics and diagnostics, or a fraud-detection input. The answer changes how much rigor the implementation needs.
- Reach for system APIs first. FID covers most app-instance analytics needs without custom storage code.
- When a custom id is unavoidable, use encrypted storage with atomic writes, and migrate any legacy plaintext fallback safely rather than leaving two competing values in play.
- Build server-side reconciliation and logging into the design from day one, not as a patch after the first support ticket about duplicate accounts.
- Treat the device id as a soft signal everywhere in your stack. Require stronger verification, a password, a passkey, an OTP, for anything sensitive.
Where Device Signals Fit in a Real Fraud Stack
Device signals earn their place as inputs to a broader risk score, not as a verdict on their own. The strongest setups combine a device id with network, behavioral, and account-history signals, then keep every contributing signal visible enough to audit and adjust. Wiring in a client SDK plus server-side scoring is usually fast, and it pays off in debugging as much as detection.
Yahor Papou, CMO at ShieldLabs
Where ShieldLabs Fits Into Your Device Signal Strategy
Building reliable device recognition from scratch means solving persistence, migration, and reconciliation before you even get to the fraud logic. ShieldLabs gives engineering teams that groundwork already assembled: 300+ device and network signals, a risk score built from them, and detection covering VPNs, proxies, Tor, Private Relay, and anti-detect browser detection, delivered through a JavaScript snippet and server-side SDKs for Node.js, Python, Go, and PHP. Every score ships with the signals behind it, so your team sees exactly why and chooses the action for each case rather than trusting a black box. For persistence specifically, the platform's returning-visitor recognition delivers 99.9% identification accuracy even after cleared cookies and rotated IPs. Setup is designed to be quick to your first signal, with 5,000 free identifications (one time) and no card required to start. If reconciling identity across resets is eating your sprint time, check the product page and see whether a managed signal layer is faster than building your own.
Sources
Recommended

Browser fingerprintingDevice fingerprinting
4 Step Node.js Device Fingerprinting with W3C Privacy and ShieldLabs
Implement Node.js device fingerprinting that follows W3C privacy guidance. Follow a 4 step integration with provenance, confidence scores, drift checks,...
Yahor PapouChief Marketing OfficerOctober 4, 2026

Device fingerprintingNetwork signals
Device Spoofing Detection for Web Fraud Teams
How browser, device and TLS signals reveal spoofing on the web, plus where mobile attestation belongs in a separate defense layer.
Yahor PapouChief Marketing OfficerOctober 2, 2026

Device fingerprintingFraud prevention
Device Fingerprinting for Fraud: GDPR and UK PECR Considerations
A practical guide to purpose, consent exceptions, retention and rights when using device fingerprinting for fraud prevention in the UK and EU.
Yahor PapouChief Marketing OfficerSeptember 29, 2026
文中图片(共 1 张)
