我看了很多的代码,包括教程,文章。
基本都是在log in的时候,把token存到localStorage,然后刷新页面之后为了检测登陆状态就是检查 token存不存在。
那么请问,这样做安全吗,一个网站的token,可以通过控制台注入阿。
我在控制台随便写个localstorage.setItem('token','xyz'),然后我就可以访问那些私有的路由了??
另外,请问各位大佬,有没有更好,更安全的最佳实践。
谢谢
我的在最终方案:
token存在localStorage,然后用crypo-js进行一个加密,存在localstorage里面的键名是一堆乱码,类似localStorage(":s_tll","加密后的token")。
这样就不担心人直接打开看了,无非就是每次刷新页面的时候损失一点点性能。
楼主想的太多了,前面的回答也没说明白。
由于http连接是无状态的,所以不管是cookie还是token,其实主要作用只有一个,就是告诉后端这次访问和刚才的那一次访问是同一个人。形如
{sessionId: uniqueCodeString}
那么,所谓登录,就是标记一下这个人经过身份验证了。形如
{sessionId: uniqueCodeString, isLogin: true}
。相对来说,后端的数据难以伪造,所以是安全的。至于前端,这个登录状态只是一个显示优化,因为后端不可能给你提供一个单独的API去验证token,主要是没必要。
前端标记为已登录,只是跳过了登录页面,只要你请求后端数据,后端还是会返回403导致显示异常。所以前端往往也会“记住”登录状态,但只是用来避免显示异常而已。
关键一点:不论形式如何,这个唯一连接标识是后端生成的,前端修改这个标识没有意义。如你所说的将token重新赋值,那么token发送到后端后只有一个结果,后端说这个token没见过,肯定是另一个人了。
因此,有一种安全问题叫做令牌劫持。就是A用户获取了服务器发给B用户的token,然后A就可以用B的身份和服务器交流了。所以,前端用sesssionStorage存储token更好一些。
总结:前端由于明文的原因,因此不可能实现“安全的安全验证”,前端只是基于使用者正常使用的前提下,尽量保持和后端相同的“安全属性及值”,从而提供更好的交互体验。而后端总是基于“前端数据不可信”为前提进行完整的安全检查的。