1. 程式人生 > >【Http】HTTP方法的安全性和冪等性

【Http】HTTP方法的安全性和冪等性

Http協議規定了不同方法的安全特性和冪等特性,作為服務提供者的伺服器必需為客戶端提供這些特性。

安全性

僅指方法的多次呼叫不會產生副作用,不涉及傳統意義上的“安全”,這裡的副作用是指資源狀態。即,安全的方法不會修改資源狀態,儘管多次呼叫的返回值可能不一樣(被其他非安全方法修改過)。

冪等性

指該方法多次呼叫返回的效果(形式)一致,客戶端可以重複呼叫並且期望同樣的結果。冪等的含義類似於程式語言的setter,一次呼叫和多次呼叫產生的效果是一致的,都是對一個變數進行賦值。安全性和冪等性含義有些接近,容易搞混。

HTTP方法的安全性和冪等性見下表:

方法名 安全性 冪等性
GET
HEAD
OPTIONS
DELETE
PUT
POST

可以認為安全的方法都是隻讀的方法(GET、HEAD、OPTIONS),不會改變資源狀態,顯然,這三個方法也是冪等。 DELETE方法的語義表示刪除伺服器上一個資源,第一次刪除成功後該資源就不存在了,資源狀態改變了,所以DELETE方法不具備安全特性。然而HTTP協議規定DELETE方法是冪等,每次刪除該資源都要返回狀態碼200 OK,伺服器端要實現冪等的DELETE方法,必須記錄所有已刪除資源的元資料(Metadata),否則,第二次刪除後返回的響應碼就會類似404 Not Found了。

PUT 和POST方法語義中都有修改資源狀態的意思,因此都不是安全。但是PUT方法是冪等的,POST方法不是冪等的,這麼設計的理由是: HTTP協議規定,POST方法修改資源狀態時,URL指示的是該資源的父級資源,待修改資源的ID在請求中攜帶。而PUT方法修改資源狀態時,URL直接指示待修改資源。因此,同樣是建立資源,重複提交POST請求可能產生兩個不同的資源,而重複提交PUT請求只會對其URL中指定的資源起作用,也就是隻會建立一個資源。