Redux是一个存储JWT令牌的安全场所吗?

时间:2017-05-24 23:07:08

标签: html5 cookies redux

我一直在教自己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)

任何建议都将不胜感激!

3 个答案:

答案 0 :(得分:5)

你可以将JWT存储在Redux中,我可以在那里看到你的动机,但请考虑一下:

  • 刷新页面或用户离开网站并返回 JWT丢失时。你怎么回来的?从服务器请求另一个?

只要您遵循网络安全和JWT令牌的所有最佳做法(即设置expiry),您就不必担心存储JWT(本地存储或cookie)的位置。

我亲自将它们存储在本地存储空间和Cookie中。 Cookies似乎是一个更好的选择。

答案 1 :(得分:4)

将它存储在客户端的位置并不重要。如果恶意代码通过XSS攻击进入,那么没有什么是真正安全的。如果恶意代码没有进入,那么没有什么是真正不安全的。只是不让用户互相分享他们的商店,并做其他通常很好的安全实践的东西。

答案 2 :(得分:1)

我知道很久以前就已经问过这个问题,但是我想分享一下,以防有人在寻找更好的方法。

要回答您的问题,它可以是存储JWT的安全场所,但这取决于您对持久保留JWT的想法。

这是我的方法。如果您使用的是SPA前端,并且已实现了刷新令牌,则可以将该刷新令牌保存在httpOnly cookie中,并在用户启动新会话时获取新的JWT。这样,CSRF / XSS攻击的机会就更少了。我不会说它是最安全的,因为在当今时代,任何事情都是可能的,但是我个人觉得它更安全,因为即使将刷新令牌设置为httpOnly,也只暴露了一些刷新令牌。