我应该为每个请求从 sessionStorage 获取 access-token 吗?

Should i get access-token from sessionStorage for each request?

所以基本上当我登录我的后端时 returns 给我一个令牌,所以我将它存储为:

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

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

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

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

{ headers: { "Authorization": "Bearer " + token } }

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

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

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

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

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

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

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

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

另外,这里取个峰:

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

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

希望对您有所帮助 :-)