Cookie,Session,Token的區別和聯繫

Cookie,Session,Token的區別和聯繫

Cookie

Cookie指某些網站爲了辨別用戶身份而儲存在用戶本地終端(Client Side)上的數據(通常經過加密)。Cookie總是保存在客戶端中,按在客戶端中的存儲位置,可分爲內存Cookie和硬盤Cookie。內存Cookie由瀏覽器維護,保存在內存中,瀏覽器關閉後就消失了,其存在時間是短暫的。硬盤Cookie保存在硬盤裏,有一個過期時間,除非用戶手工清理或到了過期時間,硬盤Cookie不會被刪除,其存在時間是長期的。所以,按存在時間,可分爲非持久Cookie和持久Cookie。

Cookie的用途

1) Session管理

一般來說Cookie配合session使用。服務器對於客戶端的訪問,爲了保存狀態,會生成一個JessionId。一般這個jessionid是會被保存到瀏覽器的,之後每次訪問服務器,都會帶上這個jessionid標識。
cookie是不能夠跨域使用的。

2) 個性化

Cookie可以被用於記錄一些信息,以便於在後續用戶瀏覽頁面時展示相關內容。典型的例子是購物站點的購物車功能。

另一個個性化應用是廣告定製。你訪問過的網站會寫入一些Cookies在你的瀏覽器裏,這些Cookies會被一些廣告公司用來售賣更精準的廣告。

3) User Tracking

Cookie也可以用於追蹤用戶行爲,例如是否訪問過本站點,有過哪些操作等。

XSS攻擊

一般來說,如果用戶B能夠獲得用戶A在xxx網站上的cookie,那麼就能夠冒充A用戶進行操作。XSS(跨網站腳本)就可以做到這一點。

比如說一個網站沒有任何的防範的措施,我們可以在他的留言板(用戶都可以訪問到的地方)上插入一段js代碼用於獲得他的cookie信息,並且發送到一個我們的服務器上

這樣子,每一個點擊對應鏈接的人,他的cookie信息都會被我們劫持,之後我們可以通過cookie進行操控。

當然,對於這個方法,也有簡單的應對方法

  1. 給Cookie添加HttpOnly屬性, 這種屬性設置後, 只能在http請求中傳遞, 在腳本中,document.cookie無法獲取到該Cookie值. 對XSS的攻擊, 有一定的防禦值. 但是對網絡攔截, 還是泄露了.

  2. **在cookie中添加校驗信息, 這個校驗信息和當前用戶外置環境有些關係,比如ip,user agent等有關.**這樣當cookie被人劫持了, 並冒用, 但是在服務器端校驗的時候, 發現校驗值發生了變化, 因此要求重新登錄, 這樣也是種很好的思路, 去規避cookie劫持.

  3. cookie中session id的定時更換, 讓session id按一定頻率變換, 同時對用戶而言, 該操作是透明的, 這樣保證了服務體驗的一致性.

Session

session記錄服務器和客戶端會話狀態的機制。session在服務端生成和保存,並轉化爲一個臨時的Cookie(sessionId)發送給客戶端,當客戶端第一次請求服務器時,會檢查是否攜帶了這個Session,如果沒有則會添加Session。

session和cookie的區別

  • 安全性: Session 比 Cookie 安全,Session 是存儲在服務器端的,Cookie 是存儲在客戶端的。
  • 存取值的類型不同:Cookie 只支持存字符串數據,想要設置其他類型的數據,需要將其轉換成字符串,Session 可以存任意數據類型。
  • 有效期不同: Cookie 可設置爲長時間保持,比如我們經常使用的默認登錄功能,Session 一般失效時間較短,客戶端關閉(默認情況下)或者 Session 超時都會失效。
  • 存儲大小不同: 單個 Cookie 保存的數據不能超過 4K,Session 可存儲數據遠高於 Cookie,但是當訪問量過多,會佔用過多的服務器資源。

分佈式session

當我們的項目越來越大,用戶也越來越多的時候,當一臺服務器已經不能夠滿足現有用戶規模的時候,session也就暴露出了他的問題所在。

假設第一次訪問服務A生成一個sessionid並且存入cookie中,第二次卻訪問服務B客戶端會在cookie中讀取sessionid加入到請求頭中,如果在服務B通過sessionid沒有找到對應的數據那麼它創建一個新的並且將sessionid返回給客戶端,這樣並不能共享我們的Session無法達到我們想要的目的。

解決方案

1)Session複製

在支持Session複製的Web服務器上,通過修改Web服務器的配置,可以實現將Session同步到其它Web服務器上,達到每個Web服務器上都保存一致的Session。

2)Session粘滯

將用戶的每次請求都通過某種方法強制分發到某一個Web服務器上,只要這個Web服務器上存儲了對應Session數據,就可以實現會話跟蹤。

3)Session集中管理(推薦)

在單獨的服務器或服務器集羣上使用緩存技術,如Redis存儲Session數據,集中管理所有的Session,所有的Web服務器都從這個存儲介質中存取對應的Session,實現Session共享。

4)基於Cookie管理

這種方式每次發起請求的時候都需要將Session數據放到Cookie中傳遞給服務端。

Token

token指訪問資源的憑據,用於檢驗請求的合法性。

  • 安全,token 可以避免 CSRF 攻擊(因爲不需要 cookie 了)。

  • 服務端無狀態化、可擴展性好

  • 支持移動端設備

  • 支持跨程序調用

Token與Session的區別

  • token和session最大的區別在於token不再在服務端保存過多的數據,只做數據的檢驗,用校驗token的時間去換取存取session的空間。

  • Session 是一種記錄服務器和客戶端會話狀態的機制,使服務端有狀態化,可以記錄會話信息。而 Token 是令牌,訪問資源接口(API)時所需要的資源憑證。Token 使服務端無狀態化,不會存儲會話信息。

  • Session 和 Token 並不矛盾,作爲身份認證 Token 安全性比 Session 好,因爲每一個請求都有簽名還能防止監聽以及重放攻擊,而 Session 就必須依賴鏈路層來保障通訊安全了。如果你需要實現有狀態的會話,仍然可以增加 Session 來在服務器端保存一些狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章