Cookie、Session、Token的区别

        首先来说一下三者的共同点:都与维持状态信息有关。

        那什么叫做状态信息?

        举例来说明一下:就是当我们遇到一个登录页面,登陆后所有的操作都要维持在已经登录的状态,这时候我们就需要用到Cookie,Session,Token当中的一种

        在没有Cookie、Session、Token 之前,我们要是想以登录的状态,给服务端发送请求,我们必须要在发送请求的时候带着用户名和密码如下图所示:

        每请求一次要带在请求中带着用户名和密码。

        这样就会出现两个弊端:

        1.不安全

        2.麻烦

        这时候我们就可以用Cookie来解决这个问题

        每次当我们发送登录的请求的时候,如果登录成功的话,服务器响应时就会带回来一个cookie,这个带回来的cookie就会被存储在客户端上(一般就是浏览器上),下次再进行访问的时候就会带着cookie去服务器进行访问,服务器就会认为你是在登录状态下进行的请求就会处理请求并响应。

        但是使用Cookie存在以下三个风险:

                1.有被篡改的风险

                2.容量小,只有4kb

                3.可用限制,用户能禁用

        因为Cookie是存储在本地的,用户可以通过浏览器看到cookie信息,从而修改cookie信息,这时候浏览器要是发送带着修改后的cookie的信息去服务器,服务器就会按照修改后的Cookie的信息对需求进行处理,因为服务器无法看Cookie是否被修改。因为Cookie是在客户端上的,所以用户可以在浏览器上禁用Cookie。

        这时候我们就用到了session

        当前端发起登录请求,会把用户名和密码传给后端,后端进行验证,当后端验证成功了, 就会把用户信息存入到一个session中,然后对请求进行响应,响应的时候就会在请求头信息中加入一个set-Cookie的信息,然后把当前的session作为唯一的Id放在属性中,前端会自动在cookie中存入当前sessionId,登录成功后下一次的请求就会在自动在请求头信息中设置cookie信息,然后服务器就能拿到cookie信息获取当前登录的用户信息。使用session非常方便,我们只需在后端存储用户信息(不仅仅限于字符串,可以存取整个User对象),下次获取就非常的方便。服务器会在自动在响应头中添加set-cookie的属性,以及当前唯一的id值,当浏览器发现我们返回的请求头中有set-cookie属性就会自动调用这个方法,把seesion存入浏览器,当下一次发送请求的时候,也会把安全域的cookie传到服务器端。

        我们可以看到session就类似于给Cookie进行了一次加密,Cookie就相当于信,而 session相当于信封。

session的优点:

        安全性高:存储在服务器端

        容量大:可以存储对象

session的缺点:

        占用服务器资源(高并发)

        扩展性差(分布式集群)

        依然需要依赖cookie 跨域限制

        后端的端口域名比较多,会出现跨域访问的问题,cookie是默认无法进行传递的。我们需要在后端单独设置,前端也需要设置。总之cookie的跨域访问特别困难。所以在集群环境和前后端分离的架构下session已经不再适用。

        就出现了token来进行改造,token的本质就是一个密钥字符串。

        那他是怎么做到的呢?

        其实是JWT为他提供了规范,jwt:json web token,就是使用json来进行传递的加密后的字符串

        jwt加密后分成三个部分:

        header:包含加密算法和token类型,这个信息经过base64编码后就变成了头部信息

        payload负载数据:就是需要传递的数据

        密钥:只有自己知道的私钥

jwt的使用过程:

        前端发送登录请求,后端进行验证,认证成功会创建一个JWT的字符串(包含以上三段信息),然后把创建好的信息返回到前端,前端拿到JWT的token的值,进行分割拿到第二部分所保存的数据值,用base64的方式进行解码,后续的请求只需要设置一个跟后端约定的属性值,然后把响应的JWT token传入后端就行,后端拿到后进行jwt的解密验证signature,检验成功就会放行,进行正常响应。不需要在前端和后端进行任何储存,就是一个被加密的字符串

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值