Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

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 通過 sessionid 在 django_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. 安全性措施:
    通過 HttpOnly 和 Secure 等標誌,確保 Cookie 的安全。

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

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

基礎概念

目錄

  • django.contrib.auth.login(request, user) 如何運作?
  • 分配憑據
  • 驗證用戶身份
  • 如何判斷用戶是同一人?
  • Cookie:用戶身份的核心標識
  • 伺服器端工作階段表
  • IP 地址是否參與身份判斷?
  • 同一設備如何保持登入狀態?
  • 瀏覽器如何保存和傳遞 Cookie?
  • 伺服器設置 Cookie
  • 瀏覽器攜帶 Cookie
  • Cookie 的特性與安全性
  • 作用範圍
  • 有效期
  • 安全性
  • 與工作階段的關係
  • 工作階段(Session)
  • Cookie
  • 總結