首先我们要明确一点,一般权限校验时,session和cookie都是成对一起使用的
首先我们了解 cookie是什么?
cookie是一种存储类型 大小只有4kb
cookie的存在意义
我们设置在浏览器cookie中的字段,如果请求时设置了跨域请求可携带cookie,那么发起请求时就会自动将浏览器cookie中存储的字段内容添加到请求头中发送给后端
如果需要浏览器在发起请求时,自动将浏览器cookie中的字段添加到请求头发送给服务端需要有以下条件
第一所有存储在浏览器cookie中的字段path必须为’/‘,这里注意通过js添加的cookie字段需要手动设置,服务器端发送过来存储的cookie字段默认为’/'。第二发送请求时需要设置请求跨域允许携带cookie
如何将内容存储在浏览器的cookie中 ? 也就是我们常说的如何存储cookie 。这里存储cookie指的是存储在浏览器cookie中
1.我们在客户端可以通过js代码主动将内容存储在浏览器的cookie中
2.服务端可以在响应头中设置set-cookie=value这个字段,那么我们浏览器在收到服务器的响应时,会将服务器设置在响应头中的这个字段 的value值存储在浏览器cookie中。
为什么服务器要在响应头中设置cookie然后存在我们客户端的浏览器中呢?
这是因为假设有多个客户端向服务器端发送请求,我们服务器要识别不同的客户端
那么就要在不同的客户端的浏览器cookie中设置不同的cookie值,这样
不同的客户端发送请求到服务器时携带的cookie不同,服务器就能做出识别
好了我们知道了cookie的作用,现在了解session了。
session说白了一般就是一个字符串,但是这不是一般的字符串,是服务器根据不同用户生成的唯一字符串。而这个字符串我们通常叫session。而这个字符串才是真正实现权限验证的关键
为什么说我们cookie和session一起使用呢,因为cookie是一种功能,解决浏览器http请求无状态的功能。通俗来讲就是首先利用cookie的机制------服务器既可以设置cookie内容,浏览器每次掉接口会自动将cookie中的内容发给服务器。
服务器在设置cookie时可以对cookie添加几个属性,以对该cookie做某些限制,例如设置cookie的path,代表cookie生效的地址,domin代表cookie对应的域名,secure代表cookie是否在https协议下才生效。httponly代表该cookie在前端是否可以被操作。
我们知道cookie的这个机制后,结合sesssion就可以实现每次用户掉接口,客户端验证。
具体怎么实现的呢,首先用户每次登录后,我们就可以在服务端生成该用户对应的唯一session,首先将该session存储在服务端,然后将session设置在cookie中(一般在cookie中存储叫sessionId=‘session字符串’)。这样由于cookie的机制,每次客户端一发请求就会自动将cookie中的这个sessionId传到服务端,然后服务端因为之前就已经提前存储好了该客户对应的session,所以只要将客户端传过来的session与服务端存储的session作比较就可以了
总结:
说白了这种权限验证 就是首先利用了cookie的机制----调接口自动将cookie内数据发送给服务器
再在服务器端存储一个特殊的用于验证用户信息的唯一字符串
然后将这个字符串再添加到cookie中,这样客户端浏览器中的cookie也会有一份和服务器端一模一样的字符串。这样每次掉接口,服务端通过拿到浏览器发送过来cookie中的这个字符串然后与原先存储字符串进行比较
举个最简单的粒子
超市会员卡功能。我们第一次去超市,超市免费送我们一张会员卡(假设一个人只能拥有一张会员卡),但是我们总是忘记带怎么办呢,我们可以挂个绳子在身上,然后将会员卡挂在绳子上,你每次去超市通过绳子就会自动携带这个会员卡。但是我们这个会员卡为了防止造假,超市在他们的机器上就存储了他们超市所有会员卡的卡号,你每次来超市都先进行刷卡,看看你的会员卡号是否已经在我们机器上存在,存在就代表是我们超市的会员卡,不存在当然就不是。
在这个例子中这个绳子就好比cookie,
我们之前说了,一个人只能拥有一个会员卡,所以一个人就对应一个会员卡号
而这个会员卡号就相当于session这个特殊得字符串。
补充:
我们平时说的cookie存储在客户端,说的是cookie存在于客户端,我们可以在cookie中存储东西。所以我们说的那些cookie存储在浏览器,而session这个字符串存储在服务端都是不准确的。
因为session是客户端与服务端进行鉴权的一个标识字符串。所以客户端与服务端都要保存一份儿。服务端将其保存在内存或者数据库或者其他地方中。客户端则将其保存在cookie中(因为每次调接口请求服务器都会自动将cookie中的所有数据携带到服务器)。这样调接口时服务端就能每次拿到用户客户端的session与自己服务端的session做比较了。这就是通过cookie加session实现鉴权的方式。
注意:
使用cookie必须保证调接口时候没有跨域问题,出现跨域问题,cookie则不会自动将内部数据携带到服务端
2.jwt
jwt就是使用token进行权限校验 ,token进行权限校验与cookie结合session进行权限校验 有两种不同。
1.如果出现跨域则不能使用cookie结合session进行权限校验,因为出现跨域时,cookie中的数据无法自动携带到服务器。而token则没有要求,因为token是需要用户手动添加到请求头中携带过去(当然你也可以放到cookie或者请求体中)。
2.token不用存储在服务端,token是通过一种插件根据用户的信息 加密之后得到的一串字符串,然后由服务器端发送给客户端,客户端自行保存,客户端每次掉接口需要自行添加到请求头携带给服务端。为什么服务器不用进行存储呢,因为我们之前说过是根据用户的信息进行加密,反之服务器每次拿到token时候也可以进行解密,然后判断解密后得到的用户信息
下图为jwt的处理方式