JWTs存储在cookie中是否安全?

时间:2016-08-03 09:43:51

标签: java cookies jersey jwt

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

  1. 在Jetty上启动Jersey REST服务
  2. 用户在/users/login
  3. 上发布了用户名和密码
  4. 基于密钥的JWT在服务器上生成并存储在cookie中
  5. 客户端现在可以读取其他操作的Cookie,将带有Authorization: Bearer ${jwt}标题的请求发送到/users/profile
  6. 如果签名的jwt有效,则返回用户信息,否则回复Unauthorized
  7. 现在,我才意识到;这怎么样安全?无法 任何 用户只需从浏览器中读取Cookie并将请求卷曲到/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();
            }
        }
    }
    

1 个答案:

答案 0 :(得分:8)

验证签名可确保JWT未被伪造或篡改。正如您所猜测的那样,JWT仍然可以被盗。如果有人窃取了令牌,他们可以冒充你的用户并提出请求。

有三件重要的事情要做:

  1. 使用HTTPS - 端到端TLS可防止有人拦截或嗅探线路上的请求并窃取令牌。

  2. 在客户端上安全存储令牌 - 如果您将令牌存储在Cookie中,请确保使用HttpOnly标志以防止通过XSS被盗,以及在所有表单上使用CSRF保护。有关更深入的解释,请参阅Cookies vs. HTML5 Web Storage

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