天天看點

cookie和session

  衆所周知,HTTP 是一個無狀态協定,是以用戶端每次送出請求時,下一次請求無法得知上一次請求所包含的狀态資料,如何能把一個使用者的狀态資料關聯起來呢?

比如在淘寶的某個頁面中,你進行了登陸操作。當你跳轉到商品頁時,服務端如何知道你是已經登陸的狀态?

Cookie

  首先産生了 cookie 這門技術來解決這個問題,cookie 是 http 協定的一部分.Cookie 會幫你在網站上所打的文字或是一些選擇,都記錄下來。當下次你再光臨同一個網站,WEB 伺服器會先看看有沒有它上次留下的 Cookie 資料,有的話,就會依據 Cookie裡的内容來判斷使用者,送出特定的網頁内容給你。 Cookie 的使用很普遍,許多有提供個人化服務的網站,都是利用 Cookie來辨認使用者,以友善送出使用者量身定做的内容,像是 Web 接口的免費 email 網站,都要用到 Cookie。

它的處理分為如下幾步:

  • 伺服器向用戶端發送 cookie。
    • 通常使用 HTTP 協定規定的 set-cookie 頭操作。
    • 規範規定 cookie 的格式為 name = value 格式,且必須包含這部分。
  • 浏覽器将 cookie 儲存。
  • 每次請求浏覽器都會将 cookie 發向伺服器。

  其他可選的 cookie 參數會影響将 cookie 發送給伺服器端的過程,主要有以下幾種:

  • path:表示 cookie 影響到的路徑,比對該路徑才發送這個 cookie。
  • expires 和 maxAge:告訴浏覽器這個 cookie 什麼時候過期,expires 是 UTC 格式時間,maxAge 是 cookie 多久後過期的相對時間。當不設定這兩個選項時,會産生 session cookie,session cookie 是 transient 的,當使用者關閉浏覽器時,就被清除。一般用來儲存 session 的 session_id。
  • secure:當 secure 值為 true 時,cookie 在 HTTP 中是無效,在 HTTPS 中才有效。
  • httpOnly:浏覽器不允許腳本操作 document.cookie 去更改 cookie。一般情況下都應該設定這個為 true,這樣可以避免被 xss 攻擊拿到 cookie。

Session

  cookie 雖然很友善,但是使用 cookie 有一個很大的弊端,cookie 中的所有資料在用戶端就可以被修改,資料非常容易被僞造,那麼一些重要的資料就不能存放在 cookie 中了,而且如果 cookie 中資料字段太多會影響傳輸效率。為了解決這些問題,就産生了 session,session 中的資料是保留在伺服器端的。

  session 的運作通過一個 

session_id

 來進行。

session_id

 通常是存放在用戶端的 cookie 中,比如在 express 中,預設是

connect.sid

 這個字段,當請求到來時,服務端檢查 cookie 中儲存的 session_id 并通過這個 session_id 與伺服器端的 session data 關聯起來,進行資料的儲存和修改。

  這意思就是說,當你浏覽一個網頁時,服務端随機産生一個 1024 比特長的字元串,然後存在你 cookie 中的 

connect.sid

字段中。當你下次通路時,cookie 會帶有這個字元串,然後浏覽器就知道你是上次通路過的某某某,然後從伺服器的存儲中取出上次記錄在你身上的資料。由于字元串是随機産生的,而且位數足夠多,是以也不擔心有人能夠僞造。僞造成功的機率比坐在家裡程式設計時被鄰居家的狗突然闖入并咬死的幾率還低。

  session 可以存放在 1)記憶體、2)cookie本身、3)redis 或 memcached 等緩存中,或者4)資料庫中。線上來說,緩存的方案比較常見,存資料庫的話,查詢效率相比前三者都太低,不推薦;cookie session 有安全性問題,

cookie 和session 的差別:

1、cookie資料存放在客戶的浏覽器上,session資料放在伺服器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并進行COOKIE欺騙

   考慮到安全應當使用session。

3、session會在一定時間内儲存在伺服器上。當通路增多,會比較占用你伺服器的性能

   考慮到減輕伺服器性能方面,應當使用COOKIE。

4、單個cookie儲存的資料不能超過4K,很多浏覽器都限制一個站點最多儲存20個cookie。

參考資料:

  1. https://github.com/alsotang/node-lessons/tree/master/lesson16

  2. http://www.cnblogs.com/shiyangxt/articles/1305506.html

  3. https://www.zhihu.com/question/19786827