如何像Discord一样缩短JWT的长度?
压缩235字符JWT至Discord同类长度的实操方案
Discord官方使用的JWT长度普遍在100-150字符区间,核心优化思路是裁汰冗余内容、压缩各段开销,你可以按照以下步骤操作:
- 裁剪载荷冗余字段
先排查当前JWT的载荷部分,删除所有非必要的标准声明和自定义字段:如果业务不需要校验签发者、受众、签发时间,直接删掉iss、aud、iat这类声明,仅保留必须的exp(过期时间)、用户ID等核心字段。同时把字段名压缩到最短,比如把user_identity缩写为uid,字段值尽量用短格式,比如用数字ID代替长字符串UUID。 - 缩短签名开销
不要用默认的HS256/RS256签名算法:HS256生成的签名base64编码后占43个字符,你可以切换为截断式HMAC签名,比如HS256仅保留前16字节的签名结果,编码后仅占22个字符,提前评估业务的碰撞风险即可,Discord的JWT正是用了截断签名的方案压缩长度。如果是非对称加密场景,可以换成Ed25519算法,签名长度比RS256短60%以上。 - 优化编码开销
原生JWT使用的Base64URL编码自带的填充字符=可以全部删除,解码时可以自动补全,这一步就能节省1-2个字符。另外序列化载荷JSON时,禁用不必要的特殊字符转义,也能减少额外的字符开销。 - (可选)载荷压缩
如果你的JWT载荷冗余内容较多,可以先对载荷做无头部的DEFLATE压缩后再编码,注意如果载荷本身长度小于100字节,压缩反而可能带来额外开销,需要提前测试确认收益。
注意:所有优化逻辑必须和验签端保持对齐,比如你截断了签名长度,验签时也需要对应截断收到的签名再做比对,避免出现验签全部失败的问题。
内容的提问来源于stack exchange,提问作者Sheol-Nugganoth
相关产品推荐
相关产品推荐

