1. 程式人生 > >Cookie、Session和Token的區別

Cookie、Session和Token的區別

目錄

Cookie

Session認證機制

Token認證機制

Token預防CSRF

Session認識和Token認證的區別


前言:HTTP是一種無狀態的協議,為了分辨連結是誰發起的,需要瀏覽器自己去解決這個問題。不然有些情況下即使是開啟同一個網站的不同頁面也都要重新登入。而Cookie、Session和Token就是為了解決這個問題而提出來的兩個機制

使用者通過瀏覽器登入一個網站,在該瀏覽器內開啟網站其他頁面時,不需要重新登入。而HTTP是無狀態的協議,那麼網站後端是如何判斷使用者已經登陸了呢?不同的網站,判斷使用者登入狀態的方法都不一樣。有的網站是通過session來驗證使用者的登入狀態,有的網站是通過token來驗證使用者的登入狀態,也有的網站是通過其他的方式來判斷。本文講了兩個比較常用的方法,利用session或token來驗證使用者登入狀態。

Cookie

Cookie:cookie是伺服器傳送給客戶端的用於驗證某一會話資訊的資料,cookie中有很多欄位。不同網站cookie中欄位是不一樣的,是由伺服器端設定的。cookie中常放入session或者token用來驗證會話的登入狀態。

Cookie為什麼能驗證登入狀態?那是因為cookie中放入了session值或者token值!

cookie的分類

  • Session Cookie:key, value形式,過期時間可設定,如不設,則瀏覽器關掉就消失了,儲存在記憶體當中,否則就按設定的時間來儲存在硬碟上的,過期後自動清除
  • Permenent Cookie
    :Cookie的主要內容包括:名字,值,過期時間,路徑和域等等

Session Cookie 我們開啟一個瀏覽器訪問某個網站,該網站伺服器就會返回一個Session Cookie,當我們訪問該網站下其他頁面時,用該Cookie驗證我們的身份。所以,我們不需要每個頁面都登入。但是,當我們關閉瀏覽器重新訪問該網站時,需要重新登入獲取瀏覽器返回的Cookie。Session Cookie在訪問一個網站的過程中,一般是不變化的,有時也會變化,比如,切換不同的許可權時,Cookie值會變化。

如下圖,是Session Cookie的生成和作用

在整個會話過程中,cookie主要的值是不變化的,某些值會變化。如圖,是DVWA不同等級之間使用者的Session cooke。

Permenent Cookie 是儲存在瀏覽器客戶端上儲存使用者登入資訊的資料,Permenent  Cookie是由伺服器端生成,然後傳送給User-Agent(一般是瀏覽器),瀏覽器會將Cookie儲存到某個目錄下的文字檔案內,下次請求同一網站時就傳送該Cookie給伺服器(前提是瀏覽器設定為啟用cookie,大部分瀏覽器預設都是開啟了cookie)。

例如,下面的截圖是儲存的baidu.com域名下的 Permenent Cookie。

Session認證機制

Session:session是儲存在伺服器端的經過加密的儲存特定使用者會話所需的屬性及配置資訊的資料。當我們開啟瀏覽器訪問某網站時,session建立,只要瀏覽器不關閉(也有時間限制,可以自己設定超時時間),這個網站就可以記錄使用者的狀態,當瀏覽器關閉時,session結束。

  • 瀏覽器第一次傳送請求時,伺服器自動生成了Session(使用者會話所需的屬性及配置資訊),並且生成了Session ID來唯一標識這個Session,並將其通過響應傳送到瀏覽器。瀏覽器第二次傳送請求會將前一次伺服器響應中的Session ID放在請求的Cookie中一併傳送到伺服器上,伺服器從請求中提取出Session ID,並和儲存的所有Session ID進行對比,找到這個使用者所對應的Session,從而知道了使用者的登入資訊。一般Session ID會有時間限制,超時後毀掉這個值,預設30分鐘。
  • 當用戶在應用程式的 Web頁間跳轉時,也就是一次會話期間,瀏覽器不關閉時,Session ID是一直不變的。

Token認證機制

Token:Token是伺服器端生成的用於驗證使用者登入狀態的加密資料,和用session驗證差不多。只不過Token驗證伺服器端不需要儲存使用者會話所需的配置等資料。只需要後端將Token進行驗證簽名,然後再發給瀏覽器。所以,使用Token進行驗證,在一次會話中,Token值是不變化的,這和session一樣。

Token預防CSRF

上面利用Token驗證是將Token值放在Cookie中用來驗證使用者登入狀態,而我們現在要利用Token來預防CSRF的話,就不能將Token值放在CSRF中了。我們可以如下做:

當我們訪問的網頁中含有需要修改資料的地方,後端伺服器就會隨機發送一個Token值給前端,然後我們修改完資料提交的請求包中,就會有該token欄位,後端提取該token驗證登入狀態。當我們每次訪問該網頁或者其他修改資料的網頁時,伺服器端返回的Token值都是不同的,都是隨機的。這樣,可以有效預防CSRF。

相關文章:DVWA之CSRF(High級別)

                  CSRF(跨站請求偽造)

Session認識和Token認證的區別

現在大多數網站使用者認證都是基於 session 的,即在服務端生成使用者相關的 session 資料,而發給客戶端 sesssion_id 存放到 cookie 中,這樣用客戶端請求時帶上 session_id 就可以驗證伺服器端是否存在 session 資料,以此完成使用者認證。這種認證方式,可以更好的在服務端對會話進行控制,安全性比較高(session_id 隨機),但是服務端需要儲存 session 資料(如記憶體或資料庫),這樣無疑增加維護成本和減弱可擴充套件性(多臺伺服器)。 CSRF 攻擊一般基於 cookie 。

基於 token 的使用者認證是一種服務端無狀態的認證方式,服務端不用存放 token 資料。使用者驗證後,服務端生成一個 token(hash 或 encrypt)發給客戶端,客戶端可以放到 cookie 或 localStorage 中,每次請求時在 Header 中帶上 token ,服務端收到 token 通過驗證後即可確認使用者身份。這種方式相對 cookie 的認證方式就簡單一些,服務端不用儲存認證資料,易維護擴充套件性強, token 存在 localStorage 可避免 CSRF 。不過這種方式在加密或解密的時候會有一些效能開銷(好像也不是很大),有些對稱加密存在安全隱患(aes cbc 位元組翻轉攻擊)。