HTTP有安全和幂等的HTTP-方法。
HTTP中的幂等函数与数学中的幂等函数不完全相同,定义声明:
方法还可以具有“幂等性”的属性,因为(除了错误或过期问题),N>0相同请求的副作用与单个请求相同。方法GET、HEAD、PUT和DELETE共享此属性。此外,方法选项和跟踪不应该有副作用,因此本质上是幂等的。
(请注意“幂等效应”在引号中。)
有一个很大的潜在混淆,安全和幂等。安全的意思是,一个请求不应该有采取除检索以外的其他行动的意义。
因此,换句话说,它不应该改变后端的任何东西。
但是如果这意味着它是安全的,那么对于幂等HTTP方法来说,“副作用”到底意味着什么?
所有安全的HTTP-方法也是幂等的。
我假设安全和幂等不是完全相同的,可以互换的。但是,与我交谈过的许多人告诉我,幂等效应意味着幂等HTTP请求不应该改变后端的任何内容。但这实际上意味着它是安全的。
发布于 2020-06-17 01:23:50
但是,与我交谈过的许多人告诉我,幂等效应意味着幂等HTTP请求不应该改变后端的任何内容。
那些人错了。
绝对允许使用PUT
或DELETE
方法来更改后端状态;幂等效应所需的是,如果我们从初始状态S开始,那么PUT
/DELETE
请求是1、2、10次还是任何其他次数(明显高于零),最终状态S‘都是相同的。
来源:你引用的RFC2616的一部分。
发布于 2020-06-17 05:24:58
安全意味着没有副作用。幂等的意思是任何副作用都必须是相同的,因此如果它们被重复并不重要。
比如说我让我女儿检查烤箱是否预热。这是一个安全的手术,因为它没有副作用。她只是在找。
如果我让她预热烤箱,那是个幂等的操作。如果已经预热了,她就会检查并把它留在相同的状态。我可以要求她10次预热烤箱,她会看着我可怕的记忆,但烤箱总是处于开着状态。
如果我让她打开烤箱的开关,那不是幂等的。烤箱是否预热取决于它是否已经预热。
发布于 2020-06-17 03:13:40
HTTP中的幂等函数与数学中的幂等函数不完全相同
不是的。意思完全一样。
在数学中,如果f( f(x) ) =f(X),则函数是幂等函数。
让我们将f(123)定义为"DELETE /user/123“。然后f(f(123))指随后的两个“删除/用户/123”调用。如果第一次调用删除了ID = 123的用户,那么第二次呼叫将找不到要删除的任何内容,系统状态将与第一次调用后相同。均值,f(123)= f(123),这意味着它是幂等的。
重要的假设是HTTP方法的实现遵循RFC。因为从技术上讲,您可以以这样的方式实现服务,即它通过GET更改重要数据。这将是糟糕的建筑风格。然而,我们不应忘记,这可能会发生,我们应该检查特定的应用程序是否真的遵循RFC的建议。
“副作用”到底是什么意思?
在某种程度上,它取决于上下文,取决于定义。
示例1.有一个数据库。方法"GET / user / 123“返回ID为123的用户的数据,并且不更改数据库中的任何内容。这通常被认为是“没有副作用”。这样的调用可能会在代理服务器上产生日志条目,比如在应用程序日志中,等等。但是这通常会被忽略。
示例2.方法"GET / user / 123“返回ID 123的用户数据。但是应用程序在数据库中有一个特定的日志表,每次GET调用都会在这个数据库中创建一个日志条目。许多开发人员会说,在这种情况下,重要的数据不会改变。但有些人可能认为这是一个重大的数据变化。
简单地说:首先与您的团队交谈并定义特定上下文(项目、应用程序)的术语是有意义的,这样团队中的每个人都能以相同的方式理解这些单词。将这些定义编入术语表,并提供给所有相关人员。
有一个很大的潜在混淆,安全和幂等。
这取决于人。有些人可能会感到困惑,而另一些人则不会。
如果一个方法不改变重要的数据,它是安全的。
但是幂等方法可能会改变重要的数据。重要的是后续调用后的系统状态:它们是否产生与第一次请求相同的结果?如果状态相同,则该方法是幂等的。例如,"DELETE /users/ 123“删除ID =123的用户,从而执行数据的重大更改。"DELETE /users/123“的第二次及以后的调用将不再改变任何事情。因此,第二呼叫后的状态与第一呼叫后的状态相同。这就是为什么这样的方法是幂等的。同样适用于PUT或修补程序。可以更改一次数据。但是随后的调用不再改变系统状态,因此是幂等的。
因此,删除、放置、修补程序是不安全的(从RFC的意义上说),因为这些方法可以改变重要的数据。但它们是幂等的。
结果:如果一个方法是安全的,它也是幂等的。如果方法是幂等的,它不一定意味着它是安全的。
https://softwareengineering.stackexchange.com/questions/411600
复制相似问题