声明集与密码学封装分工不同
JWT声明集是名称—值组成的JSON对象。JWS形式对其签名或作消息认证,JWE形式加密相应内容,也可以嵌套使用;常见紧凑表示用点分隔URL安全编码的部分,部分数量取决于封装,不是所有JWT都只有同一种三段外形。
base64url是编码而不是保密措施。签名形式的载荷通常可被取得令牌的人解读,签名也不隐藏字段;需要保密时必须采用相应加密和传输保护,不能因字符串看起来不易读就把秘密随意放进其中。
参考:[1]
通用声明还须由具体用途约束
iss标识发行者,sub标识主体,aud指向预期接收者,exp与nbf分别给出到期和不得提前接受的时间条件。RFC 7519没有把所有这些字段规定为每一种JWT都必须出现;具体用途的规范要决定哪些必需、怎样解释。
这也解释了为什么一个格式正确的JWT不能自动用于所有地方。OpenID Connect对ID Token有自己的必需声明,其他访问令牌或安全事件令牌又有不同规则;有效载荷里的业务字段不能脱离这些约定单独决定权限。
能解析不等于可接受
验证者需要按应用许可的算法和可信密钥核验密码学操作,再验证发行者、主体、受众和相应时间条件。RFC 8725要求算法集合由调用者限制,不能让不可信头部随意选择一种算法,或把来自任意地方的密钥当成所声称发行者的密钥。
同一发行者可以发多种JWT,验证规则还应排除错误类型的令牌。显式类型、不同必需声明、受众或密钥可用于区分,具体组合由应用规定。签名正确只能完成其中一层,不能把给另一个客户端或另一种用途的令牌直接替换进来。
参考:[2]