这些天我试图理解token-based authentication
,声称是stateless authentication
方法。我遇到了stateless web application
的概念。
以下是我读过的一些主题:
起初,我对这个想法很激动。但我越来越认为stateless
是pseudo-proposition
。
例如,假设我们使用客户端存储的令牌进行身份验证,我们如何对在线用户进行统计(假设没有日志)?我们应该将令牌存储在DB中吗?这不是说我们在服务器上存储状态信息吗?更重要的是,DB中的名称,年龄等普通用户信息也是某种状态信息吗?
我认为这里的真正问题不是让网络应用无状态,而是使网络应用正确处理状态信息,以免损害可扩展性。
这取决于如何解释单词stateless
:
我更喜欢2,因为总有一些inevitable global state
(引自@ deceze评论他的回答)。无论我们将状态信息存储为HTML 5 Web存储,HTTP标头,隐藏表单字段还是Cookie,状态仍然存在。只是它存储在服务器以外的其他地方。
我错过了什么好事吗?任何人都可以对此有所了解,这样我可以从这种心理斗争中解脱出来吗?
添加1
只需通过Leonard Richardson
了解该书RESTful Web Services即可。在第4章的Statelessness
部分末尾,它将状态分为Application State
和Resource State
。因此,我之前提到的普通用户信息和数据,如图像等,可以归类为Resource State
。 stateless
所指的是Application State
。因此,它不会破坏无状态代码以将resource state
存储在服务器上。
但该书还提到了an application key is used to restrict how many times a user can invoke a web service.
它承认此类信息无法存储在客户端的情况。并且必须将其存储在服务器端会破坏无状态代码并引入会话亲和性问题。 它声称无国籍可以避免会话亲和力问题但不解释如何。 我真的不知道无国籍人如何处理这种情况。任何人都可以在这里说清楚吗?
答案 0 :(得分:11)
"州"只是真正指的是客户端和服务器之间的状态。当然,服务器将存储数据,从技术上讲,您可以看到服务器上任何数据的任何修改,以及#34;更改状态"。因此,一个无国籍的"在这个意义上的应用绝对没有实际意义。
什么"无国籍"是指服务器是否在任何特定时间处于允许特定客户端向其发送特定请求的状态。
考虑:使用传统的基于cookie的登录会话,服务器只有处于接受来自客户端的请求的状态,并且在有限的时间窗口内;只要当前会话有效。客户无法预测这是多久。任何时候,来自客户端的请求都可能失败,因为服务器上的某些状态超时。在这种情况下,客户端需要通过再次登录来重置服务器的状态。
将此与基于令牌的身份验证进行对比。令牌必须无限期有效。它本质上是用户名和密码的替代品。为了便于讨论,只需假设客户端在每次请求时都会发送用户名和密码。这意味着每个请求都可以根据自己的优点进行身份验证,而不需要服务器处于某种特定的时间状态"。
您使用令牌而不是用户名和密码的原因有两个:
当然,服务器需要跟踪创建的令牌,并针对每个请求对某些数据库进行身份验证。这是一个无关紧要的实施细节。这与使用会话cookie没有区别;但是,由于令牌无限期有效,因此可以更轻松地缓存请求,而不需要复制临时会话存储。
最后一个需要先发制人反击的潜在论点:无限期会话和无限期令牌之间的区别,以及会话结束时与令牌可能被撤销时的区别是什么?<登记/> 当会话结束时,可以使用其他一些&#34;主证书重新建立会话#34; (重新登录)。令牌可以/应该仅在主动撤销时结束,这类似于撤销完全为主证书访问服务的授权,而不是常规应用程序流的一部分。
更一般地说:将无状态HTTP协议与FTP等有状态协议进行对比。在FTP中,服务器和客户端需要保持共享状态同步。例如,FTP协议在许多其他方面具有更改当前工作目录的CWD
命令。也就是说,有一个概念,即客户端&#34;在哪个目录中。在任何给定的时间。后续命令的行为会有所不同,具体取决于所处的目录。这是有状态的。您无法在不知道该状态的情况下随意发送命令,否则您将无法预测结果将会是什么。
无状态客户端/服务器通信首先简化了客户端,因为客户端可以始终假设能够请求服务器的任何内容,而无需知道服务器的状态 (&#34;我的会话是否仍处于活动状态?&#34;,&#34; 目录此操作会影响什么?&#34;)。 它可以帮助扩展服务器实施,因为只需要在所有服务器之间复制静态信息,而不是不断变化的有效会话池及其相关数据。
在架构上,您的目标应该是拥有尽可能多的无状态组件。这将简化扩展。例如,如果您的Web服务器保留了本地会话存储,那么很难将Web服务器扩展到负载均衡器/ CDN后面的多个实例。一个改进是将会话存储集中到一个独立的数据库;现在,您可以拥有多个无状态 Web服务器,这些服务器知道如何从某个地方获取数据(包括会话数据)并可以呈现模板,但在其他方面完全可以互换。
但是,会话商店必须与试图访问它的所有人保持完美同步,这使得很难扩展 it 。 令牌通过减少数据更改次数(仅在添加或删除令牌时)来改善这一点,这意味着如果您希望在多个位置拥有多个令牌存储,则可以使用分布式数据库或其他更简单的复制机制,以及/或使数据可缓存。
答案 1 :(得分:4)
好的,我认为无状态Web应用程序这个词没有任何意义。有意义的是无状态协议。无状态协议是一个独立处理每个请求的协议。
因此,在您的情况下,如果您为每个请求发送一个身份验证令牌,那么它是无状态的。这就是HTTP身份验证的工作方式。
另一方面,如果您只发送一次auth令牌并且每个连续请求都不必(例如因为服务器知道此TCP连接已经过alredy身份验证),那么这意味着每个请求都取决于身份验证请求。这使得协议有状态。
无状态协议更易于扩展,更易于代理等。
现在,对于Web应用程序,根据定义,该术语可能有意义,也可能没有意义。我不知道有什么合理的。
旁注:有状态/无状态与客户端和服务器之间共享数据无关。
答案 2 :(得分:1)
我认为无状态身份验证和无状态应用程序与您的思维方式无关; “无国籍”这个词在这里被用于两种不同的语境中。
无状态身份验证是一种识别客户端无需携带先前客户端请求或交互的任何信息/状态的方法,例如与Cookie不同。
无状态网络应用程序?当然,它们是可能的,但这完全取决于用户数据是否必须保持不变,也就是说,它实际上取决于所讨论的应用程序。