如何通过查验token本身判定该令牌是否为JWT?
Access Token类型(JWT/非JWT)判定方案
仅通过三段.分隔的结构确实无法100%判定令牌为JWT,存在自定义令牌使用.做分隔符导致误判的可能,你可以通过多维度逐层校验的方式完成精准判定:
标准JWT判定规则(按校验严格度排序)
- 基础结构校验:首先判断令牌是否严格符合
[第一段].[第二段].[第三段]的三段结构,两端无多余.字符,且每一段都为Base64URL编码格式(仅包含大小写字母、数字、-、_,无普通Base64的+、/、=字符),不符合直接判定为非JWT。 - 头部合法性校验:将第一段做Base64URL解码,校验输出内容是否为合法JSON格式,且JSON中必须包含
alg(签名算法)字段,若存在typ字段且值为JWT可直接确认令牌类型。如果解码结果不是合法JSON、缺少alg字段,直接判定为非JWT。 - 载荷合法性校验(可选,推荐开启):将第二段做Base64URL解码,校验输出内容是否为合法JSON格式,标准JWT载荷通常会包含
iss(签发者)、exp(过期时间)、iat(签发时间)等标准声明字段,存在这类字段可进一步提升判定准确率。 - 签名合法性校验(生产环境必做):按照头部
alg字段指定的算法,用对应密钥/公钥对「第一段Base64URL值.第二段Base64URL值」做签名计算,和第三段解码后的签名值做比对,匹配则100%为合法JWT,反之就算结构符合也属于伪造令牌或非JWT令牌。
如果你仅需要做类型区分、不需要校验令牌本身合法性,仅完成前两步校验即可覆盖99%以上的场景,基本可以规避非JWT令牌的误判问题。如果你的业务存在极端场景下自定义令牌也符合前两步校验规则的情况,可以结合自身业务的非JWT令牌特征(如固定前缀、固定长度等)做二次过滤即可。
内容的提问来源于stack exchange,提问作者Janith Priyankara
相关产品推荐
相关产品推荐

