我应该为每个请求从 sessionStorage 获取访问令牌吗?

Posted

技术标签:

【中文标题】我应该为每个请求从 sessionStorage 获取访问令牌吗?【英文标题】:Should i get access-token from sessionStorage for each request? 【发布时间】:2018-11-19 18:34:35 【问题描述】:

所以基本上当我登录时,我的后端会返回一个令牌,所以我将其存储为:

// var token is global
token = res.data.token;
sessionStorage.setItem("token", token);

当我注销时,我只是从 sessionStorage 中删除项目并重置 var:

token = '';
sessionStorage.removeItem("token");

然后在我的所有请求中,我使用 var 创建标头

 headers:  "Authorization": "Bearer " + token  

但我不知道我是应该保留令牌变量还是只访问每个请求的存储,例如:

 headers:  "Authorization": "Bearer " + sessionStorage.getItem("token" 

现在我只是在用户刷新页面时使用存储,所以他不会丢失javascript上下文,因为我认为比每次请求访问存储更有效,但我不知道是什么安全方面的最佳方法,或者开发人员通常会做什么?

【问题讨论】:

【参考方案1】:

从安全角度来看没有区别;两者都不比另一个更安全。

如果您在进行 ajax 调用时只需要令牌,则不必担心从 sessionStorage 获取令牌的开销。该操作根本不需要任何大量时间,当然与进行 ajax 调用相比。如果您在一个紧密的循环中使用它来执行数千次(或可能数十万次)操作,而用户等待它们,您只需要将结果缓存在一个变量中。您可能出于其他原因(例如方便)将它放在变量中,但在您描述的情况下没有效率参数。

一般规则:当您遇到性能问题时担心性能(但是,您知道,不要完全愚蠢地做您知道效率极低的事情......)。 :-)

【讨论】:

【参考方案2】:

首先 - 如果您正在加载 ANY 第三方 JS,请不要使用本地/会话存储来存储任何敏感数据,包括令牌(JWTs 我猜?)。这种类型的存储是完全不受保护的;您页面上运行的任何 JS 都可以访问它。一旦任何第 3 方脚本受到威胁,您的应用程序也会受到威胁(可能会将所有用户会话数据发送给攻击者)。 JWT 在某种程度上相当于用户名 + 密码,应该这样处理。使用securehttpOnly cookie 传输JWTs 或在服务器端存储会话数据并使令牌成为签名会话cookie。

访问本地/会话存储的开销可以忽略不计。但是,如果您非常担心性能,请在应用程序初始化时将令牌加载到变量(或某种服务或存储)中,使用它构造 Authorisation 标头并仅在令牌更改时访问存储。

另外,请在这里拍个高峰:

https://dev.to/rdegges/please-stop-using-local-storage-1i04

https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage

希望这会有所帮助:-)

【讨论】:

以上是关于我应该为每个请求从 sessionStorage 获取访问令牌吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应中从对象映射动态设置 sessionStorage

前端本地存储的 3 种方法 cookie、localStorage、sessionStorage

Cookie, LocalStorage 与 SessionStorage说明

sessionStorage localStorage 与cookie 的异同点

多人游戏是不是应该总是根据每个客户端请求从数据库中请求数据?

sessionStorage和localStorage的使用