所以基本上当我登录我的后端时返回一个令牌,所以我将其存储为:
// var token is global
token = res.data.token;
sessionStorage.setItem("token", token);
当我退出时,我只是从sessionStorage中删除项目并重置var:
token = '';
sessionStorage.removeItem("token");
然后在我的所有请求中,我使用var来创建标题
{ headers: { "Authorization": "Bearer " + token } }
但我不知道我是应该保留令牌var还是仅为每个请求访问存储空间,如:
{ headers: { "Authorization": "Bearer " + sessionStorage.getItem("token"} }
现在我只是在用户刷新页面时使用存储,因此他不会丢失javascript上下文,因为我认为比每次请求访问存储更有效,但我不知道知道什么是安全方面的最佳方法,或者通常开发人员做什么?
答案 0 :(得分:2)
从安全角度来看,它没有任何区别;两者都不比另一个更安全。
如果您在进行ajax调用时只需要令牌,请不要担心从sessionStorage
获取令牌的开销。该操作根本不需要任何重要时间,当然不能与执行ajax调用相比。如果您在一个紧凑的循环中使用它,在用户等待它们时进行数千次操作(或可能是数十万次),您只需要将结果缓存在变量中。您可能希望在其他原因(例如,方便)的变量中使用它,但在您描述的情况下没有效率参数。
一般规则:当您遇到性能问题时担心性能(但是,您知道,不要完全愚蠢地做一些您知道非常低效的事情......)。 : - )
答案 1 :(得分:0)
第一件事-如果您要加载 ANY 第三方JS,请不要使用本地/会话存储来存储任何敏感数据,包括令牌(我猜是JWT
吗?) 。这种类型的存储完全不受保护。您页面上运行的所有JS都可以访问它。一旦任何第三方脚本遭到破坏,您的应用程序也会受到威胁(可能会将所有用户会话数据发送给攻击者)。 JWT
在某种程度上等同于用户名+密码,应该这样处理。使用secure
httpOnly
cookie来传输JWT
或在服务器端存储会话数据,并使令牌成为已签名的会话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
希望这会有所帮助:-)