此时 signature字段就是关键了,能被解密出明文的,只有header和payload
假如黑客/中间人串改了payload,那么服务器可以通过signature去验证是否被篡改过。
在服务端在执行一次 signature = 加密算法(header + “.” + payload, 密钥);, 然后对比 signature 是否一致,如果一致则说明没有被篡改。
所以为什么说服务器的密钥不能被泄漏。
如果泄漏,将存在以下风险:
客户端可以自行签发 token
黑客/中间人可以肆意篡改 token
安全性相关
如果加强 JWT 的安全性?
根据我的使用,总结以下几点:
缩短 token 有效时间
使用安全系数高的加密算法
token 不要放在 Cookie 中,有 CSRF 风险
使用 HTTPS 加密协议
对标准字段 iss、sub、aud、nbf、exp 进行校验
使用成熟的开源库,不要手贱造轮子
特殊场景下可以把用户的 UA、IP 放进 payload 进行校验(不推荐)