7. Serializations (序列化)
JWS 使用两种序列化之一: JWS Compact Serialization (JWS 紧凑序列化) 或 JWS JSON Serialization (JWS JSON 序列化). 使用本规范的应用程序需要指定该应用程序使用的序列化和序列化特性. 例如, 应用程序可能指定仅使用 JWS JSON Serialization, 仅使用对单个签名或 MAC 值的 JWS JSON Serialization 支持, 或使用对多个签名和/或 MAC 值的支持. JWS 实现只需要实现它们设计支持的应用程序所需的特性.
7.1 JWS Compact Serialization (JWS 紧凑序列化)
JWS Compact Serialization 将经过数字签名或 MAC 保护的内容表示为紧凑的、URL 安全的字符串. 此字符串是:
BASE64URL(UTF8(JWS Protected Header)) || '.' ||
BASE64URL(JWS Payload) || '.' ||
BASE64URL(JWS Signature)
JWS Compact Serialization 仅支持一个签名/MAC, 并且不提供表示 JWS Unprotected Header 值的语法.
7.2 JWS JSON Serialization (JWS JSON 序列化)
JWS JSON Serialization 将经过数字签名或 MAC 保护的内容表示为 JSON 对象. 此表示既不针对紧凑性进行优化, 也不是 URL 安全的.
为 JWS JSON Serialization 定义了两种密切相关的语法: 一种完全通用的语法, 可以使用多个数字签名和/或 MAC 操作来保护内容, 以及一种扁平化语法, 针对单个数字签名或 MAC 情况进行了优化.
7.2.1 General JWS JSON Serialization Syntax (通用 JWS JSON 序列化语法)
以下成员定义用于完全通用的 JWS JSON Serialization 语法的顶级 JSON 对象:
payload : "payload" 成员必须 (MUST) 存在并包含值 BASE64URL(JWS Payload).
signatures : "signatures" 成员值必须 (MUST) 是 JSON 对象的数组. 每个对象表示对 JWS Payload 和 JWS Protected Header 的签名或 MAC.
以下成员定义用于 "signatures" 数组元素的 JSON 对象:
protected : 当 JWS Protected Header 值非空时, "protected" 成员必须 (MUST) 存在并包含值 BASE64URL(UTF8(JWS Protected Header)); 否则, 它必须 (MUST) 不存在. 这些 Header Parameter 值受完整性保护.
header : 当 JWS Unprotected Header 值非空时, "header" 成员必须 (MUST) 存在并包含值 JWS Unprotected Header; 否则, 它必须 (MUST) 不存在. 此值表示为未编码的 JSON 对象, 而不是字符串. 这些 Header Parameter 值不受完整性保护.
signature : "signature" 成员必须 (MUST) 存在并包含值 BASE64URL(JWS Signature).
对于每个签名/MAC 计算, "protected" 和 "header" 成员中的至少一个必须 (MUST) 存在, 以便传达 "alg" Header Parameter 值.
上面定义的 JSON 对象中可以存在其他成员; 如果遇到它们的实现不理解它们, 则必须 (MUST) 忽略它们.
创建或验证单个签名或 MAC 值时使用的 Header Parameter 值是可能存在的两组 Header Parameter 值的并集: (1) 在签名/MAC 的数组元素的 "protected" 成员中表示的 JWS Protected Header, 以及 (2) 在签名/MAC 的数组元素的 "header" 成员中的 JWS Unprotected Header. 这些 Header Parameters 集合的并集构成 JOSE Header. 两个位置中的 Header Parameter 名称必须 (MUST) 是不相交的.
每个 JWS Signature 值使用相应 JOSE Header 值的参数以与 JWS Compact Serialization 相同的方式计算. 这具有理想的属性, 即 "signatures" 数组中表示的每个 JWS Signature 值与在 JWS Compact Serialization 中为相同参数计算的值相同, 前提是该签名/MAC 计算的 JWS Protected Header 值 (表示受完整性保护的 Header Parameter 值) 与 JWS Compact Serialization 中使用的值匹配.
总之, 使用通用 JWS JSON Serialization 的 JWS 语法如下:
{
"payload":"<payload contents>",
"signatures":[
{"protected":"<integrity-protected header 1 contents>",
"header":<non-integrity-protected header 1 contents>,
"signature":"<signature 1 contents>"},
...
{"protected":"<integrity-protected header N contents>",
"header":<non-integrity-protected header N contents>,
"signature":"<signature N contents>"}]
}
有关使用通用 JWS JSON Serialization 语法的 JWS 示例, 请参见附录 A.6.
7.2.2 Flattened JWS JSON Serialization Syntax (扁平化 JWS JSON 序列化语法)
扁平化 JWS JSON Serialization 语法基于通用语法, 但将其扁平化, 针对单个数字签名/MAC 情况进行了优化. 它通过删除 "signatures" 成员并将为在 "signatures" 数组中使用而定义的那些成员 ("protected"、"header" 和 "signature" 成员) 放置在顶级 JSON 对象中 (与 "payload" 成员处于同一级别) 来扁平化它.
使用此语法时, "signatures" 成员禁止 (MUST NOT) 存在. 除了这种语法差异之外, 使用扁平化语法的 JWS JSON Serialization 对象的处理方式与使用通用语法的对象完全相同.
总之, 使用扁平化 JWS JSON Serialization 的 JWS 语法如下:
{
"payload":"<payload contents>",
"protected":"<integrity-protected header contents>",
"header":<non-integrity-protected header contents>,
"signature":"<signature contents>"
}
有关使用扁平化 JWS JSON Serialization 语法的 JWS 示例, 请参见附录 A.7.