如何在禁用Cookie时管理JWT

时间:2016-10-12 03:15:09

标签: javascript java json rest cookies

我一直在阅读有关JSON Web令牌(这对我来说是全新的)的文章及其在各方之间传输信息的安全机制,以避免服务器会话。

我正在使用Java,Tomcat,用于Web服务的Jersey框架和用于JWT的JOSE4J从头开始构建Web应用程序。

许多文章建议使用Cookies httpOnly而不是localStorage

我已经用cookie和jwt

创建了一个像这样的restful方法
let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let obj : YourViewController = storyboard.instantiateViewControllerWithIdentifier("YourViewControllerIdentifier") as! YourViewController
self.presentViewController(vc, animated: true, completion: nil)

当我在Chrome中运行我的网络应用时,我可以看到Cookie已正确保存。

现在我可以使用此令牌调用更多的restful方法,而无需再次进行身份验证,但如果禁用Cookie会怎么样?我在隐身模式下测试时无法检索cookie。在这种情况下,我可以验证是否启用了cookie并警告用户启用它们以继续登录过程。

要检查Cookie,我会这样做:

@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();
}

但这是非常严格的。所以我想知道从服务器检索jwt的替代方法是什么?我对此不是很确定,但是我是否应该更改控制器以将jwt作为json中响应的一部分发送并保留在localStorage中,即使这可能会将我的令牌暴露给XSS攻击?但是,使用cookie也可能容易受到CRSF攻击,但如果我将httpOnly和安全属性设置为true,则不会,但在这种情况下,我无法使用javascript读取cookie。我很困惑。

提前致谢。

1 个答案:

答案 0 :(得分:0)

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