Django 用戶登入與 Cookie 機制詳解:新手指南

更新日期: 2024 年 12 月 13 日

在 Django 中,用戶登入是一個常見且重要的功能。

當用戶登入後,系統需要能夠辨認用戶身份,並在後續的請求中保持狀態。

Django 的身份驗證機制主要依賴 django.contrib.auth.login 方法、工作階段(Session)和 Cookie 的配合完成。

本文將幫助您理解 login() 方法的工作原理,並解析 Cookie 如何保存和傳遞用戶的身份信息。


django.contrib.auth.login(request, user) 如何運作?

login() 方法是 Django 提供的用戶登入方法,用於記錄用戶的登入狀態。

以下是其具體工作流程:

分配憑據

當執行 login(request, user) 時,Django 會:

  1. 在伺服器端的工作階段中,存儲用戶 ID
    • 工作階段數據會被記錄在 Django 的 django_session 資料表中。
    • 用戶的 ID 是用於標識當前登入用戶的核心信息。
  2. 生成一個唯一的工作階段 ID
    • 這個工作階段 ID 是唯一的標識,用來鏈接伺服器的工作階段數據。
    • 工作階段 ID 會以 Cookie 的形式存儲在用戶的瀏覽器中,名稱通常為 sessionid

驗證用戶身份

每次用戶發起請求時,Django 通過以下方式驗證身份:

  1. 瀏覽器自動攜帶 Cookie
    • 瀏覽器會將之前保存的 sessionid Cookie 附加到每個請求的標頭中。
  2. 伺服器端匹配工作階段數據
    • Django 從 Cookie 提取 sessionid,並在 django_session 表中查找相應的記錄。
    • 如果找到與該 sessionid 對應的用戶 ID,Django 就能確定當前請求的用戶身份。
  3. 設置 request.user
    • 將用戶對象從資料庫中讀取並賦值給 request.user
    • 如果沒有找到有效的工作階段數據,request.user 默認為 AnonymousUser,代表未登入的用戶。

如何判斷用戶是同一人?

Django 使用 工作階段機制Cookie 來判斷用戶是否為同一人,而不依賴於 IP 地址或其他設備信息。

Cookie:用戶身份的核心標識

  • Django 在用戶登入時會設置一個名為 sessionid 的 Cookie,其中保存的是用戶的工作階段 ID。
  • 每次請求時,瀏覽器會自動攜帶這個 Cookie,Django 通過它來匹配伺服器端的工作階段數據。

伺服器端工作階段表

  • Django 通過 sessioniddjango_session 表中查找對應的用戶 ID。
  • 找到匹配的數據後,Django 能夠確定該請求來自於哪個用戶,從而綁定用戶與請求。

IP 地址是否參與身份判斷?

不參與。 Django 完全依賴 Cookie 和工作階段來判斷用戶身份,不依賴 IP 地址。以下是原因:

  • IP 可能改變
    用戶切換 Wi-Fi 或移動網絡時,IP 地址會發生變化。
  • 多用戶共用 IP
    多台設備可能通過共享的 Wi-Fi 使用同一個 IP 地址。

同一設備如何保持登入狀態?

只要用戶瀏覽器中的 sessionid Cookie 仍然有效,Django 就能在後續請求中識別該用戶。

  • 如果用戶清除了瀏覽器的 Cookie 或工作階段過期,用戶身份信息將丟失,需要重新登入。

瀏覽器如何保存和傳遞 Cookie?

伺服器設置 Cookie

當用戶成功登入後,Django 會在 HTTP 響應中設置 sessionid Cookie,例如:

Set-Cookie: sessionid=abc123xyz; Path=/; HttpOnly
  • 瀏覽器會接收到這個指令,並保存 Cookie。

瀏覽器攜帶 Cookie

瀏覽器會在後續請求中自動附加相關的 Cookie,例如:

Cookie: sessionid=abc123xyz
  • Django 通過 Cookie 確定用戶身份。

Cookie 的特性與安全性

作用範圍

  • Cookie 僅在特定的域名和路徑下有效。
  • 例如,example.com 的 Cookie 不會被 another.com 訪問。

有效期

  • Cookie 可以設置有效期(例如 1 天、1 週)。
  • 默認情況下,Django 的 sessionid 是「工作階段級別」,瀏覽器關閉時即被刪除。

安全性

  • HttpOnly:防止 JavaScript 獲取 Cookie,降低 XSS 攻擊風險。
  • Secure:僅在 HTTPS 協議下傳輸 Cookie,確保數據安全。

與工作階段的關係

工作階段(Session)

  • 伺服器端存儲:用於記錄用戶的數據(如用戶 ID)。
  • Django 將工作階段數據存儲在 django_session 表中。

Cookie

  • 瀏覽器端存儲:用於保存工作階段 ID(例如 sessionid),讓伺服器能找到對應的工作階段。

總結

  1. Django 的用戶身份驗證
    使用 django.contrib.auth.login 設置工作階段,並通過 sessionid Cookie 與伺服器的工作階段數據建立關聯。
  2. Cookie 的作用
    瀏覽器自動保存並傳遞 Cookie,讓伺服器能夠識別用戶身份。
  3. 不依賴 IP 地址
    用戶身份判斷完全基於 Cookie 和工作階段,而非 IP。
  4. 安全性措施
    通過 HttpOnlySecure 等標誌,確保 Cookie 的安全。

透過這些機制,Django 能夠在多次請求中有效地維持用戶狀態,並提供安全的登入體驗。如果還有疑問,隨時向我提問!

Similar Posts