我一直在教自己Redux,想知道将JWT令牌存放在Redux状态是多么安全。
例如,这是一个reducer,负责设置和重置令牌。
export default function loginReducer(state = {
token: "",
}, action) {
switch (action.type) {
case "SET_TOKEN":
{
return {
...state,
token: action.data,
}
break;
}
//other cases here
return state
}
然后,您可以按以下方式存储令牌。
handleSubmit(values) {
//Calling an API to get a token.
}).then((response) => {
response.json().then((jsonReponse) => {
//This is where the token is stored!
this.props.dispatch(loginAction.setToken(jsonReponse.token));
});
});
}
使用Redux的主要目的是在一个地方组织状态,所以我认为在那里维护令牌是合理的。
但是,我还没有找到一个好的信息资源来解释它是如何安全/脆弱的。
(我发现了几个关于localStorage vs Cookies的帖子。Apparently Cookies would be a secure place for storing tokens, as far as I've researched)
任何建议都将不胜感激!
答案 0 :(得分:5)
你可以将JWT存储在Redux中,我可以在那里看到你的动机,但请考虑一下:
只要您遵循网络安全和JWT令牌的所有最佳做法(即设置expiry
),您就不必担心存储JWT(本地存储或cookie)的位置。
我亲自将它们存储在本地存储空间和Cookie中。 Cookies似乎是一个更好的选择。
答案 1 :(得分:4)
将它存储在客户端的位置并不重要。如果恶意代码通过XSS攻击进入,那么没有什么是真正安全的。如果恶意代码没有进入,那么没有什么是真正不安全的。只是不让用户互相分享他们的商店,并做其他通常很好的安全实践的东西。
答案 2 :(得分:1)
我知道很久以前就已经问过这个问题,但是我想分享一下,以防有人在寻找更好的方法。
要回答您的问题,它可以是存储JWT的安全场所,但这取决于您对持久保留JWT的想法。
这是我的方法。如果您使用的是SPA前端,并且已实现了刷新令牌,则可以将该刷新令牌保存在httpOnly cookie中,并在用户启动新会话时获取新的JWT。这样,CSRF / XSS攻击的机会就更少了。我不会说它是最安全的,因为在当今时代,任何事情都是可能的,但是我个人觉得它更安全,因为即使将刷新令牌设置为httpOnly,也只暴露了一些刷新令牌。