1. 登录
会话
在计算机科学领域来说,尤其是在网络领域,会话(session,Microsoft Windows 中文版译作工作阶段)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(例如telnet或FTP)中是非常重要的部分。
在不包含会话层(例如UDP)或者是无法长时间驻留会话层(例如HTTP)的传输协议中,会话的维持需要依靠在传输数据中的高级别程序。例如,在浏览器和远程主机之间的HTTP传输中,HTTP cookie就会被用来包含一些相关的信息,例如session ID,参数和权限信息等。
上述会话的解释来自维基百科,我来谈谈我对会话的理解,首先,是网站证明用户属于自己网站的注册用户,并且已经完成验证的证明,这个证明包括:
- 用户信息
- 有效时间
在以前我自己写网站代码的时候,我其实不是很理解登录之后会有什么变化,就是我在网站输入了我的账号密码后,这个网站会有什么变化,在以前的文章上,我实现过登录注册的功能,但是一直不是很理解,现在我理解了,其实就是为了让网站统一认识你,认识已经登录过的你。
举个例子,现在的浏览器都支持标签页,也就是同一个浏览器可以打开不同的网址,那么当我打开同属于一个网站的两个网页的时候:
对于这两个页面来说,如果有一个页面登陆,另一个页面也应该是登陆的,也就是意味着,这里俩页面要共享一个参数。
- 假设只使用数据库
假设只使用数据库来保存登陆的信息,有这样一个表,如果有人登陆了账号,就向这个数据库插入一条数据,另一个页面在访问后端的时候,查到了这个表的这一条数据,就发现登陆了,就返回登录的信息,这样说来,貌似没有什么不妥。
但是承担登录信息的压力就全都靠服务器数据库来保持,压力会有点不均衡。
那有没有一种方式,证明你登录过,可以在两个页面之间共享就可以了。这就是Session的出现。
- 如何验证登录
我还记得以前用Java写代码的时候,直接用
select * from user where account='accountStr' AND password='passwordStr'
但是这样写的问题是,如果有人使用
1 OR 1
恶意的登录,是可以登录的,不相信的亲们可以试试。
所以验证密码的时候,先查询出密码,再判断密码是否一致,这样那个"1 OR 1"就无效了,当然这是针对以前的烂代码说的。
2. 会话 session
其实没那么神秘,就好像我们平时要组织一场会议,总要有会议的时间、地点、内容、主持人这几个因素。
- Session保存在服务端
也就是不在我们每个人使用的浏览器那儿,而是你访问的网站公司的服务器那里。
这也就是我们很平常的记录登录的方式,当服务器验证完之后,我们给客户端返回登录的用户名,用户ID,于是我们的网站上就会显示我的登录名,当我点击个人中心时,通过用户ID访问数据库,返回个人信息,就会显示我们的个人信息具体内容。
服务器会给这个session加上一个时间,到期后服务器会销毁这个session
,当我们再次点击个人中心的时候,或者刷新页面的时候,发现这个session不存在了,于是就返回登录过期的信息,需要用户重新登录。
3. Cookie
其实就是为了区分session,并方便session的一种方式,比如你前一天登录过了,第二天想登录的时候,我不想再次输入账号密码了,于是浏览器可以查找cookie顺便帮你填了。
- Cookie存在客户端
4. Token
就是令牌,主要是为了登录之后的事情服务,就好像参加一场会议,你会携带你的工作牌一样,当门卫检查工作牌的时候,需要检测
a)你是不是参加这次会议的人(登录名密码是否匹配在数据库)
b)是否在规定时间内参加(令牌是否过期)
如果你随便拿了一张纸,那么上述两条就都不用检测,直接拒你在门外就好了。
- JWT
JSON Web Tokens 又称JWT
。其实只是加密后的,已经被验证过的令牌(一串字符串)
可以通过引入JAR包来使用(以下为maven管理)
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
使用这种技术确实可以方便登录,而且可以用于验证权限,用于控制会话,但是也存在风险,例如:
- 无法单方面销毁,因为我们的代码通常都是讲token存在 Local Storage 当中。
- 安全泄漏,虽然token会过期,但是过期的了token仍然存在,而且这个token可能是admin权限
token自身存在一个时效,到期后会自动过期,你在访问都端的时候,会自动出现过期,过期后,客户端的代码就会判断这个token无效,这时客户端的前端代码就可以将过期的token清除
getAuthList() {
axios.get('/apiUrl/').then(this.handleAPISucc)
.catch(function() {
window.sessionStorage.clear()
})
上述代码就是通过axios的异常来判断是否过期,或者无效的情况,直接清除session即可。
总结
我以前只会使用session,现在尝试了token以后,发现token的使用感觉上很高大上,所以正在尝试,目前还没有特别深刻的业务需要,还需要后续完成各类开发,总结经验。token确实很神奇,我之前还在想如何把时效性放在token字符串里,想自己造轮子,没想到,早就有别人封装的工具了。
共同学习,写下你的评论
评论加载中...
作者其他优质文章