用于传递 JWT 的 httpOnly Cookies 与授权标头

Posted

技术标签:

【中文标题】用于传递 JWT 的 httpOnly Cookies 与授权标头【英文标题】:httpOnly Cookies vs Authorization headers for passing JWT 【发布时间】:2022-01-15 00:37:15 【问题描述】:

所以我对通过 JWT 授权的正确方法有点困惑,我知道一种常见的方法是您可以使用 Authorization 标头来验证它,如下所示:

const verifyToken = (req, res, next) => 
  const authHeader = req.headers.token;
  if (authHeader) 
    const token = authHeader.split(" ")[1];
    jwt.verify(token, process.env.JWT_KEY, (err, user) => 
      if (err) 
        res.status(403).json("Token is not valid!");
      
      req.user = user;
      next();
    );
   else 
    res.status(401).json("You're not authenticated");
  
;

但是,如果我在登录后使用 cookie 来存储我的 JWT 令牌,例如:

res.cookie("accessToken", accessToken,  httpOnly: true );
res.cookie("refreshToken", refreshToken,  httpOnly: true );

这是否意味着我可以忽略上面的 authHeader 并直接从 cookie 中使用来验证我的 Token?比如:

const verifyToken = (req, res, next) => 
  //USING TOKEN FROM COOKIES
  const accessToken = req.cookies.accessToken;
  const refreshToken = req.cookies.refreshToken;
  if (accessToken && refreshToken) 
    jwt.verify(accessToken, process.env.JWT_KEY, (err, user) => 
      if (err) 
        res.status(403).json("Token is not valid!");
      
      req.user = user;
      next();
    );
   else 
    res.status(401).json("You're not authenticated");
  
;

感谢您的澄清

【问题讨论】:

【参考方案1】:

我认为将令牌直接存储为 cookie 是一种不好的做法,因为任何访问计算机的人都可以访问它们。 Cookie 存储在浏览器中时不受保护。

只设置 HttpOnly 也是一种不好的做法,您还应该在 cookie 上设置 SecureSameSite 属性以使它们更安全。在将它们存储在 cookie 中之前更好地对其进行加密。

更好的方法是查看 BFF 模式,如 here

所述

【讨论】:

嗨,如果我将 accessToken 存储在内存中以便客户端可以将其设置为授权标头,并将 refreshToken 存储在 httpOnly cookie 中,这样虽然我的 accessToken 暴露了,但它是短暂的,它是一个更好的方法?因为我在代码中找不到 BFF 模式的任何实现,谢谢 问题在于,如果您使用的是标准 OpenID Connect/OAuth 授权提供程序,那么您需要在 API 请求中使用刷新令牌调用它,因此您的 javascript 仍然需要同时访问这两者令牌。如果您仍想在浏览器中使用令牌,请考虑使用类似 github.com/openid/AppAuth-JS 的库

以上是关于用于传递 JWT 的 httpOnly Cookies 与授权标头的主要内容,如果未能解决你的问题,请参考以下文章

如何在前端使用 HttpOnly jwt cookie

Laravel 5.6 - Passport JWT httponly cookie SPA 身份验证用于自用 API?

Laravel 5.6 - 用于自助API的Passport JWT httponly cookie SPA身份验证?

将 JWT 令牌存储到 HttpOnly cookie 中

使用jwt进行身份验证时如何在客户端使用httpOnly?

在 Django/DRF 中使用 JWT 身份验证并将 JWT 存储在 HttpOnly Cookie 中