【问题标题】:How to manage JWT when Cookies are disabled禁用 Cookie 时如何管理 JWT
【发布时间】: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


【解决方案1】:

您是对的,您需要更改控制器并发送 JWT 是响应的一部分以及带有 httpOnly 到期证券标志的 cookie,但问题是在客户端解密 JWT 并从那里使用一些值。如果“否”,则无需将 JWT 作为响应的一部分发送。如果“是”,最好从令牌中取出所有值并在响应标头中发送单独的 json 对象。

【讨论】:

  • 感谢您的回答。这仍然有点令人困惑,因为这对我来说是新的。您的意思是通过标头中的响应作为 httpOnly 发送 JWT?我将在服务器端验证 JWT。我只想从身份验证中接收 JWT 并保留它以供下次调用。我不知道在哪里持有 JWT。你能提供一个简单的例子来更好地理解你的答案或一个好的阅读链接吗?我正在阅读有关 JWT 和授权标头的博客。但我不知道是不是你的意思。再次感谢和问候。
猜你喜欢
  • 1970-01-01
  • 2010-12-20
  • 2014-11-29
  • 1970-01-01
  • 2018-10-13
  • 2012-02-22
  • 2023-04-01
  • 2021-09-24
  • 2021-02-07
相关资源
最近更新 更多