有條件的請支持慕課實戰(zhàn)正版課程,本blog僅僅是歸納總結(jié),自用。
An HTTP cookie (also called web cookie, Internet cookie, browser cookie, or simply cookie) is a small piece of data sent from a website and stored on the user's computer by the user's web browser while the user is browsing.
一、cookie請求
應(yīng)用層的http協(xié)議是無狀態(tài)請求,為了方便服務(wù)器識別用戶,使用cookie機制保存必要的用戶信息:

帶cookie的有狀態(tài)請求
-
我們打開chrome的開發(fā)者工具,查看百度網(wǎng)頁的cookies,注意這個cookies其實是存儲在本地的,可以刪除,數(shù)據(jù)結(jié)構(gòu)類似字典dict
百度首頁的cookie 利用cookie,我們可以把網(wǎng)站的用戶名和密碼存儲起來,然后服務(wù)器收到后,提取數(shù)據(jù),實現(xiàn)自動登錄。但是存在安全隱患,因為把用戶名和密碼存儲在本地,容易被竊取。于是有了session技術(shù)。
二、session
- session機制還是利用的是cookie,但是避免了用戶名和密碼的本地存儲與網(wǎng)絡(luò)傳輸。
-
這里下面的id就是指session_id,而每個web后臺生成session_id的方式不同。
帶cookie的有狀態(tài)請求
2.1 session的生成過程
- django下session_id的生成過程:
當(dāng)用戶第一次登錄之后,django根據(jù)用戶名和密碼,在數(shù)據(jù)庫表中加密生成對應(yīng)的session_key(就是session_id)和session_data,還有expired_date(過期時間)。 - 當(dāng)我們登錄網(wǎng)址一次后,查看下django后臺的表:

django_session數(shù)據(jù)庫表
- 回到瀏覽器,查看網(wǎng)頁的cookie,發(fā)現(xiàn)已經(jīng)拿到了服務(wù)器回傳來的session_id:

網(wǎng)頁cookie
- 至此,session生成結(jié)束。
2.2 利用session登陸流程
- 第二次請求時,帶著session_id的cookie一起請求。
- 服務(wù)器收到session_id,進入數(shù)據(jù)庫中查詢,取出對應(yīng)的session_data,若沒過期,則解密,獲得用戶名,密碼,其他信息后登陸。
2.3 django后臺解析session機制
- 利用sessions這個模塊,每次攔截request和response,做session生成與解密工作:

sessions模塊
- 若注釋掉它后,則無法自動登錄
三、總結(jié)
cookie是瀏覽器本地的一種存儲行為,存儲鍵值對。分域名存儲,不同域名的cookie不能互相訪問。
cookie存在安全隱患,我們使用session機制。session是服務(wù)器端生成,發(fā)給用戶,只有服務(wù)器端知道session對應(yīng)的用戶信息,存在過期時間。
