1.8 Maintain HTTP State

HTTP是屬於應用層的一種協定, 其具有五大特色:

  1. 支持Client/Server mode

  2. 簡單快速

  3. 靈活

  4. 無連接

  5. 無狀態

在網路協定中, 我們稱協定的狀態是指下一次傳輸可以"記住"這次傳輸訊息的能力. 而HTTP本身是一個無狀態(stateless)的協定, 同一個session的連續兩個request互相不了解, 即HTTP是不會為了下一次連接而維護這次連接所傳輸的訊息的.

關於無狀態這個概念的解釋, 可試想以下情境:

  1. Client透過瀏覽器發送request至server

  2. Server針對該request進行處理並且回復一個response

  3. Client再次發送request至server

  4. Server再次回覆response

以上, 在這段過程中, 雖然跟server互動的是同一個client, 但是server並不會知道這個request是從同一個client來的, 也就是說server不會去記得你, 這就是無狀態的意思. 講得白話一點, 就是指該協定對於transaction沒有記憶能力, 缺少狀態也意味著如果後續需要前面的訊息, 則它就必須重傳, 這樣可能導致每次連接傳送的資料量增大. 另一方面, 在server不需要先前的訊息時, 其response的時間就會比較快.

現在再回頭看一下HTTP, HTTP的全稱為Hyper Text Transfer Protocol, 故我們知道這個協定支援超文字的傳輸. 超文字講白了就是用HTML寫出來的頁面, 而通常我們使用client端的瀏覽器上網存取server的資源, 最常見的URL也是以html為後綴的文件. 所以我們也可以說超文字是網路上最主要的資源.

既然HTTP的目的是要支援超文字的傳輸, 更廣義一點就是資源的傳輸, 那麼我們從client端透過瀏覽器對HTTP server發出request, 而後server把相應的資源回傳給client這樣的一個過程中, 無論是對client還是對server, 都沒有必要記錄這個過程, 因為每一次的request/response都是相對獨立的, 這跟你今天站在自動販賣機前面投零錢買飲料一樣, 誰都不需要也沒有必要去記住這個交易過程. 一般來說, URL都只會對應一個唯一的超文字, 而HTTP server也是公正的, 不管是阿狗還是阿貓, 都可以根據同樣的請求URL得到相同的超文字. 正是因為這樣的唯一性, 所以紀錄用戶的行為狀態變得沒有意義了, 所以HTTP協定被設計成無狀態的連接協定符合其本身的需求.

但隨著時代跟技術的進步, HTML也不斷的在變複雜, 出現了form這種東西; client端也增加了諸如script handling、DOM handling這些功能; 而server這邊則是出現了CGI, Servlet這些技術, 以處理包含form之類的各種動態request. 這時候HTTP的stateless特性反而嚴重阻礙了這些應用程式的實作, 因為互動是要承先啟後的, 就像你不會希望你在電商網站塞的滿滿的購物車在跳到下個頁面後會變成一台空車.

於是, 兩種用於保持HTTP狀態的技術就出現了:

  1. Cookie

  2. Session

Last updated