白话:
习惯了前后端统一部署的方式,用户的信息都是放在session中或者使用一些权限框架,从没有关注过session的机制,也不知道这样的方式是如何保证用户信息的安全性的。反正账号密码一登录就完事儿,然后用户的一些权限什么的信息都是放在session中,什么时候用什么时候随便取就可以了。如今开发过程中使用到了前后端分离的模式,对这些问题一思考,就觉得自己的知识真是经不起任何敲打,完全不明白。
还是白话:
前后端分离中,所有前端请求的URL都是无状态的,这样的好处就是可以扩展到多台服务器上。
网上查阅资料,都是使用token的方式来实现模拟session的效果,我一直在想,sessionId的是通过cookie的方式来前后后前传递的,那么解决完跨域的问题之后,是否也可以这样传递,最终没找到解决方案。
================================================================================================
问:前后端分离模式下如何保持会话?
答:使用token来模拟sessionID来模拟保持会话。
问:后台如何生成token?前台保存token?
答:生成的token保证唯一即可,在登录成功后作为返回值传给前台。前台登录成功接收到token之后,可以将该值保存到cookies中或者local storage中。
问:如何传递token?
答:传统模式下sessionID是存储在cookies中的,并且会在请求中默认传递。为了模拟session保持会话,token就相当于sessionID,我们需要在每次发送请求的时候传递token,因为前后分离的模式下,使用ajax来请求后台数据,我们可以将token存放在参数中,或者我们可以将token放在请求头中向后台传递,这样做仅仅是为了保证token尽可能的不被恶意读取到。
问:后台如何使用token保持会话?
答:token值在生成的时候,并发不大的情况下,可以将用户的登录信息存入数据库,设置有效时间,token作为其唯一标识。当请求来了,通过token去查询用户信息,并判断是否过期。如果并发量大,可以考虑使用redis缓存,此时token作为key值,将用户的信息保存在redis当中,redis本身可以设置过期时间。
问:使用token如何保证安全?有没有存在恶意拿到token去模拟用户登录进而获取用户重要信息?
答:个人猜测:这种情况是可能的,因为前后分离的网站,都设置了跨域,所以浏览器的同源策略就失去了效果。这个我想到的就是自己手动模拟同源,但是没有实验过,项目没有必要这么使用。
以上都是个人的思考和解决过程,有不合适的地方大家一起研究讨论。
======================补充验证方式======
之前一直在想,就算我增加了token,那么黑客依然可以通过web中取到,不管我放在cookie中还是ihead中。所以,我们应该有一个验证机制,在第一次生成token的时候,就要将token与请求过来的IP进行绑定,每次验证的时候都要拿到这IP去用作解码的密钥,这样就能保证这个token下的请求都是来自于同一个网站。我觉得这样就很好。
======================================================================
种子需要落在地上,卑微进土里,才能生根发芽。