简介
登录模块很简单,前端发送账号密码的表单,后端接收验证后即可~
淦!可是我想多了,于是有了以下几个问题(里面还包含网络安全问题):
1.登录时的验证码
2.自动登录的实现
3.怎么维护前后端登录状态
在这和大家分享下我实现此功能的过程,包括一些技术和心得
1.登录时的验证码
为什么要验证码,原因很简单,防止脚本无限次重复登录,来暴力破解用户密码或者攻击服务器
验证码的出现,使得每次登录都有个动态变量需要输入,无法用脚本写死代码
具体可以参考:滑动验证码的设计和理解
2.自动登录的实现
所谓自动登录,指的是当用户登录网站时勾选了自动登录,那么下次再访问网站就不需要输入账号密码直接登录了
这说明,账号密码信息是必须保存在用户这边的,因此自动登录都是不安全的!(方便的代价呀)
尽管不安全,但是我们也必须要尽力让它安全一点,有以下常用方法:
1.账号密码加密保存
2.降低自动登录后用户的权限(如果用户自动登录想改密码,想给我转钱等操作的话,就必须输入账号密码再登录一次!)
3.进行ip检测(之前登录的ip小本本记着),如果发现和上次不一致,则不允许自动登录
数据存储在前端哪里呢
浏览器有3个经常保存数据的地方
1.Cookie(我用这个)
2.LocalStorage
3.SessionStorage
各位可以按F12直接观看
如果你在多个大型网站下都按按F12,会发现SessionStorage基本没数据
为啥,因为真的不好用,它并不是后台的session那样,生命周期是一个会话,这个SessionStorage存储的数据只限于该标签的页面
意思是标签1和标签2即使是同个URL的网址,里面的数据都是不互通的(这有个毛用)
那么LocalStorage存储的数据如何呢,答案是无限期本地存储
不过后台无法操作这里的数据,只能由js代码操作(至于操作结果,完全看js,后端无法感知,不太可靠),我认为这里不适合保存敏感点的信息,因为前端的功能是展示,状态性的数据应该由后端直接掌控(后端能直接操作Cookie,保证完成任务)
你看英雄所见略同,CSDN网站的用户密码也是存在Cookie的
Token就是登录后的令牌(下一点会讲)
所以用Cookie就对啦,具体实现都很简单,前端多个自动登录的选择,选择后多个参数传给后端,后端根据参数往Cookie里设置加密后的账号密码
等下次访问时,用拦截器Interceptor进行拦截,检测是否要自动登录即可~
3.如何维护前后端登录状态
大家最先想到是用Session来维护,登录后在Session中存放用户信息,不过对分布式很不友好(什么,你说你用不到分布式,我也没用到,可是梦想还是要有的嘛),需要维护个分布式数据库来进行数据同步才行
于是我用Token实现的,Token就是一串字符串,最适合API鉴权(例如SSO单点登录这种),俗称令牌
好处就是账号密码用户输入一次就够了,特别是多个系统之间(一张身份的凭证都通用)
当用户登录后,服务器就会生成一个Token放在Cookie中,之后用户的所有操作都带这个Token访问(将Token放入