java - 存储在 cookie 中的 JWT 安全吗?

标签 java cookies jersey jwt

我正在尝试进行基于 JWT 的身份验证过程。

  1. 在 Jetty 上启动 Jersey REST 服务
  2. 用户在 /users/login 上使用用户名和密码发帖
  3. 基于 key 的 JWT 在服务器上生成并存储在 cookie 中
  4. 客户端现在可以读取 cookie 以进行其他操作,将带有 Authorization: Bearer ${jwt} header 的请求发送到 /users/profile
  5. 如果通过签名得到的jwt有效,则返回用户信息,否则返回Unauthorized

现在,我才意识到;这怎么安全?难道任何 用户都不能简单地从浏览器读取 cookie 并将 curl 请求发送到 /users/profile 并且它是有效的吗?

我在这方面真的还是个新手,所以你能解释一下吗?下面是一些简单的测试代码

@Path("users")
public class UserResources {
    @Path("login")
    @POST
    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public Response loginUser(UserInput userInput) {
        String compactJws = Jwts.builder().setSubject(userInput.getUsername()).claim("name", userInput.getName())
                .signWith(SignatureAlgorithm.HS256, Server.SECRECT_KEY).compact();

        return Response.status(Status.OK).cookie(new NewCookie("jwt", compactJws)).entity(compactJws).build();
    }

    @Path("profile")
    @GET
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public Response getUser(@HeaderParam("Authorization") String compactJws) {
        try {
            if (compactJws == null || compactJws.trim().isEmpty() || !compactJws.startsWith("Bearer ")) {
                throw new SignatureException("Invalid access token");
            }
            Jws<Claims> claims = Jwts.parser().setSigningKey(Server.SECRECT_KEY)
                    .parseClaimsJws(compactJws.substring("Bearer ".length()));
            return Response.ok(new String("Subject: " + claims.getBody().getSubject() + "\nName: " + claims.getBody().get("name"))).build();
        } catch (SignatureException e) {
            return Response.status(Status.UNAUTHORIZED).entity(e.getMessage()).build();
        }
    }
}

最佳答案

验证签名可确保 JWT 未被伪造或篡改。如您所料,JWT 仍然可以被窃取。如果有人窃取了 token ,他们可以冒充您的用户并发出请求。

需要做三件重要的事情:

  1. 使用 HTTPS - 端到端 TLS 可防止有人拦截或嗅探网络上的请求并窃取 token 。

  2. 在客户端安全地存储 token - 如果您将 token 存储在 cookie 中,确保使用 HttpOnly 标志以防止通过 XSS 窃取,并且在所有表单上使用 CSRF 保护。参见 Cookies vs. HTML5 Web Storage以获得更深入的解释。

  3. 使 token 过期 - 如果所有其他方法都失败,并且 token 确实被盗,合理的过期(exp 声明)将确保只有有限的 token 可用于造成损害的时间窗口。

关于java - 存储在 cookie 中的 JWT 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38739988/

相关文章:

java - Jersey REST 服务 - Tomcat 中的 404 响应

java - 如何在不使用 n 数组且不使用任何库函数的情况下反转数字?

java - 马文 : How do you deal with dependencies that are both direct and transitive?

java - 通过 Jersey 发布 JSON

javascript - 禁用第三方 cookie 是否也会禁用第三方 javascript 创建的 cookie?

node.js - 使用 Express 4.x 的 res.cookie 时请求头无法获取 cookie

java - 无法在 javascript 中向 java web 服务( Jersey )发出 CORS POST 请求?

java - 使用 XCA 配置 Tomcat 8.0 的 SSL

java - JavaFX-播放mp3

javascript - 在 Angularjs 中记住我的功能和 token