我应该为每个请求从 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,请不要使用本地/会话存储来存储任何敏感数据,包括令牌(JWT
s 我猜?)。这种类型的存储是完全不受保护的;您页面上运行的任何 JS 都可以访问它。一旦任何第 3 方脚本受到威胁,您的应用程序也会受到威胁(可能会将所有用户会话数据发送给攻击者)。 JWT
在某种程度上相当于用户名 + 密码,应该这样处理。使用secure
httpOnly
cookie 传输JWT
s 或在服务器端存储会话数据并使令牌成为签名会话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 的异同点