• 01-用户认证


    关于用户认证,我们可能最先想到的就是session和cookie。那么什么是session,什么又是cookie?这就不得不说起http协议。

    http协议是基于tcp协议之上的应用层协议。http协议在报文的编码上采用了文本形式,通信上采用客户端到服务器的请求-响应方式。http协议的文本形式报文编码给程序员带来了很大的方便,能够直观的看到数据,很容易被理解。但是http也有缺陷,http是无状态的,在http的交互中如何保持状态就是我们开发中面临的一个问题。

    状态保持在互联网交互需求中是非常重要的需求。如果没有状态,A用户在京东购买的商品,却在B用户的订单中出现,最终的商品发货到了C用户地址。这样岂不天下大乱了,所以客户端发起http请求时,必须知道来自哪个客户端,对应哪个用户。

    那http协议要想保持状态,可用的方法只能是利用协议本身的一些属性来实现。我们可以使用header,body等,只要服务器能够识别,都可以作为保持状态的方法。

    那么cookie就是http请求的一个属性,它保存在客户端。http请求发起(浏览器在没有跨域的情况下,会自动携带cookie),服务端接收到http请求时,解析对应的cookie就可以得到需要保持的状态的标识。cookie本身是属于客户端的东西,只是cookies里面携带的内容是由服务端进行设置的,用于后面的http请求发起时进行携带。也可以使用postman将预设的身份标识信息直接写入cookie中,这个时候就可以用postman直接访问服务端接口了。

    http状态的保持需要客户端和服务端同时协作来完成,如果客户端上传的cookie在服务端不能够正确的解析,那么状态也就无法保持。理论上主要http请求能够识别http请求携带的约定数据,就能够达到状态保持的目的。

    关于header的属性有很多,用户认证常见的比如“Authorization”,用户登录的状态在http请求中就可以使用这个字段。我们也可以自定义,在header中定义约定的字段来进行不同业务处理,只要客户端和服务端保持一致就能够实现。

    关于cookie和session

    cookie指某些网站为了辨别用户身份、进行session跟踪而存储在用户本地终端上的数据(通常会加密)

    session称为会话控制,session对象存储特定用户会话所需的属性及配置信息。

    从两者的定义就可以看出,cookie是存储在客户端的,session位于服务端。

    cookie本质上是http请求(或者说是浏览器)提供的一种客户端存储的数据,这个数据有自己专有的一些特性。这个数据既可以存储在硬盘上,也可以存储在内存中。session基本会被称为会话,本质是一种服务端的存储数据。诞生的主要原因就是为了解决http无状态的这种特性。这个数据可以存储在内存中,文件中或者redis中。

    我们通过http请求的简单过程进行理解两者。当用户第一次访问并登陆一个网站时,我们可以简单的描述为4步实现:

    1. 客户端发起一个请求HttpRequest到服务端
    2. 服务端发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部
    3. 客户端保存cookie,之后向服务器发送请求时,httpRequest请求中会包含一个Cookie的头部
    4. 服务端进行验证,返回相应数据

    由于浏览器的安全策略问题,不同域名的cookie是不允许的,但是可以通过服务端的配置来解决合格跨域问题。

    我们也可以使用postman模拟此过程,我们可以把cookie直接设定好,拿着cookie对应的数据直接访问服务器,也是可以通过的。

    session创建的目的就是为了让服务端记住会话,这样服务端就能够识别出来自哪个客户端的请求。服务端会存储每个会话的数据,但是必须依靠客户端来上传每个会话的标识,这样服务端就能够知道这个会话的数据对应哪些信息。所以我们客户端就可以使用cookie来存储session的标识。cookie本身就是一种KV的数据存储格式,同样session也是KV数据格式,这样将两者一起使用,就实现了用户的标识。同样我们也可以把session的key放在header中的其他字段中。所以cookie和session没有必然的联系,他们只是合作来完成了一件事情,当然session也可以和其他属性合作完成。

  • 相关阅读:
    QuartusII13.0使用教程详解(一个完整的工程建立)
    基于Vivado调用ROM IP core设计DDS
    FPGA学习之路——一路走来
    基于basys2用verilog设计多功能数字钟(重写)
    基于basys2驱动LCDQC12864B的verilog设计图片显示
    PWM(脉宽调制)——LED特效呼吸灯设计
    Isim你不得不知道的技巧(整理)
    ISE、vivado、QuartusII调用notepad++、UE汇总(整理)
    java环境配置为1.7jdk为什么cmd java -version查看版本是1.8
    TCP/IP三次握手和HTTP过程
  • 原文地址:https://www.cnblogs.com/vigorous/p/13574075.html
Copyright © 2020-2023  润新知