http是無狀態的協議,所以要維持應用的會話形式,就需要加入以下幾種機制,來進行會話跟蹤,識別用戶身份(當同一用戶進行多次操作,不用反復請求建立新的連接,從而節省服務器資源和處理速度)
生成位置 | 存儲方式 | 驗證原理 | 特點 | |
cookie (記錄用戶身份) |
服務器 | 在客戶端瀏覽器內以文件形式存儲(鍵值對name=value) 常見包括name(cookie名稱)、path(對於服務器其他頁面的可用性)、domain(顧名思義,同域內的其他服務器共享可用性)、secure(該屬性若未出現,這意味着cookie在網絡中未加密傳輸;secure屬性並不能對Cookie內容加密,因而不能保證絕對的安全性。如果需要高安全性,需要在程序中對Cookie內容加密、解密,以防泄密。) |
1.用戶通過用戶名和密碼 發送請求 2.服務器生成cookie(服務器針對客戶端狀態的一小段文本信息)並在響應頭中返回 3.在之后的請求中攜帶cookie,服務器進行檢查(如前所示,這些信息都可被篡改和截取) |
1.安全性較差,攻擊者可截取cookie進行目標權限的操作 2.需要瀏覽器支持 3.不可跨域 |
session (記錄用戶狀態) |
服務器 | 服務器 redis數據庫、file(php)、內存(tomcat)中。存儲形式為hash(key-field-value);包括sessionid(為隨機生成字符串)該id會寫入cookie中發至客戶端。 同時Session需要使用Cookie作為識別標志,因為Session不能依據HTTP連接來判斷是否為同一客戶 |
1.用戶通過用戶名和密碼 發送請求 2.服務器生成session(包括sessionid、sessionid對應的key值)存儲在服務器中,之后發送cookie(值為sessionid)在響應頭中返回 3.在之后的請求中攜帶cookie(sessionid),服務器進行檢查(根據sessionid來查找目標session,比對是否一致) |
拓展性較差(若服務器存在負載均衡,session只存在了其中某台) |
token | 服務器 | 客戶端、服務器(只保存未到期卻注銷的token,以便下次收到使用這個token時判其無效) 一般包括uid(用戶唯一的身份表示)、time(時間戳)、sign(簽名、密鑰等)、URL(請求的路徑) |
1.用戶通過用戶名和密碼 發送請求 2.服務器進行驗證(用戶合法性) 3.服務器簽發一個簽名的token(生成過程可參考對稱加密)給客戶端 4.客戶端存儲並在每次發送請求攜帶該token 5.服務器通過特定的加密算法對token進行過濾選擇(比如HMAC) 6.校驗通過返回增刪改查數據;校驗未通過返回錯誤碼 |
1.無狀態、可拓展(因為token並) 2.相對安全(可防止CSRF攻擊) 3.可拓展性強(可分享權限給第三方應用) 4.多平台跨域(完全由應用管理) 5.基於標准化 |
假設一個場景,有一棟大樓有門禁。
cookie機制:只要你帶通行證不管你是誰都可以進來,只認通信證,cookie在這里是通行證。
session機制:要報你的門牌號戶主姓名電話號碼,大樓門衛在信息表里找到對應的就會放行。session在這里是信息表里的門牌號戶主姓名電話號碼。
token機制:檢驗通行證,同時需要對暗號“天王蓋地虎”---“寶塔鎮河妖”,暗號錯一個字都不行。token在這里就是通行證和暗號。
如有紕漏望不吝賜教!