聊聊鉴权那些事(推荐)

在系统级项目开发时常常会遇到一个问题就是鉴权,身为一个前端来说可能我们距离鉴权可能比较远,一般来说我们也只是去应用,并没有对权限这一部分进行深入的理解。

什么是鉴权

鉴权:是指验证用户是否拥有访问系统的权利。传统的鉴权是通过密码来验证的。这种方式的前提是,每个获得密码的用户都已经被授权。在建立用户时,就为此用户分配一个密码,用户的密码可以由管理员指定,也可以由用户自行申请。这种方式的弱点十分明显:一旦密码被偷或用户遗失密码,情况就会十分麻烦,需要管理员对用户密码进行重新修改,而修改密码之前还要人工验证用户的合法身份。 -- 节选自百度百科

上述简单扼要的说明了一下鉴权的概念,但是这也只是简单的鉴权,也是项目中最最常见的及安全形式了,但是对于后端鉴权又是如何去做的,我们仍是一无所知,一般来说对于后端来说,鉴权最长见的方式分为三种:

Session/Cookie

Token或Jwt

OAuth

这种授权方式是浏览器遵守http协议实现的基本授权方式,HTTP协议进行通信的过程中,HTTP协议定义了基本认证认证允许HTTP服务器对客户端进行用户身份证的方法。接下来就一一介绍一下这三种鉴权方式。

Session/Cookie

Cookie是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。Cookie由服务器生成,发送给浏览器,浏览器把Cookie以KV形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该Cookie发送给服务器。由于Cookie是存在客户端上的,所以浏览器加入了一些限制确保Cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的Cookie数量是有限的。

Cookie.js

const Http = require("http"); const app = Http.createServer((req,res) => { if(req.url === "/favicon.ico"){ return; }else{ res.setHeader("Set-Cookie","cx=Segmentfault"); res.end("hello cookie"); }; }); app.listen(3000);

使用node Cookie.js运行上面代码,等程序启动后访问:3000/,就可以看到hello cookie字样,这样的话就代表该服务已经启动了。若想查看到到我们所设置的Cookie,首先观察一下在Network中Response Headers中,可以看到我们所写的Set-Cookie属性,当我们访问:3000/的时候,当浏览器接收到Set-Cookie这个属性的时候,浏览器会根据其内部约定,并在其浏览器内部对其cookie进行存储,打开浏览器控制台,在Application中找到Cookies中找到相对应的域名,就可以看到我们所设置的cookie值了。当在同域的情况下,当再次请求数据的时候浏览器会默认发送cookie在该请求中,一起发送给后端。为了证实上面的说法,刷新一下:3000/页面,在控制台Network找到Request Headers中可以看到Cookie: cx=Segmentfault属性,既然发送给服务端之后,相应的在后端也是可以接收到该Cookie的,修改一下上面的例子:

const Http = require("http"); const app = Http.createServer((req,res) => { if(req.url === "/favicon.ico"){ return; }else{ console.log("cookie",req.headers.cookie) res.setHeader("Set-Cookie","cx=Segmentfault"); res.end("hello cookie"); }; }); app.listen(3000);

在接收到访问的时候,就可以接收到了cx=Segmentfault,如果说现在这份Cookie是一份加密的数据的话,里面包含一些用户信息,在通过前后端进行交互之后,当客户端再次请求服务端的时候,服务端拿到相对应的Cookie并对其进行解密,对其中用户的信息进行鉴权处理就可以了。

服务端通过Set-Cookie在Response Headers设置了一段加密数据,客户端接收到了其相对应的数据之后,浏览器对其进行存储,当可客户端再次发送请求的时候,会携带已有的Cookie在Request Headers中一并发送给服务端,服务端解密数据完成鉴权,由此可以得出Cookie是服务端存储在客服端的状态标志,再由客户端发送给服务端,由服务端解析。Cookie在使用中必须是同域的情况下才可以,一般常用的是在MVC这种开发形式中很常用。

说了半天Cookie,但是对于Session却只字未提,接下来就介绍一下Session,Session从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。Session也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的身份标识,然后客户端每次向服务器发请求的时候,都带上这个身份标识,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个身份标识,可以有很多种方式,对于浏览器客户端,大家都默认采用Cookie的方式。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/f5af62cbc84424f6828ecb3604701384.html