1. 程式人生 > >session和cookie自動登入機制

session和cookie自動登入機制

cookie的儲存

cookie是瀏覽器支援的一種本地儲存方式。以dict,鍵值對方式儲存。

{"sessionkey": "123"}

瀏覽器會自動對於它進行解析。

http請求是一種無狀態的請求

使用者向伺服器發起的兩次請求之間是沒有狀態的。也就是伺服器並不知道這是同一個使用者發的。

有狀態請求(cookie)

伺服器a發回來的id會放到伺服器a的域之下。不能跨域訪問cookie。

使用瀏覽器隨便開啟一個網頁,然後f12開啟。

比如我使用的Chrome瀏覽器

會找到儲存在瀏覽器本地的cookie值

點選clear all清空所有的cookie f5

重新整理頁面,會發現又把這些cookie值進來。

如果將使用者名稱和密碼直接儲存在cookie,可以實現最垃圾最簡略版本的自動登入。

解決cookie放在本地不安全的問題(session)

使用者在第一次請求後,瀏覽器回覆的id既可以是使用者的user id。
也可以一段任意的字串,我們把它叫做session id

根據使用者名稱和密碼,伺服器會採用自己的規則生成session id。這個session id儲存在本地cookie。瀏覽器請求伺服器會攜帶。

輸入使用者名稱 & 密碼
呼叫 login(), 後端程式會根據使用者名稱密碼生成session id。儲存在資料庫中。
使用者登入之後,需要通過這個session id取出這些基本資訊。

Django的預設表中的session表就記錄了使用者登入時,後端我們Django為使用者生成的sessionid

可以看到session key value 和過期時間。

我們可以清空這張表的資料。執行專案進行登入。

此時通過f12檢視瀏覽器在本地儲存的session id。可以看到如下圖和我們資料庫中的一致。

session_key 發到瀏覽器叫做session id

通過session id 使用者訪問任何一個頁面都會攜帶,伺服器就會認識。

Setting.py中,

這個app會攔截我們每次的request請求,在request

中找到session id,然後去資料表中進行查詢。
然後通過session key 去找到session data。此時直接為我們取出了user。

在伺服器返回瀏覽器的response中也會直接加上session id

cookie是瀏覽器本地儲存機制,存在域名之下,儲存不安全。
伺服器在返回id時通過規則生成一串字元,並設定了過期時間。儲存在伺服器端(資料庫)