天天看點

cookie、session與token的差別

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

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

Cookie

Cookie:cookie是伺服器發送給用戶端的用于驗證某一會話資訊的資料,cookie中有很多字段。不同網站cookie中字段是不一樣的,是由伺服器端設定的。cookie中常放入session_id 或者 token 用來驗證會話的登入狀态。

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

cookie的分類:

Session Cookie:key, value形式,過期時間可設定,如不設,則浏覽器關掉就消失了,存儲在記憶體當中,否則就按設定的時間來存儲在硬碟上的,過期後自動清除

Permenent Cookie:Cookie的主要内容包括:名字,值,過期時間,路徑和域等等

Session Cookie: 我們打開一個浏覽器通路某個網站,該網站伺服器就會傳回一個Session Cookie,當我們通路該網站下其他頁面時,用該Cookie驗證我們的身份。是以,我們不需要每個頁面都登入。但是,當我們關閉浏覽器重新通路該網站時,需要重新登入擷取浏覽器傳回的Cookie。Session Cookie在通路一個網站的過程中,一般是不變化的,有時也會變化,比如,切換不同的權限時,Cookie值會變化。

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

cookie、session與token的差別

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

cookie、session與token的差別

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

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

cookie、session與token的差別

Session認證機制

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

浏覽器第一次發送請求時,伺服器自動生成了Session(使用者會話所需的屬性及配置資訊),并且生成了Session ID來唯一辨別這個Session,并将其通過響應發送到浏覽器。浏覽器第二次發送請求會将前一次伺服器響應中的Session ID放在請求的Cookie中一并發送到伺服器上,伺服器從請求中提取出Session ID,并和儲存的所有Session ID進行對比,找到這個使用者所對應的Session,進而知道了使用者的登入資訊。一般Session ID會有時間限制,逾時後毀掉這個值,預設30分鐘。

當使用者在應用程式的 Web頁間跳轉時,也就是一次會話期間,浏覽器不關閉時,Session ID是一直不變的。

cookie、session與token的差別

Token認證機制

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

cookie、session與token的差別
cookie、session與token的差別

Token預防CSRF

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

當我們通路的網頁中含有需要修改資料的地方,後端伺服器就會随機發送一個Token值給前端,然後我們修改完資料送出的請求包中,就會有該token字段,後端提取該token驗證登入狀态。當我們每次通路該網頁或者其他修改資料的網頁時,伺服器端傳回的Token值都是不同的,都是随機的。這樣,可以有效預防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 位元組翻轉攻擊)。

作者:謝公子

來源:CSDN

原文:https://blog.csdn.net/qq_36119192/article/details/84977902

版權聲明:本文為部落客原創文章,轉載請附上博文連結!