我有一个关于JSON Web令牌(JWT)的一般性问题。
如果通过黑客攻击或物理访问从客户端窃取JWT(例如,它被存储为cookie或应用程序的数据库),它可以用于发送到服务器认为它的服务器是合法用户。这是对的吗?
是否存在任何常见或标准的做法来防范这种情况,例如,通过从客户端发送设备/浏览器类型或某些参考代码,并且服务器检查它是否与JWT令牌生成和存储的其他数据相匹配。 (但是,我读到标准做法不是在服务器上存储任何东西。)
请告知我需要实现Java JWT(JJWT),RESTful Java Jersey和Google Web Toolkit。 (我一直在阅读这样的文档:[https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage])。
谢谢!
答案 0 :(得分:8)
拥有JWT是身份验证的证明。窃取令牌的攻击者可以冒充用户。
所以,保持令牌安全:
黑名单没有用,因为你不知道JWT被盗了。它的使用打破了状态,这是JWT的优势之一
此外可以添加IP令牌,但请考虑使用场景,因为它可能会在代理后面的移动设备或系统上出现问题
答案 1 :(得分:2)
在客户端上构建JWT,如:
{...}
在服务器端,您可以验证关于密钥的JWT和到期日期 '...'
(以及更多,即创建日期,颁发者{ {1}},观众byte[] key = getSignatureKey();
String jwt = Jwts.builder().setIssuer("myTestApplication")
.setSubject("myTest")
.setExpiration(expirationDate)
.put("scope", "testing")
.signWith(SignatureAlgorithm.HS256, key)
.compact();
):
exp
使用SSL应该避免窃取JWT ......但是如果JWT被盗,则存在重播JWT的风险 - 对。 iss
进来的地方。
jti(JWT ID)声明为JWT提供唯一标识符。该 标识符值必须以确保存在的方式分配 相同值偶然发生的概率可以忽略不计 分配给不同的数据对象;如果应用程序使用多个 发行人,必须在产生的价值中防止碰撞 不同的发行人也是如此。 jti声明可用于防止 JWT被重播。 jti值是区分大小写的字符串。使用 这项主张是可选的。
使用此标识符,您可以识别此ID是否已发送(您必须在服务器端将其列入黑名单,这会以某种方式破坏JWT的性质)。因为您应该使用到期日期,如果到期日期导致SignatureException,您可以清除ID。
然而,如果黑客'把JWT从数据库中偷走了,就像你在问题中所写的那样,你可能在被盗的JWT旁边还有其他问题,因为攻击者还可能窃取其他数据等。
希望这有点帮助。