前言:
一直想写一篇博客,对token进行详解一下,也是对以前学的知识进行整理,所以今天在此记录一下。另外自己开通的博客还在备案中,等开通成功后,将会在自己的博客上发表,敬请期待。
什么是token?
我们在登陆设计的时候就要设置token。为什么要设置token呢。没有token会怎样呢?HTTP是无状态的,一次请求结束,连接断开,等待下一次服务器再次收到请求,他就不知道这个请求是哪个用户发过来的。所以对于应用而言,我们需要他是有状态管理的,以便于服务端能够准确知道是哪个用户发起的,从而判断该用户是否有权限继续这个请求。
所以token也就是一个令牌,亦是一种服务端无状态的认证方式。
什么是session、什么是cookie?
前面介绍了token,也在这里介绍一下session和cookie,因为这三个都是在登陆设计会出现的。
什么是Cookie呢,他是一个非常具体的东西,就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现得一种数据存储功能。Cookie有服务器生成,发送给浏览器,浏览器把cookie以键值对形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器,由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie是有限制的。
如果服务器返回的一个cookie,没有指定其expire time,那么表明此cookie有效期只是当前的session,即是session cookie,当前session会话结束后,就过期了。对应的,当关闭(浏览器中)该页面的时候,此cookie就应该被浏览器所删除了。
什么是Session呢?当我们和别人交谈的时候,这就是一个会话。而与我们交谈的人也会因某些特征而被区分。服务器要知道当前发出请求给自己是谁,所以为了区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个身份标识。默认都采用cookie的方式。
token的使用
token的本质就是一个唯一标识符的字符串,可以有UUID生成,也可以有用户ID根据算法进行加密生成,取到token之后在进行解密,取出用户的ID。
token的保存可以放到数据库里或者缓存,但是放进数据库会严重消耗服务器的资源,所以建议放到redis缓存中,这样简易操作,并且加快了查询速度。
我在网上看到了一种token过期的处理方式,也在这里说一下把:
- 方式一
前端登陆获取token后,每次请求都会携带token;
前端每次携带token发起请求时,后端都把这个token的有效期更新为最大。
如果很久没有使用,导致token过期,前端请求时后端会返回指定的状态码,前端根据状态码跳转到登陆页面。
总结
- session存储于服务器,可以理解为一个状态列表,拥有一个唯一识别符号sessionId,通常存放于cookie中。服务器收到cookie后解析出sessionId,再去session列表中查找,才能找到相应session。依赖cookie
- cookie类似一个令牌,装有sessionId,存储在客户端,浏览器通常会自动添加。
- token也类似一个令牌,无状态,用户信息都被加密到token中,服务器收到token后解密就可知道是哪个用户。需要开发者手动添加。
分享一个用户登陆功能设计思路
1. 用户登录注册
登录注册页面前端部分内容,关注的重点还是用户账号和密码在js代码里要做对应正则的匹配,这是验证的第一步,保证用户输入格式的正确性同时也从一方面减少用户向后台发送没必要的错误请求。前端向后端请求的方式使用POST
2.用户密码安全性
密码要如何保存, 明文存入数据库?当然非常非常非常不推荐, 由于大多数客户的习惯都是使用相同的密码, 如果明文在发生信息泄露的情况下容易发生撞库的事情。所以在密码的保存上最好在后台使用“密钥 + 不可逆加密算” 如 sha1,sha256等有hash算法的不逆的加密算法进行加密后再存入数据库。
3. 登录状态的保存
由于http协议是无状态的, 所以要记录用户的登录状态就要靠后台相应数据的维护来记录, 我们通常都是登录成功后在seesion中保存登录用户, 然后将用户登录通过cookie返回到客户端, 通过比对cookie和seesion信息来验证用户是否登录。
4. 防止cookie被盗用
为了防患cookie被盗用的情况还要在cookie中添加token、登录序列。这两个都是使用MD5进行加密的随机字符串, 作用就是在每次登录验证时, 同时验证token和登录序列还有ip地址, 因为在每次登录验证成功时都会刷新token, 如果cookie被盗用在正主使用旧cookie时出现登录序列相同, token不同而且ip地址多次变更的情况就要记录下此用户账户异常, 并且删除后台session里的登录记录,并提醒用户。
5. 密码找回功能
因为后台密码是加密没法提供明文密码的找回, 所有可以设计通过手机短信验证或者邮箱验证, 验证成功后通过直接设置新密码的形式来进行, 对于重置密码的url地址为了安全起见要通过加入时间戳和唯一随机数来保证这个链接只在某个事件内有效, 如果在密码修改成功或者事件过期, 就把这个唯一随机数给删除, 保存密码方式同上。
6. 防止恶意攻击
最有效的手段就是加入验证码, 同时记录某个用户在或ip在某个时段内如果尝试的失败登录次数超过一定阈值就限制其在几分钟内不能继续登录。