为什么JWT在身份验证场景中变得流行
有了JWT,服务器不需要在每次请求时都去数据库查询会话信息,因为令牌本身就携带了可验证的声明和过期时间。这种无状态特性让JWT很适合分布式系统和API场景,代价是相比传统的服务端会话,它更难被立即撤销。
解码令牌和验证令牌是完全不同的两回事
任何人都可以在不需要任何密钥的情况下解码出JWT的header和payload,因为这只是编码而已。要验证一个令牌是否真实、是否未被修改,则需要用到签发时使用的签名密钥或公钥——一个只解码而未经验证的令牌,不应该被当作任何证明来信任。
常见问题
不需要密码就能读出JWT的payload内容,这算不算安全漏洞?
不算,这是设计上就预期的行为。JWT本来就是设计成可被读取的,它提供的安全保证是通过签名实现的完整性(能被察觉篡改),而不是payload内容的保密性。
可以修改JWT的payload内容之后继续使用吗?
可以修改解码后的文本内容,但如果没有正确的签名密钥重新编码,得到的签名会变得无效,因此正确执行验证的服务器会拒绝这个被篡改过的令牌,而不会接受修改后的声明。