Skip to main content

4. JWT Claims (JWT声明)

JWT声明集 (JWT Claims Set) 表示一个JSON对象,其成员是JWT所传递的声明。JWT声明集内的声明名称 (Claim Names) 必须 (MUST) 是唯一的; JWT解析器必须 (MUST) 拒绝具有重复声明名称的JWT,或使用仅返回词法上最后一个重复成员名称的JSON解析器,如ECMAScript 5.1 [ECMAScript] 第15.12节("The JSON Object")中所规定的。

JWT必须包含哪些声明才能被视为有效取决于上下文,超出了本规范的范围。JWT的特定应用将要求实现以特定方式理解和处理某些声明。但是,在没有此类要求的情况下,实现必须 (MUST) 忽略所有不理解的声明。

JWT声明名称有三类: 注册声明名称 (Registered Claim Names)、公开声明名称 (Public Claim Names) 和私有声明名称 (Private Claim Names)。

4.1. Registered Claim Names (注册声明名称)

以下声明名称已在第10.1节建立的IANA "JSON Web Token Claims" 注册表中注册。下面定义的声明并非旨在在所有情况下都必须使用或实现,而是为一组有用的、可互操作的声明提供起点。使用JWT的应用应该 (SHOULD) 定义它们使用哪些特定声明以及这些声明何时是必需的或可选的。所有名称都很短,因为JWT的核心目标是使表示紧凑。

4.1.1. "iss" (Issuer) Claim (颁发者声明)

"iss" (issuer) 声明标识颁发JWT的主体。此声明的处理通常是特定于应用的。"iss" 值是包含StringOrURI值的区分大小写的字符串。此声明的使用是可选的 (OPTIONAL)。

4.1.2. "sub" (Subject) Claim (主体声明)

"sub" (subject) 声明标识作为JWT主体的主体。JWT中的声明通常是关于主体的陈述。主体值必须 (MUST) 被限定为在颁发者的上下文中是本地唯一的,或者是全局唯一的。此声明的处理通常是特定于应用的。"sub" 值是包含StringOrURI值的区分大小写的字符串。此声明的使用是可选的 (OPTIONAL)。

4.1.3. "aud" (Audience) Claim (受众声明)

"aud" (audience) 声明标识JWT的预期接收者。每个打算处理JWT的主体必须 (MUST) 在受众声明中使用一个值来标识自己。如果处理声明的主体在存在"aud"声明时未使用"aud"声明中的值来标识自己,则必须 (MUST) 拒绝该JWT。在一般情况下,"aud"值是区分大小写的字符串数组,每个字符串包含一个StringOrURI值。在JWT只有一个受众的特殊情况下,"aud"值可以 (MAY) 是包含StringOrURI值的单个区分大小写的字符串。受众值的解释通常是特定于应用的。此声明的使用是可选的 (OPTIONAL)。

4.1.4. "exp" (Expiration Time) Claim (过期时间声明)

"exp" (expiration time) 声明标识不得 (MUST NOT) 接受JWT进行处理的过期时间或之后的时间。"exp"声明的处理要求当前日期/时间必须 (MUST) 在"exp"声明中列出的过期日期/时间之前。实现者可以 (MAY) 提供一些小的余地(通常不超过几分钟)来考虑时钟偏差。其值必须 (MUST) 是包含NumericDate值的数字。此声明的使用是可选的 (OPTIONAL)。

4.1.5. "nbf" (Not Before) Claim (生效时间声明)

"nbf" (not before) 声明标识不得 (MUST NOT) 接受JWT进行处理的时间之前的时间。"nbf"声明的处理要求当前日期/时间必须 (MUST) 在"nbf"声明中列出的生效日期/时间之后或等于该时间。实现者可以 (MAY) 提供一些小的余地(通常不超过几分钟)来考虑时钟偏差。其值必须 (MUST) 是包含NumericDate值的数字。此声明的使用是可选的 (OPTIONAL)。

4.1.6. "iat" (Issued At) Claim (颁发时间声明)

"iat" (issued at) 声明标识JWT的颁发时间。此声明可用于确定JWT的年龄。其值必须 (MUST) 是包含NumericDate值的数字。此声明的使用是可选的 (OPTIONAL)。

4.1.7. "jti" (JWT ID) Claim (JWT ID声明)

"jti" (JWT ID) 声明为JWT提供唯一标识符。标识符值必须 (MUST) 以确保将相同值意外分配给不同数据对象的概率可忽略不计的方式进行分配; 如果应用使用多个颁发者,则还必须 (MUST) 防止不同颁发者产生的值之间发生冲突。"jti"声明可用于防止JWT被重放。"jti"值是区分大小写的字符串。此声明的使用是可选的 (OPTIONAL)。

4.2. Public Claim Names (公开声明名称)

使用JWT的人可以随意定义声明名称。但是,为了防止冲突,任何新的声明名称应该 (SHOULD) 在第10.1节建立的IANA "JSON Web Token Claims" 注册表中注册,或者是公开名称 (Public Name): 包含抗冲突名称 (Collision-Resistant Name) 的值。在每种情况下,名称或值的定义者都需要采取合理的预防措施,以确保他们控制用于定义声明名称的命名空间部分。

4.3. Private Claim Names (私有声明名称)

JWT的生产者和消费者可以 (MAY) 同意使用私有名称 (Private Names) 作为声明名称: 既不是注册声明名称(第4.1节)也不是公开声明名称(第4.2节)的名称。与公开声明名称不同,私有声明名称容易发生冲突,应谨慎使用。