鉴权(authentication)是指验证用户是否拥有访问系统的权利。传统的鉴权是通过密码来验证的。这种方式的前提是,每个获得密码的用户都已经被授权。在建立用户时,就为此用户分配一个密码,用户的密码可以由管理员指定,也可以由用户自行申请。
常用的鉴权方式
- cookies
- session
- token
cookies
网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,
它会自动将同一服务器的任何请求缚上这些cookies。
其实cookies是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件,
它和你的网络浏览行为有关,所以存储在你电脑上的cookies就好像你的一张身份证,
你电脑上的cookies和其他电脑上的cookies是不一样的;cookies不能被视作代码执行,
也不能成为病毒,所以它对你基本无害。
-
cookies的作用
记住密码,下次自动登录。
记录用户浏览数据,进行商品(广告)推荐。
购物车功能。 -
工作流程
- #####1、创建Cookie
当用户第一次浏览某个使用Cookie的网站时,该网站的服务器就进行如下工作:
1. 该用户生成一个唯一的识别码(Cookie id),创建一个Cookie对象;
2. 默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。如果网站希望浏览器将该Cookie存储在磁盘上,则需要设置最大时效(maxAge),并给出一个以秒为单位的时间(将最大时效设为0则是命令浏览器删除该Cookie);
3. 将Cookie放入到HTTP响应报头,将Cookie插入到一个 Set-Cookie HTTP请求报头中。
4. 发送该HTTP响应报文。 -
2、设置存储Cookie
浏览器收到该响应报文之后,根据报文头里的Set-Cookied特殊的指示,生成相应的Cookie,保存在客户端。该Cookie里面记录着用户当前的信息。 -
3、发送Cookie
当用户再次访问该网站时,浏览器首先检查所有存储的Cookies,如果某个存在该网站的Cookie(即该Cookie所声明的作用范围大于等于将要请求的资源),则把该cookie附在请求资源的HTTP请求头上发送给服务器。 -
4、读取Cookie
服务器接收到用户的HTTP请求报文之后,从报文头获取到该用户的Cookie,从里面找到所需要的东西。
session
服务器为了保存用户状态而创建的一个特殊的对象,可以理解为你和淘宝某位客户客服一次交流过程。这个过程是连续的,也可以时断时续的。Session是一种服务器端的机制,Session 对象用来存储特定用户会话所需的信息。
session最大作用就是保持会话状态。比如保持登录状态。
用户第一次请求服务器时,服务器端会生成一个sessionid。服务器端将生成的sessionid返回给客户端,客户端收到sessionid会将它保存在cookie中,当客户端再次访问服务端时会带上这个sessionid
当服务端再次接收到来自客户端的请求时,会先去检查是否存在sessionid
,不存在就新建一个sessionid重复1的流程,如果存在就去遍历服务端的session文件
,找到与这个sessionid相对应的文件,文件中的键值便是sessionid,值为当前用户的一些信息。
此后的请求都会交换这个 Session ID,进行有状态的会话。
token
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后
,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可
,无需再次带上用户名和密码。最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、
sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,
可以防止恶意第三方拼接token请求服务器)。
最主要是减轻服务器的压力,减少频繁的查询数据库。
客户端使用用户名跟密码请求登录,服务端收到请求,去验证用户名与密码。验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端。客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。
cookies与session的联系和区别
- cookie在客户端,session在服务端,cookie的产生是在服务端产生的
- 浏览器会把SESSIONID写入cookie,Cookie一般会保存sessionID及Session生存周期,如果用户删除Cookie一般会退出系统;如果没有禁用Cookie关闭浏览器Session也会立即失效,要重新登录系统。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
token与session的不同
- 认证成功后,会对当前用户数据进行加密,生成一个加密字符串token,返还给客户端(服务器端并不进行保存)。
- 浏览器会将接收到的token值存储在Local Storage中,(通过js代码写入Local Storage,通过js获取,并不会像cookie一样自动携带)。
- 再次访问时服务器端对token值的处理:服务器对浏览器传来的token值进行解密,解密完成后进行用户数据的查询,如果查询成功,则通过认证,实现状态保持,所以,即时有了多台服务器,服务器也只是做了token的解密和用户数据的查询,它不需要在服务端去保留用户的认证信息或者会话信息,这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利,解决了session扩展性的弊端。