用于传递 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 上设置 Secure 和 SameSite 属性以使它们更安全。在将它们存储在 cookie 中之前更好地对其进行加密。
更好的方法是查看 BFF 模式,如 here
所述【讨论】:
嗨,如果我将 accessToken 存储在内存中以便客户端可以将其设置为授权标头,并将 refreshToken 存储在 httpOnly cookie 中,这样虽然我的 accessToken 暴露了,但它是短暂的,它是一个更好的方法?因为我在代码中找不到 BFF 模式的任何实现,谢谢 问题在于,如果您使用的是标准 OpenID Connect/OAuth 授权提供程序,那么您需要在 API 请求中使用刷新令牌调用它,因此您的 javascript 仍然需要同时访问这两者令牌。如果您仍想在浏览器中使用令牌,请考虑使用类似 github.com/openid/AppAuth-JS 的库以上是关于用于传递 JWT 的 httpOnly Cookies 与授权标头的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.6 - Passport JWT httponly cookie SPA 身份验证用于自用 API?