【发布时间】:2017-02-20 17:51:47
【问题描述】:
我一直在阅读有关 JSON Web Token(对我来说是全新的)及其在各方之间传输信息以避免服务器会话的安全机制的文章。
我正在使用 Java、Tomcat、Web 服务的 Jersey 框架和 JWT 的 JOSE4J 从头开始构建一个 Web 应用程序。
许多文章建议使用 Cookie httpOnly 而不是 localStorage
我已经用 cookie 和 jwt 创建了一个像这样的 restful 方法
@GET
@Path("/authenticate")
@Produces(MediaType.APPLICATION_JSON)
public Response authenticate(
@HeaderParam("username") String username,
@HeaderParam("password") String password) throws JSONException,
IOException, JoseException {
Service service = Service.getInstance();
EmployeeProfile employeeProfile = service.authenticate(username, password);
// Temporarily httponly and secure as false to test
NewCookie cookie = new NewCookie("jwt", service.getToken(), null, null, null, 900, false, false);
return Response.status(200).cookie(cookie).entity(employeeProfile).build();
}
return Response.status(204).entity(null).build();
}
当我在 Chrome 中运行我的 web 应用程序时,我可以看到 cookie 已正确保存。
现在我可以使用这个令牌来调用更多的 restful 方法而无需再次进行身份验证,但是如果禁用 Cookies 怎么办?我在隐身模式下测试时无法检索 cookie。在这种情况下,我可以验证是否启用了 cookie,并警告用户启用它们以便继续登录过程。
要检查 cookie,我会这样做:
$.cookie('test_cookie', 'cookie_value', { path: '/' });
if ($.cookie('test_cookie') !== 'cookie_value') {
//Cookies are disabled. Show a modal.
}
但这是非常严格的。所以我想知道从服务器检索 jwt 的替代方法是什么?我对此不太确定,但我是否应该更改控制器以将 jwt 作为 json 响应的一部分发送并将其保存在 localStorage 中,即使这会使我的令牌暴露于 XSS 攻击?但是,使用 cookie 也容易受到 CRSF 攻击,但如果我将 httpOnly 和安全属性设置为 true,则不会,但在这种情况下,我将无法使用 javascript 读取 cookie。我对此感到困惑。
提前致谢。
【问题讨论】:
-
只使用localStorage。如果您担心 XSS 攻击,请为您不信任的 JavaScript 代码使用 iframe。
标签: javascript java json rest cookies