【问题标题】:Why not store JWT in global variable?为什么不将 JWT 存储在全局变量中?
【发布时间】:2019-07-23 10:47:34
【问题描述】:

我试图了解将 jwt 存储在本地存储(倾向于 xss)与 cookie(倾向于 csrf)中的安全含义。如果我将 jwt 令牌存储在前端的应用程序状态中(例如在 redux 商店中),我想了解安全隐患。

编辑:

我试图了解有关存储令牌的更多信息。在确定有两种方法可以做到这一点之后,似乎所有的文章和答案实际上都开始了讨论,cookies 或浏览器存储。 像这个相关的问题: Where to store JWT in browser? How to protect against CSRF? 喜欢这些帖子: https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage https://auth0.com/docs/security/store-tokens

我理解其中大部分的要点,但我试图明确讨论全局变量的选项。

【问题讨论】:

  • 我知道有很多关于本地存储与 cookie 的答案,但找不到任何讨论全局变量的答案。这样做可能完全是愚蠢的,而这正是我试图找出的。
  • 上面链接的重复问题没有讨论全局变量。
  • @mplungjan 我确实尝试用谷歌搜索它,但没有一个链接实际上讨论了全局变量。所有这些都是关于 cookie 与本地存储的。如果这意味着可以再次打开它以进行解释/回答,我很乐意使用此信息更新问题。
  • 是的,显示你调查的内容和你的结论以及为什么它不是stackoverflow.com/questions/27067251/…的欺骗

标签: javascript redux jwt


【解决方案1】:

如果您将 JWT 存储在全局变量或全局上下文中可用的任何存储中,它将暴露给同一页面上的所有 JS 代码。 如果您信任页面的所有其他 JS 脚本,并且可以保证您的页面不会受到代码注入攻击,那么将 JWT 存储在全局变量中是安全的。

如果您不能保证 JWT 是安全的,请不要使用全局变量,最好使用这样的封装:

(function() {
  // Retrieve the JWT from somewhere
  var jwt = "mockjwt";

  //All of the code that needs the JWT goes here
  console.log('Safe code:', jwt);

  
})();

// Evil code, either:
// - Injected through a vulnerability of your website (e.g: eval misuse,
//   WYSIWYG editor vulnerable to script tag injection, etc...)
// - Injected because your user got fooled by some "copy/paste this code in the F12 tab
//   of your browser, and you'll unlock a secret functionality"
// - Untrusted <script> tag that you added to your website

console.log('Evil code:', jwt);  //Fails because the JWT is scoped to the anonymous
                                 //function and is not accessible from anywhere outside
                                 //the function.

【讨论】:

  • 伟大的洞察力。将其存储在全局变量中是否也意味着用户在刷新页面时需要一个新令牌?
  • 另外,这种用法和本地存储类似吗?因为任何注入的代码也可以读取本地存储,关于浏览器控制台的重点,它是否也适用于本地存储?
  • 当然,通过这样做,javascript 上下文(因此令牌)在每次页面刷新时都会丢失。在代码注入漏洞方面,全局变量和本地存储之间没有更好的解决方案。全局变量可以用for(let key in window) { console.log(window[key]); }之类的代码转储。本地存储可以用localStorage转储,因此没有一个解决方案提供混淆。
【解决方案2】:

据我了解,将 JWT 存储在浏览器本地存储/缓存中更多的是通过浏览器会话持久化令牌(用户授权)。

【讨论】:

    猜你喜欢
    • 2015-06-23
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2019-04-14
    • 2015-06-25
    • 1970-01-01
    相关资源
    最近更新 更多