1. 介绍
人们通过用户代理体验 Web: 代表使用者检索、呈现 Web 内容并对其执行操作的软件。 Web 浏览器是最为人熟知的例子, 但还有各种其他软件扮演着相同的角色。 “代理”一词并非偶然: 用户代理为其用户服务, 当用户的利益与另一方的利益发生冲突时, 它会优先服务于用户 。
本文档描述了什么样的软件才是“用户代理”, 以及用户代理对其用户负有的职责: 保护、诚实和忠诚。 这些职责并非旨在作为独立的要求, 而是应通过社区讨论来确立, 并体现在用户代理所实现的标准中。
本文档面向:
-
希望在自己的规范或文档中复用或引用这些概念的技术作者。
-
希望使实现与优先考虑其用户的设计和隐私原则保持一致的用户代理开发者。
-
希望理解用户代理为何将用户隐私和安全置于其他利益相关方(包括开发便利性)之上的Web 开发者。
-
希望了解指导用户代理行为的义务、原则和预期的监管者和政策制定者。
2. 什么是 用户代理
一个 用户代理 是 代表其用户与自身以外的网站交互的任何软件实体, 这种交互 包括仅呈现网站内容,或执行用户请求或授权的 操作。 能够从公共 Web 加载任意内容 的产品就是用户代理。 一个人在日常生活中可以使用多种不同的用户代理。
在其他语境中,“用户代理”一词用于指帮助用户完成任务 的软件实体。 尤其是电子邮件客户端, 至少从 20 世纪 80 年代末起就被称为“邮件用户代理”。 [RFC1123] 操作系统;PDF、电子书和图像查看器; 凭证管理器(包括数字钱包);以及许多其他 类型的软件, 也都可以被视为用户代理。 但是,本文档和 Web 规范使用这个术语时, 特指代表用户与网站交互的软件。
在 Web 的语境中, 最常见的用户代理类型是 Web 浏览器——包括能够访问跨站点 链接的应用内浏览器。 不过,用户代理还包括其他工具,例如 搜索引擎、语音驱动的助手和生成式 AI 系统, 它们会展示网站内容的片段或摘要, 帮助用户浏览网站并与网站交互, 或代表用户执行自动化操作。
用户代理的行为并非完全由 Web 标准 乃至一般意义上的技术规范所定义。 尤其是, 用户代理会选择实现哪些功能, 以及每项功能向用户开放到何种程度, 以最好地服务其用户。 它们围绕所实现的功能 实施专有的用户界面和其他行为。 例如, 权限提示、错误消息和隐私指示器中的措辞和图标 往往因用户代理而异。 用户代理还会添加任何规范都未要求的功能, 例如书签、阅读模式和开发者工具。
2.1. 用户代理作为软件组件
作为软件组件,用户代理可以是更大型应用的一部分, 也可以调用实现 Web 平台或其部分功能的库。
当应用明确区分 其中属于用户 代理的部分与不属于用户代理的部分时, 那么只有其中的用户代理部分, 即浏览用户代理自身之外内容的部分, 才需要遵守用户 代理职责。 明确仅用于显示应用自身内容的部分 可以代表应用自身行事, 但应用仍然需要 让用户清楚地了解 应当预期应用不同部分会有怎样的行为。 如果内部内容与外部内容之间的区分过于微弱——例如 应用在浏览外部内容时不显示地址栏 或其他用于指示内容来源的标识——那么 应用在显示自身内容时也应遵守用户代理职责。
类似地,实现 Web 平台的库
是否属于完整的用户代理,取决于它
所执行的操作。
有些库,例如 SFSafariViewController
和 Android Custom Tabs
承担了实现用户代理职责的责任,
并负责明确区分其浏览的外部内容
与嵌入应用所控制的内容。
这些库属于用户代理。
其他库,例如 Android、 iOS 和 Windows WebView 库, 被设计用于支持多种类型的应用。 由于其中一些应用仅包含自身的内容, WebView 库本身并不旨在成为用户代理, 并且它们不会实现用户代理职责。
归根结底,嵌入 WebView 的应用有责任 遵守用户代理 职责, 如果该应用或其任何部分充当用户 代理。 如果应用仅通过用户代理库浏览外部内容,这一点可以很直接地做到。 开发者在使用非用户代理 WebView 实现应用内浏览器时, 需要格外注意遵守用户代理 职责。
3. 用户代理的职责
每个用户代理都为其用户服务(互联网服务于最终用户), 而不是为其他任何利益相关方服务。 用户代理对其用户负有各种 职责, 这些职责通过集体讨论确立, 并体现在用户代理所实现的各种标准中。
3.1. 保护
访问网页应该是安全的。 访问页面本身不会 让页面更改用户的计算机或环境, 例如安装软件或访问硬件。
向网站或其他观察者透露的任何数据 都应符合用户的偏好, 并遵循数据 最小化原则。 特别是,用户代理会采取措施 限制网站跟踪用户活动的可能性 [unsanctioned-tracking]。
用户可以选择共享更多 信息, 例如填写表单或授予权限。 即便如此,用户代理也会帮助用户避免受到欺骗,并 在页面尝试获取更高权限的访问时明确发出提示。
用户代理需要防止站点上的恶意代码 越过用户代理本身 修改用户计算机或访问其他源。 用户代理通过对组件沙盒隔离、 使用内存安全语言、 并配备安全团队响应漏洞来履行这一保护职责。 这些防护措施需要不断进化以应对新威胁。
用户代理应防止页面访问本地文件, 除非用户明确选择或打开文件。 为此,通常采取如下措施:
-
为每个
file:URL分配独立的源, -
从
<input type=file>上传表单中移除路径信息, -
限制@font-face规则可用的本地字体。
但用户依然可以选择共享文件, 如上传或下载。 File System Access 这样的API不违背此职责, 前提是用户有能力做出明智决定。
3.2. 诚信
用户代理在 Web 与其用户之间发挥中介作用, 以用户能够理解的形式解释正在发生的事情。 当用户代理自动执行操作或代表用户执行操作时,它会清楚地传达这些 操作及其后果。当用户代理转换内容或代表用户执行操作时,若其采用的 方式不易被用户察觉,它会以有意义的方式呈现其所依据的来源、 所执行的操作以及这些操作的结果。
用户代理可以采用多种方式进行说明,包括 文本、权限提示、指示器、预览以及其他界面元素。 应考虑这些元素的位置,以及是否有任何内容需要强调。
诸如 媒体捕获和流之类的规范, 包含 隐私指示器 要求, 这些要求要求用户代理说明网站某些特定类型的行为, 但当用户需要了解其他行为时,也期望用户代理使用相同的技术, 即使规范并未特别指出该行为。
诚实的用户代理会积极努力向其用户呈现事实。 它不仅仅是不说谎。 它的说明 会清楚地反映当前状态和可能的后果, 避免使用委婉或含糊的表达, 并在敏感活动发生时使其显而易见。
用户代理选择何时以及多频繁地显示这些说明, 使说明在有帮助时出现并起到告知作用,而不是造成干扰。 用户代理确保用户能够控制是否以及何时作出决定。
如果用户代理说服用户向浏览器 (而不是某个特定网站)提供账户信息,却又悄然默认将这些信息用于 跟踪或广告定向等其他目的,那么它就没有做到诚实。用户 代理需要清楚地说明存在权衡取舍之处。
3.3. 忠诚
用户代理将其用户的利益置于 其实现者的利益之上, 也置于任何其他方的利益之上。
忠诚义务同样适用, 当提供用户代理的组织 参与的决策会塑造用户代理的能力 或限制用户未来的选择时。 由于用户在这些决策中可能未得到充分代表, 忠诚要求这些组织采取合理措施 来识别并代表多样化的用户利益, 同时不将自身视为用户的唯一代表。
用户代理也可以帮助其用户 向页面作出可信承诺。 可信承诺是对用户未来选择的有意限制, 页面要求用户接受这种限制后才提供服务。 在获得服务后继续履行该承诺,并不违背对用户的忠诚。 忠于用户的承诺仅约束对这些服务的使用, 而不约束用户的其他数据、设置或选择。 用户仍然可以放弃该服务并清除自己的数据, 而不会产生任何进一步的后果。
大约在 2012 年, 用户代理供应商和 W3C 开始担心,版权持有者 只会允许用户在非 Web 平台上播放其媒体, 因为这些平台允许他们使用 DRM ,在技术上增加制作额外媒体副本的难度。 仅仅作出承诺并不可信: 对于一个普通的数字文件,没有什么能阻止复制。
用户代理供应商和其他 W3C 成员 实际上与版权持有者及其代表 展开了集体协商。 最终,浏览器同意搭载一种 DRM 系统, 即 加密媒体扩展 (EME), 以换取
-
让用户能够通过 Web 访问这些媒体,以及
-
对 DRM 工作方式施加一些服务于用户的限制, 包括以受限权限运行, 并且不向网站提供永久设备标识符。
使用 EME 时,用户个人不会作出任何明确承诺。 相反,其用户代理会实施标准化的协商结果, 一旦用户决定播放受限制的媒体, 他们便自动受复制该媒体的限制约束。 用户代理在收到文件后拒绝帮助用户复制,似乎违反了 忠诚义务 。 然而, 这一承诺仅约束用户选择接收的媒体, 而不约束用户的其他数据、设置或选择; 如果没有这一承诺,用户可能根本无法接收该媒体。
评估一项承诺是否服务于用户, 需要权衡用户获得的利益与施加的限制。 这种平衡取决于具体情境, 但只有当用户利益真正指导这一评估时, 承诺才体现忠诚。
许多人认为 EME 是一个错误 (例如 [EFF-Defending-Interoperability])。 例如,EME
-
阻止人们利用 版权中的“合理使用”(fair use)和“公平处理”(fair dealing)例外。
-
阻止对媒体进行改编, 而这些改编本可使观看者更容易无障碍地使用媒体。
-
如果购买媒体所用的服务器不可用,就会阻止访问已购买的媒体。
-
即使版权已经到期,也会阻止访问。
-
实际上要求新浏览器 获得广泛采用的 内容 解密模块的许可。
-
不能防止对反规避法律的不当使用。
尽管如此,即使用户代理在为用户协商时犯了错误, 也只有在它没有将用户放在首位时,才违反了忠诚义务。
用户代理可以为其服务收取费用, 而不损害其忠诚义务。 收取费用并不会改变其忠诚义务所针对的对象, 即使用户只是被动接受了这种安排, 例如预安装的默认设置: 它应忠于用户,而不是任何付费方。
用户代理不会阻碍其用户切换到另一个用户代理。
用户代理不会以妨碍可移植性的方式阻止访问、导出或存储用户数据。 这包括身份信息、书签、历史记录、密码以及通行密钥等凭据。 如果用户代理依赖底层的 OS 来存储 凭据, 则需要提供一种方式,让用户能够允许其他用户代理访问这些凭据。