不论在任何系统中,用户体系都是重中之重,而怎么建立一个完善的,安全的用户体系,是所有开发者都在思考的问题。
而这里就来思考一下,用户登录问题。
登录的作用主要就是用户认证,与权限认证,也就是常说的认证与授权;首先我们要明白认证与授权是两个东西,并不是一回事。
所谓的认证解决的是你是谁,而授权解决的是你能做什么,也就是权限。
http协议是一种无状态协议,所以才需要用户登录,只有这样后端服务才知道当前是谁在操作,又操作了什么东西。就拿买东西来说,用户不登录,系统怎么知道是谁在买东西,买的东西应该谁付钱,然后东西又该发给谁。
用户体系中,认证与授权是无法避免的两个东西,而认证是通过注册与登录实现的。
拿学校来举例,所谓的注册就是开学第一天,你去学校报名,告诉学校的工作人员,你是谁,你的电话,身份证,家庭住址等。对应到系统中,就是你输入手机号或身份证号又或者是用户名和密码,然后创建一个用户的过程。
而登录就是你入学之后,你出校之后再回来要进学校的大门,这时你就要学校给你的大门钥匙(就是用户名和密码),这样你才能打开门进入学校。
但是呢,你进门的时候每次都可以用钥匙开门,但对软件系统来说,用户每访问一个页面或调用一次接口都要重新输入一下用户名和密码,这对用户来说是不可接受的。
所以,服务器端就会维护一个标识,来标志你的存在,这个标识就是session,服务器端会给你一个字符串,也就是sessionId,这样你下次在进来的时候,只需要告诉服务器你的sessionId就行了。这样就不用每次都输入用户名和密码。
所以,在http这种无状态协议下,用户注册登录就是为了维护一个唯一的标识,来证明你的存在。
学校维护了你的信息(你的姓名,电话,身份证等),然后给你一个学号,你每次离开学校再回来的时候,只需要告诉保安,你的学号,保安然后查看一下是否有这个学号,就可以决定是否放你进校门。
但是呢,出于安全考虑,你的学号是有时间限制的,等过了这个时间就要重新给你分配一个学号。因为,你的学号使用等时间长了之后,可能会被别人知道,这样别人也可以通过报你的学号进入学校,所以就会造成安全问题。解决办法就是每隔一段时间(一次会话),更换一次学号,也就是每次登录都会有新的sessionId。
而从浏览器等角度来说,这个学号,也就是sessionId就保存在cookie中。这也是我们常说的cookie + session的认证方式。但cookie + session但认证方式有很多问题,比如跨域问题,安全性问题,因为cookie可以被轻易得到。
所以就有了一种新的方式,那就是令牌------token认证。
所谓的token令牌,就类似于学生的校园卡,只要你有这个校园卡,那么你就可以进入学校。
其好处就是这个校园卡里可以存放更多的信息,还有就是平台无关性。后端服务只需要根据你的信息生成一个唯一的令牌token即可。
虽然,现在token认证是目前业界普通的方式,但其也不是绝对安全的,比如你的校园卡丢了,被别人捡到了;或者别人按照你的校园卡,伪造了一张等。
所以说,用户登录安全就是要保证用户端那个能够证明自己身份的东西的安全,不论是sessionId,还是token令牌。而且,token也可以放到cookie中进行认证。
怎么保证token的安全性?
比如,设置token的过期时间,每隔一段时间token就会失效,然后生成新的token。又或者,使用加密算法,对用户信息进行加密,增加别人伪造的难度
登录的本质,就是拿到一个唯一标识,后端能够通过这个唯一标识认出你是谁。
总而言之,没有绝对安全的系统,也没有绝对安全的用户体系,我们只能尽最大的努力来防范安全问题;