前端掃雷之cookie和session

NO IMAGE

不廢話了,直接來吧。

無狀態的協議

在學習cookie和session時總會碰到這麼一句話:“http協議是一種無狀態協議…”,然後再扯到cookie,那究竟無狀態協議是什麼呢?
無狀態協議是指協議對於事務處理沒有記憶能力。比如說你這次成功登入了某個網站,過一會再登入這個網站,伺服器並不知道你之前登入過,會當做一個全新的請求來響應,讓你輸入使用者名稱和密碼。即每一次請求都是獨立的。

如何進行狀態保持

看一個經典的現實生活例子

讓我們用幾個例子來描述一下cookie和session機制之間的區別與聯絡。筆者曾經常去的一家咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就需要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下面的幾種方案:

1、該店的店員很厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎麼對待了。這種做法就是協議本身支援狀態。 
2、發給顧客一張卡片,上面記錄著消費的數量,一般還有個有效期限。每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以後的消費相聯絡起來。這種做法就是在客戶端保持狀態。 
3、發給顧客一張會員卡,除了卡號之外什麼資訊也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店裡的紀錄本上找到這個卡號對應的紀錄新增一些消費資訊。這種做法就是在伺服器端保持狀態。 
由於HTTP協議是無狀態的,而出於種種考慮也不希望使之成為有狀態的,因此,後面兩種方案就成為現實的選擇。具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要儲存一個標識,所以session機制可能需要藉助於cookie機制來達到儲存標識的目的,但實際上它還有其他選擇。 

簡單的說,只要讓伺服器知道這次請求是由誰發起的就行了。可以通過客戶端攜帶的cookie來判斷也可以通過sessionIdD查詢session來判斷。

cookie

cookie是客戶端本地保持狀態的方案。在第一訪問伺服器時,伺服器的http響應頭中會包含一個Set-Cookie 欄位,客戶端根據Set-Cookie在本地生成一個cookie,下次向伺服器發起請求時就會攜帶上這個cookie。伺服器在收到請求後根據cookie來進行相應操作。比如說如果cookie裡面存的是使用者名稱和密碼(一般不會這樣),伺服器直接和資料庫比照是否正確就行了,免去了使用者每次登陸輸入名字和密碼的麻煩。

總之cookie就是客戶端存於本地的一撮資料(4K),每次請求都會攜帶上並且伺服器和客戶端都可以對其進行修改。具體的你是要用來儲存使用者資訊還是傳遞相關訊息就看個人的使用了。

session

session是伺服器端的狀態保持方案。在第一訪問伺服器時,伺服器端會生成一個session,並返回給客戶端一個sessionID,下次向伺服器發起請求時只需要攜帶上這個sessionID,伺服器根據sessionID去查詢相應的session,根據結果進行相應操作。

sessionID一般使用cookie來傳遞,伺服器將sessionID寫入cookie返回給客戶端,以後每次客戶端訪問時都會攜帶上cookie,伺服器通過cookie中sessionID的值來判別會話。

當cookie被禁用時,可以通過url重寫的方式來傳遞sessionID,即在每次請求伺服器時都在url後加上sessionID。

幾個其他的問題

跨域:cookie不可跨域名,隱私安全機制能夠禁止網站非法獲取其他網站的Cookie。
訪問和修改:伺服器和客戶端都可以修改cookie,只有服務能修改訪問session,客戶端拿到的只是sessionID。