HTTP POST GET 本質區別詳解

0.參考文獻

HTTP POST GET 本質區別詳解

從HTTP GET和POST的區別說起

1.分析

一般在瀏覽器中輸入網址訪問資源都是通過GET方式;在FORM提交中,可以通過Method指定提交方式為GET或者POST,默認為GET提交。Http定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。

URL全稱是資源描述符,我們可以這樣認 為:一個URL地址,它用于描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查 、改 、增 、刪 4個操作。

根據HTTP規范,GET用于信息獲取,而且應該是安全的和冪等的,可以參見安全的(Safe)和冪等的(Idempotent)。

安全的是指沒有明顯的對用戶有影響的副作用(包括修改該資源的狀態)。HTTP方法里的GET和HEAD都是安全的。
冪等的是指一個方法不論多少次操作,結果都是一樣。PUT(把內容放到指定URL),DELETE(刪除某個URL代表的資源),雖然都修改了資源內容,但多次操作,結果是相同的,因此和HEAD,GET一樣都是冪等的。
  所以根據HTTP協議,GET是安全的,也是冪等的,而POST既不是安全的,也不是冪等的。但在實際應用中,以上2條規定并沒有這么嚴格。比如,新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操作仍然被認為是安全的和冪等的。因為它總是返回當前的新聞。從根本上說,如果目標是當用戶打開一個鏈接時,他可以確信從自身的角度來看沒有改變資源即可。

通常情況下我們都說POST的安全性要比GET的安全性高(注意:這里所說的安全性和上面GET提到的“安全”不是同個概念。上面“安全”的含義僅僅是不作數據修改,而這里安全的含義是真正的Security的含義),比如:通過GET提交數據,用戶名和密碼將明文出現在URL上,比如有一個常見的url:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD,通過這個url我們就知道該用戶的用戶名是:hyddd,密碼是idontknow。但是就因為這個原因說 POST 比 GET 安全是錯的,因為POST和GET都是明文傳輸,用httpfox等插件,或者像WireShark 等類似工具就能觀察到。

POST和GET的差別其實是很大的。語義上,GET是獲取指定URL上的資源,是讀操作,重要的一點是不論對某個資源GET多少次,它的狀態是不會改變的,在這個意義上,我們說GET是安全的(不是被密碼學或者數據保護意義上的安全)。因為GET是安全的,所以GET返回的內容可以被瀏覽器,Cache服務器緩存起來(其中還有很多細節,但不影響這里的討論)。

而POST的語意是對指定資源“追加/添加”數據,所以是不安全的,每次提交的POST,參與的代碼都會認為這個操作會修改操作對象資源的狀態,于是,瀏覽器在你按下F5的時候會跳出確認框,緩存服務器不會緩存POST請求返回內容。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容