我第一次使用JSON Web Tokens(JWT)。我正在使用Hydra-Express框架制作Node.js应用程序。我想使用JWT进行身份验证。根据文档,我将JSON令牌返回到前端。
var tokenData = {
username: req.body.username,
};
var result = {
username: req.body.username,
token: jwt.sign(tokenData, 'secret', { expiresIn: 60 * 60 })
};
res.json(result);
但是我不知道如何将这个JSON令牌保存到我的浏览器标题中,这样它就不会丢失,并再次与标题一起发送到后端。 如何将其保存在我的浏览器存储中,并在每次将请求发送到后端时将其添加到请求标头中?
答案 0 :(得分:1)
安全建议:
尽量保持简短: cookies(仅限http和仅安全标志)易受CSRF攻击,但不受XSS攻击。 本地存储中的JWT易受XSS攻击,但不容易受到CSRF
的攻击您可以做的最好是将风险降至最低: 将JWT存储在cookie中 在localstorage中存储csrf_token
使其无国籍: 在JWT有效负载中包含csrf_token,如果JWT csrf_token和从localstorage读取并在标头中提供的csrf_token匹配,则检查服务器端。
这需要攻击者通过XSS获取csrf_token(例如,您在网站中使用受到破坏的第三方js库或不应用卫生设施) 然后他需要使用csrf_token触发csrf请求(例如,嵌入的img src标记或网页/电子邮件中的表单)
这种组合使攻击者更难(但并非不可能)。
它提供与使用csrf_tokens的基于正常会话的身份验证相同的安全级别,但不需要状态。
答案 1 :(得分:0)
答案 2 :(得分:0)
当它返回时,将整个令牌存储在sessionStorage
中sessionStorage.token = json.access_token;
要访问有效负载,请将jwt令牌拆分为其header.payload.signature部分并仅抓取有效负载
var enc = json.access_token.split(".")[1];
然后解析base64
var payload = JSON.parse(window.atob(enc));
然后,您可以获取并使用经过验证的有效负载数据 payload.sub,payload.role ... etc
答案 3 :(得分:0)
基于克里斯的答案:
最安全的选项是在内存中。 Checkout this for a deep dive