Http无状态?Session Cookie Token

HTTP无状态?

HTTP无状态协议,是指协议对于交互性场景没有记忆能力。

在点击一个纯的html网页,请求获取服务器的html文件资源时,每次http请求都会返回同样的信息,因为这个是没有交互的每次请求都是相互独立的,第一个请求和第二个请求也没有先后顺序,返回处理哪个,结果都是同样的资源页面,因为这种场景是无交互的,无论是什么人请求那个资源,服务器都是一股脑的返回那个相同的文件。

但是对于涉及到动态交互的场景,就显得很尴尬了。何为交互?有来又有往,和上面的不一样,上面无论是谁请求同一个地址都是返回一模一样的响应。

现在我们来想一个复杂的场景,如在购物网站上买一个书包,流程如下:

  1. 输入账号密码登陆 /login 用户信息
  2. 选择一款你喜欢的书包加入到购物车中 /cart 用户信息,产品信息
  3. 购买支付 /pay 用户信息,商品信息,金额信息

所谓的登录只是验证你是否是一个合法用户,若是合法则跳转到信息的页面,不合法则告知用户名密码错误。
添加商品时/cart 你还是需要将你的账号密码和商品信息一起提交给 addCart接口,再让服务器做验证。
第三步同理。

涉及到交互时,情形就完全不一样了,因为这三步是有依赖关系的,第一步验证登录者是一个合法用户,验证通过给你返回200/OK,但是只要服务器给返回了响应,那么一个http的请求和响应就结束了。服务器怎么知道10秒钟之前你刚刚登录过呢?不好意思,服务器不知道你有没有登陆过,他只是对外提供一个登录接口,要想证明你是合法用户必须调/login接口。

第二步,将商品加入到购物车中时,你会调用/cart接口,但是注意,这个行为是和第一步是有关联关系的,是谁将什么物品加入到购物车中了?这个谁,有没有在网站上注册账号呢,是不是一个合法用户呢?所以说在添加购物车的时候,我们还需要将账号密码再次加入到请求参数中,每做一次操作购物车操作时,都需要再把之前已经传输过的账号密码,再反反复复的传输一遍又一遍,这是因为服务器不知道你是不是在20秒之前刚登陆过。

总结:缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另外人们常说的“会话”概念则是上面的交互行为的另一种表述方式。

上面的无状态是指的,无登录状态,即服务器不知道某个用户是否已登录过了。因为愚蠢的服务器不知道客户端是否已登录过了,所以每次都要在交互场景(会话)中请求中带上上一次的请求信息,如账号、密码。明明只需要在/login接口中,才需要对比数据库中的账号密码和客户端传的是否一致来确定合法性。这下在添加购物车中也需要再一次的进行同样的重复且没有必要的操作,即降低了响应速度,又对用户不友好(因为每次都需要填账号,密码)

通过上面我们知道了Http中无状态是一个什么概念,以及在无状态情况下,要进行添加购物车功能,所带来的困难。

客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。HTTP本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是Cookie和Session了。

Cookie

由于HTTP是一种无状态的协议,服务器单纯从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

Cookie的不可跨域名性

很多网站都会使用Cookie。例如,Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。那浏览器访问Google会不会也携带上Baidu颁发的Cookie呢?或者Google能不能修改Baidu颁发的Cookie呢?

答案是否定的。Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。

Cookie的一个实例
1.在登录网站的时候选择记住密码

2.点击之后观察服务器的相应内容

3.查看Chrome中的Cookie设置

4.观察服务器返回的Cookie内容

5.再次访问时,发现不需要输入密码即可直接登录,观察请求头信息

Cookie记录登录状态的三个方案

cookie并不是单纯为了实现 session机制而生的。而是1993 年,网景公司雇员 Lou Montulli 为了让用户在访问某网站时,进一步提高访问速度,同时也为了进一步实现个人化网络,发明了今天广泛使用的 Cookie。cookie还用一个很广泛的用途就是记住用户的登录账号和密码,这样当用户以后再次需要登录同一个网站或系统的时候就不需要再次填写这两个字段而是直接点击“登录”按钮就好。这就相当于给了一些“甜头”给用户,这就回应了“cookie”这个词语的字面意思了。

如果用户是在自己家的电脑上网,登录时就可以记住他的登录信息,下次访问时不需要再次登录,直接访问即可。

实现方法是把登录信息如账号、密码等保存在Cookie中,并控制Cookie的有效期,下次访问时再验证Cookie中的登录信息即可。

保存登录信息有多种方案

  • 方案一:最直接的是把用户名与密码都保持到Cookie中,下次访问时检查Cookie中的用户名与密码,与数据库比较。这是一种比较危险的选择,一般不把密码等重要信息保存到Cookie中。
  • 方案二:是把密码加密后保存到Cookie中,下次访问时解密并与数据库比较。这种方案略微安全一些。如果不希望保存密码,还可以把登录的时间戳保存到Cookie与数据库中,到时只验证用户名与登录时间戳就可以了。
  • 方案三:只在登录时查询一次数据库,以后访问验证登录信息时不再查询数据库。实现方式是把账号按照一定的规则加密后,连同账号一块保存到Cookie中。下次访问时只需要判断账号的加密规则是否正确即可。

一和二两种方案验证账号时都要查询数据库。

方案三把账号保存到名为account的Cookie中,把账号连同密钥用MD5算法加密后保存到名为ssid的Cookie中。验证时验证Cookie中的账号与密钥加密后是否与Cookie中的ssid相等。

