1、什么是 cookie
- cookie 是保存在本地終端的數據。cookie 由服務器生成,發送給瀏覽器,瀏覽器把 cookie 以 kv 形式保存到某個目錄下的文本文件內,下一次請求同一網站時會把該 cookie 發送給服務器。由於 cookie 是存在客戶端上的,所以瀏覽器加入了一些限制確保 cookie 不會被惡意使用,同時不會占據太多磁盤空間,所以每個域的 cookie 數量是有限的。
- cookie 的組成有:名稱( key )、值( value )、有效域( domain )、路徑(域的路徑,一般設置為全局:"\")、失效時間、安全標志(指定后,cookie 只有在使用 SSL 連接時才發送到服務器( https ))。下面是一個簡單的 js 使用 cookie 的例子:
用戶登錄時產生 cookie:
document.cookie = "id="+result.data['id']+"; path=/"; document.cookie = "name="+result.data['name']+"; path=/"; document.cookie = "avatar="+result.data['avatar']+"; path=/"; 使用到 cookie 時做如下解析: var cookie = document.cookie;var cookieArr = cookie.split(";");var user_info = {};for(var i = 0; i < cookieArr.length; i++) { user_info[cookieArr[i].split("=")[0]] = cookieArr[i].split("=")[1]; } $('#user_name').text(user_info[' name']); $('#user_avatar').attr("src", user_info[' avatar']); $('#user_id').val(user_info[' id']);
2、什么是 session
- session 的中文翻譯是"會話",當用戶打開某個 web 應用時,便與 web 服務器產生一次 session。服務器使用 session 把用戶的信息臨時保存在了服務器上,用戶離開網站后 session 會被銷毀。這種用戶信息存儲方式相對 cookie 來說更安全,可是 session 有一個缺陷:如果 web 服務器做了負載均衡,那么下一個操作請求到了另一台服務器的時候 session會丟失。
-
session 認證流程:
- 用戶第一次請求服務器的時候,服務器根據用戶提交的相關信息,創建對應的 Session
- 請求返回時將此 Session 的唯一標識信息 SessionID 返回給瀏覽器
- 瀏覽器接收到服務器返回的 SessionID 信息后,會將此信息存入到 Cookie 中,同時 Cookie 記錄此 SessionID 屬於哪個域名
- 當用戶第二次訪問服務器的時候,請求會自動判斷此域名下是否存在 Cookie 信息,如果存在自動將 Cookie 信息也發送給服務端,服務端會從 Cookie 中獲取 SessionID,再根據 SessionID 查找對應的 Session 信息,如果沒有找到說明用戶沒有登錄或者登錄失效,如果找到 Session 證明用戶已經登錄可執行后面操作。
- 根據以上流程可知,SessionID 是連接 Cookie 和 Session 的一道橋梁,大部分系統也是根據此原理來驗證用戶登錄狀態。
3、什么是token
- token 的意思是"令牌",是用戶身份的驗證方式,最簡單的 token 組成:uid(用戶唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,由 token 的前幾位+鹽以哈希算法壓縮成一定長的十六進制字符串,可以防止惡意第三方拼接token 請求服務器)。還可以把不變的參數也放進 token,避免多次查庫
- token 的身份驗證流程:
- 客戶端使用用戶名跟密碼請求登錄
- 服務端收到請求,去驗證用戶名與密碼
- 驗證成功后,服務端會簽發一個 token 並把這個 token 發送給客戶端
- 客戶端收到 token 以后,會把它存儲起來,比如放在 cookie 里或者 localStorage 里
- 客戶端每次向服務端請求資源的時候需要帶着服務端簽發的 token
- 服務端收到請求,然后去驗證客戶端請求里面帶着的 token ,如果驗證成功,就向客戶端返回請求的數據


4、cookie 和session的區別
- cookie 數據存放在客戶的瀏覽器上,session 數據放在服務器上
- cookie 不是很安全,別人可以分析存放在本地的 cookie 並進行 cookie 欺騙,考慮到安全應當使用 session
- session 會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能,考慮到減輕服務器性能方面,應當使用 cookie
- 單個 cookie 保存的數據不能超過 4K,很多瀏覽器都限制一個站點最多保存20個 cookie