JSON Web令牌(JWT)

时间:2017-01-21 12:31:43

标签: gwt jwt jersey-2.0 json-web-token jjwt

我有一个关于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])。

谢谢!

2 个答案:

答案 0 :(得分:8)

拥有JWT是身份验证的证明。窃取令牌的攻击者可以冒充用户。

所以,保持令牌安全:

  • 使用TLS频道
  • 根据存储类型添加额外的安全措施。 Cookie容易受到CSRF攻击。如果您不需要从javascript访问令牌,请使用HttpOnly。 LocalStorage容易受到XSS攻击
  • 设置身份验证令牌的短暂到期时间,如果令牌已过期则需要凭据

黑名单没有用,因为你不知道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旁边还有其他问题,因为攻击者还可能窃取其他数据等。

希望这有点帮助。