1. 程式人生 > >RESTful API是無狀態的,那麼身份認證是不是resetful

RESTful API是無狀態的,那麼身份認證是不是resetful

在REST應用程式中,每個請求必須包含伺服器需要理解的所有資訊,而不是依賴於伺服器記住先前的請求。

在伺服器上儲存會話狀態違反了REST體系結構的無狀態約束。因此,會話狀態必須完全由客戶端處理。

會話狀態

傳統web應用程式使用遠端會話。在這種方法中,應用狀態完全儲存在伺服器上。

遠端會話樣式是客戶機-伺服器的一個變體,它試圖最小化客戶端元件的複雜性,或者最大限度地重用客戶機元件,而不是伺服器元件。每個客戶端在伺服器上啟動一個會話,然後在伺服器上呼叫一系列服務,最後退出會話。應用程式狀態完全保留在伺服器上。...

雖然這種方法帶來了一些優點,但它降低了伺服器的可伸縮性:

遠端會話樣式的優點是更容易集中維護伺服器上的介面,在擴充套件功能時減少對已部署客戶端中的不一致性的關注,如果在伺服器上使用擴充套件的會話上下文,則提高效率。缺點是,由於儲存的應用程式狀態,它降低了伺服器的可伸縮性,降低了互動的可見性,因為監視器必須知道伺服器的完整狀態。

無狀態約束

REST體系結構樣式定義在一組約束的頂部,其中包括伺服器的無國籍狀態。根據菲爾丁的說法,其餘的無狀態約束定義如下:

客戶端到伺服器的每個請求都必須包含理解請求所需的所有資訊,並且不能利用伺服器上儲存的任何上下文。因此,會話狀態完全保留在客戶端上。

這個約束導致了能見度可靠性,和可伸縮性:

可見性得到了改善,因為監控系統不必只看單個請求資料,就可以確定請求的全部性質。可靠性的提高是因為它簡化了從部分故障中恢復的任務。可伸縮性得到了改善,因為不需要在請求之間儲存狀態,可以讓伺服器元件快速釋放資源,並進一步簡化實現,因為伺服器不必管理跨請求的資源使用情況。

認證和授權

如果客戶端請求需要身份驗證的受保護資源,則每個請求必須包含所有必要的資料必須經過適當的認證/授權

HTTP身份驗證被認為是無狀態的:驗證請求所需的所有資訊必須在請求中提供,而不是依賴於伺服器記住先前的請求。

基於狀態的Web服務
在基於狀態的Web服務中,Client與Server互動的資訊(如:使用者登入狀態)會儲存在Server的Session中。再這樣的前提下,Client中的使用者請求只能被儲存有此使用者相關狀態資訊的伺服器所接受和理解,這也就意味著在基於狀態的Web系統中的Server無法對使用者請求進行負載均衡等自由的排程(一個Client請求只能由一個指定的Server處理)。同時這也會導致另外一個容錯性的問題,如果指定的Server在Client的使用者發出請求的過程中宕機,那麼此使用者最近的所有互動操作將無法被轉移至別的Server上,即此請求將無效化。

基於無狀態的Web服務
在無狀態的Web服務中,每一個Web請求都必須是獨立的,請求之間是完全分離的。Server沒有儲存Client的狀態資訊,所以Client傳送的請求必須包含有能夠讓伺服器理解請求的全部資訊,包括自己的狀態資訊。使得一個Client的Web請求能夠被任何可用的Server應答,從而將Web系統擴充套件到大量的Client中。

總結兩者的區別
因為無狀態原則的特性,讓RESTful在分散式系統中得到了廣泛的應用,它改善了分散式系統的可見性、可靠性以及可伸縮性,同時有效的降低了Client與Server之間的互動延遲。無狀態的請求有利於實現負載均衡,在分散式web系統下,有多個可的Server,每個Server都可以處理Client傳送的請求。有狀態的請求的狀態資訊只儲存在第一次接收請求的Server上,所以後來同一個Client的請求都只能由這臺Server來處理,Server無法自由排程請求。無狀態請求則完全沒有這個限制。其次,無狀態請求有較強的容錯性和可伸縮性。如果一臺伺服器宕機,無狀態請求可以透明地交由另一臺可用Server來處理,而有狀態的請求則會因為儲存請求狀態資訊的Server宕機而承擔狀態丟失的風險。Restful風格的無狀態約束要求Server不儲存請求狀態,如果確實需要維持使用者狀態,也應由Client負責。

例如: 
使用Cookies通過客戶端保持登陸狀態: 
在REST中,每一個物件都是通過URL來表示,物件使用者負責將狀態資訊打包進每一條資訊內,保證物件的處理總是無狀態的。在HTTP伺服器中,伺服器沒有儲存客戶端的狀態資訊,客戶端必須每次都帶上自己的狀態去請求伺服器。客戶端以URL形式提交的請求包含了cookies等帶狀態的資料,這些資料完全指定了所需的登入資訊,而不需要其他請求的上下文或記憶體。 
傳遞User credentials是Restful,而傳遞SessionID是Un-Restful的,因為session資訊儲存在伺服器端。 
無狀態請求:Server不儲存任何請求狀態資訊,Client的每一個請求都具有User credentials等所需要的全部資訊,所以能被任意可用的Server應答。 
有狀態請求:Server儲存了Client的請求狀態,Server會通過Client傳遞的SessionID在Server中的Session作用域找到之前互動的資訊,並以此來實現應答。所以Client只能由某一