session和cookie自動登入機制
cookie的儲存
cookie是瀏覽器支援的一種本地儲存方式。以dict,鍵值對方式儲存。
{"sessionkey": "123"}
瀏覽器會自動對於它進行解析。
http請求是一種無狀態的請求
使用者向伺服器發起的兩次請求之間是沒有狀態的。也就是伺服器並不知道這是同一個使用者發的。
有狀態請求(cookie)
伺服器a
發回來的id
會放到伺服器a
的域之下。不能跨域訪問cookie。
使用瀏覽器隨便開啟一個網頁,然後f12
開啟。
比如我使用的Chrome
瀏覽器
會找到儲存在瀏覽器本地的cookie值
點選clear all
清空所有的cookie
f5
如果將使用者名稱和密碼直接儲存在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 key
去找到session data
。此時直接為我們取出了user。
在伺服器返回瀏覽器的response
中也會直接加上session id
cookie是瀏覽器本地儲存機制,存在域名之下,儲存不安全。
伺服器在返回id時通過規則生成一串字元,並設定了過期時間。儲存在伺服器端(資料庫)