我们如何将 JWT 令牌存储在仅限 Http 的 cookie 中?

Posted

技术标签:

【中文标题】我们如何将 JWT 令牌存储在仅限 Http 的 cookie 中?【英文标题】:How can we store JWT token in Http only cookies? 【发布时间】:2020-08-23 05:26:41 【问题描述】:

我正在创建登录模块。

    用户将输入用户名和密码。

    如果用户验证成功,则服务器将返回 JWT 令牌。

    我将使用 JWT 令牌来验证 React js 中的不同 API 调用。

现在我担心的是,我找到了一些关于此的文章,然后我发现我们只能使用 http cookie。我们如何实现 httponly cookie 方法来存储 JWT ?安全吗?

【问题讨论】:

【参考方案1】:

HttpOnly cookie 是安全的,因为它们可以通过 Document.cookie API 防止浏览器访问,因此可以防止 XSS 攻击。

成功验证您的用户后,服务器应生成一个 jwt 令牌并将其作为 cookie 返回给您的客户端,如下所示:

return res.cookie('token', token, 
    expires: new Date(Date.now() + expiration), // time until expiration
    secure: false, // set to true if your using https
    httpOnly: true,
  );

可以通过来自您的客户端的传入 http 请求访问 cookie。您可以使用授权中间件函数检查 cookie 的 jwt 值,以保护您的 API 端点:

const verifyToken = async (req, res, next) => 
  const token = req.cookies.token || '';
  try 
    if (!token) 
      return res.status(401).json('You need to Login')
    
    const decrypt = await jwt.verify(token, process.env.JWT_SECRET);
    req.user = 
      id: decrypt.id,
      firstname: decrypt.firstname,
    ;
    next();
   catch (err) 
    return res.status(500).json(err.toString());
  
;

更多详情参考:https://dev.to/mr_cea/remaining-stateless-jwt-cookies-in-node-js-3lle

【讨论】:

谢谢。现在我将如何使用 JWT 来验证其他路由,因为我必须将 JWT 令牌作为其他路由的标头发送。我将如何在客户端获得 JWT 令牌的访问权限? 对于同一域的任何请求,浏览器都会自动将 cookie 添加到 Cookie HTTP 标头中。 HttpOnly cookie 的要点是客户端永远不会显式访问 cookie,而只是将其发送到同一个域的请求中。

以上是关于我们如何将 JWT 令牌存储在仅限 Http 的 cookie 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何判断用户是不是使用仅限 http 的 cookie 和 JWT 登录(客户端)

为啥将刷新令牌存储在仅 HTTP 的 Cookie 中以防止 CSRF 攻击?

Java Angular JWT 实现

openid 连接 2.0 并在仅 http cookie 中设置身份验证 JWT

检查 cookie 中 JWT 令牌的有效性时如何避免不必要的 API 调用

如何将我的 JWT 令牌存储在本地存储中?