提示:该加密机制中最重要的部分为算法与密钥。由于MD5算法的不可逆性,即使用户知道了账号与加密后的字符串,也不可能解密得到密钥。因此,只要保管好密钥与算法,该机制就是安全的。

Session

由于网页是一种无状态的连接程序,因此无法得知用户的浏览状态。在网上购物的时,把很多商品加入了购物车,而在结账时网站却不知道你购物车有哪些物品。为了解决这个问题,服务器端就为特定用户创建了特定的session,用于标示并跟踪这个用户,这样才知道购物车里有哪些商品。

  • Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。
  • 客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
  • 如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。
  • Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

Session和Cookie的关系

    • cookie 是一个实际存在的、具体的东西,http 协议中定义在 header 中的字段。
    • session 是一个抽象概念、开发者为了实现中断和继续等操作,将client和server之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。
    • 即session描述的是一种通讯会话机制,而cookie只是目前实现这种机制的主流方案里面的一个参与者,它一般是用于保存session ID。

Token的相关讲解见 http://weixin.niurenqushi.com/article/2017-03-20/4794863.html

HMac介绍:hmac

参考文章:

https://www.jianshu.com/p/bdc97c096fbc

https://www.cnblogs.com/bellkosmos/p/5237146.html

http://weixin.niurenqushi.com/article/2017-03-20/4794863.html

https://www.cnblogs.com/yupeng/archive/2012/05/24/2515228.html

原文地址:https://www.cnblogs.com/lingyejun/p/9282169.html

时间: 2024-10-12 18:27:45

Http无状态?Session Cookie Token的相关文章

session cookie token

参考链接 https://blog.csdn.net/qq_38560742/article/details/82717167 这篇较长 token_sessioncookie_1 https://cloud.tencent.com/developer/news/247610 比喻理解看token_sessioncookie_1 sessioncookie_1 https://www.cnblogs.com/shiyangxt/articles/1305506.html Http 协议是一个无状

【转】Session Cookie Token的区别

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

保存状态: Session && Cookie

1, Session: (服务器端)        1) 适合保存大量的数据        2) 安全        3) 效率高        4) Session 跟踪机制中需要cookie 来保存和传递sessionld    2, Coolie: (客户端)        1) 不适合保存大量的数据        2) 不安全        3) 效率低 3, HttpSession        1) 取得: HttpSession session = request.getSessi

session/cookie/token的区别

1.Cookie (1)特点 存储在浏览器上,一个浏览器可以存储的Cookie为200个,一个web的网站能设置的Cookie不能超过20个,Cookie的大小不能超过4K (2)执行的流程 1.客户端发送HTTP请求到客户端 2.服务端收到请求之后,会发送一个响应头到客户端,这个响应头就包含Set-Cookie的头部 3.客户端发送第三次的请求(如果说服务需要我们发送一个Cookie的话,那么在第二次的过程中时,就会将上一次拿到的Cookie发送个服务端),提供了服务端可以识别客户端的信息.

服务器认证、授权、鉴权、session、token

1.session(赛神)会话机制 session 会话机制会借助 cookie + session 一起来做认证 cookie 是放在浏览器中的,cookie 是存储在客服端,但是可以由服务端和客户端生成. sesion 是保存在服务端的数据库中的,session 是服务端一块存储空间,只能由服务端生成. session 是把 session id 也就是session 的 key 值,保存到 cookie 当中 这个 key 值 一般在访问其他页面的时候会放到 cookie 当中,向后端发起

NHibernate使用无状态Sessions

NHibernate 3.0 Cookbook第三章,Using stateless sessions的翻译. 当要处理大量的数据,你通常可能会使用更"底层"的API来改善性能,在这次处理中很多时候会关闭一些高级特性.在NHibernate中,无状态Session就是高性能,底层的API. 这个文章,我们会使用一个无状态的Session来更新我们的电影价格. 准备 像前面的一样,建立一个控制台应用程序,参考第二章使用app.config配置NHibernate,使用Eg.Core Mo

EJB开发第二期---开发具有本地接口的无状态Bean

一.EJB中的bean 1.1 EJB中bean分类 会话bean(session bean) 负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过jdbc直接操作数据库,但大多数情况下都是通过实体bean来完成对数据库的操作. 实体bean(entity bean) 它实际上属于java持久化规范(简称JPA)里的技术,JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate.TopLink等ORM框架各自为营的局面. 消息驱动bean(messa

tengine-1.5.2配置session_sticky后不返回session cookie问题解决

昨天给公司tengine(1.5.2版本)反向代理的后端集群新增了一个tomcat节点,并在负载均衡集群中加入session_sticky指令以实现客户端会话保持,这时坑爹的问题出现了,客户端访问反向代理时竟然不返回session cookie,导致每次请求连接时sessionid都被重新刷新而无法通过登录.对此问题进行多次谷百,review tengine官方的email列表,尝试各种各样的配置,折腾了一天均未找到解决方法,只在官方提供的1.5.0版本changelog中看到了已经对此问题进行

http无状态设计与Cookie和Session

无状态指的是任意一个Web请求必须完全与其他请求隔离,当请求端提出请求时,请求本身包含了相应端为相应这一请求所需的全部信息. 1. 被调用者不保存参数,因为无需考虑参数逻辑 由使用者来保存状态,进行状态逻辑设计 http是无状态设计的,一些SDK的设计也可以是无状态的. 2. 而一些需求是需要有交互的,需要状态的 如: a. 表单(Form): b. 客户端的脚本处理.DOM处理等功能: c. 服务器的CGI(Common Gateway Interface)以处理包含表单提交在内的动态请求.