通过检查localstorage.getItem('token‘)来判断是否登陆,安全吗?

Feeco
  • 53

我看了很多的代码,包括教程,文章。
基本都是在log in的时候,把token存到localStorage,然后刷新页面之后为了检测登陆状态就是检查 token存不存在。
那么请问,这样做安全吗,一个网站的token,可以通过控制台注入阿。
我在控制台随便写个localstorage.setItem('token','xyz'),然后我就可以访问那些私有的路由了??

另外,请问各位大佬,有没有更好,更安全的最佳实践。
谢谢

我的在最终方案:
token存在localStorage,然后用crypo-js进行一个加密,存在localstorage里面的键名是一堆乱码,类似localStorage(":s_tll","加密后的token")。

这样就不担心人直接打开看了,无非就是每次刷新页面的时候损失一点点性能。

回复
阅读 2.1k
5 个回答

楼主想的太多了,前面的回答也没说明白。
由于http连接是无状态的,所以不管是cookie还是token,其实主要作用只有一个,就是告诉后端这次访问和刚才的那一次访问是同一个人。形如{sessionId: uniqueCodeString}
那么,所谓登录,就是标记一下这个人经过身份验证了。形如{sessionId: uniqueCodeString, isLogin: true}。相对来说,后端的数据难以伪造,所以是安全的。
至于前端,这个登录状态只是一个显示优化,因为后端不可能给你提供一个单独的API去验证token,主要是没必要。
前端标记为已登录,只是跳过了登录页面,只要你请求后端数据,后端还是会返回403导致显示异常。所以前端往往也会“记住”登录状态,但只是用来避免显示异常而已。

关键一点:不论形式如何,这个唯一连接标识是后端生成的,前端修改这个标识没有意义。如你所说的将token重新赋值,那么token发送到后端后只有一个结果,后端说这个token没见过,肯定是另一个人了。

因此,有一种安全问题叫做令牌劫持。就是A用户获取了服务器发给B用户的token,然后A就可以用B的身份和服务器交流了。所以,前端用sesssionStorage存储token更好一些。

总结:前端由于明文的原因,因此不可能实现“安全的安全验证”,前端只是基于使用者正常使用的前提下,尽量保持和后端相同的“安全属性及值”,从而提供更好的交互体验。而后端总是基于“前端数据不可信”为前提进行完整的安全检查的。

前端本地存储token,只是为了业务需要,和后端交互的时候,带上token去做登录验证,再者每次和后端会话的时候,后端也会去验证token的正确性的,token还会有自己的过期机制等,所以你随便写一个token就破坏安全性的说法也是不成立的。至于私有路由也是通过token来验证当前用户权限,并不是说带了你写的token就会给你私有路由。
至于比较好的方案,你可以看看思否的登录方式,通过cookie 来做,或者你不想用户能直接修改也可以存储到你自己的数据流中,不过这样的话用户每次打开网站就需要登录一次。
建议你多了解下token机制吧。

你的思路刚好想反了. 用户在没有登录过的情况下,如何知道token存到localstorage的字段名是token还是tokenId,还是其他?所以你举得这个人更大可能是已经登录过的用户
既然他已经有账号了,那么他为什么还非要模拟token?直接登录不是更简单?
同上,没有登录过的用户,如何知道私有路由的地址?

注入token容易
注入正确的token很难
token 是需要后端做校验的 不是说随便写个什么都可以的

凌康233
  • 3
新手上路,请多包涵

前后端分离不是你这样思路的,不管token存哪里,只要请求带上就行,后端每个请求都要检查token是否有效的,正常来说存cookie和local都一样的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