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