---
# System prepended metadata

title: Cookies 與 Session 在網頁應用中的角色和應用
tags: [網路概念, 後端面試]

---

# Cookies vs Session

Cookies 和 Session 是網頁應用中用於維持用戶狀態和跟蹤用戶行為的重要機制

## Cookies

### 1. **定義與用途**：
- Cookies 是由網站伺服器傳送到用戶瀏覽器並存儲在用戶端的小型數據片段。它們用於記錄用戶的瀏覽活動、偏好設置或身份驗證信息。

### 2. **運作方式**：
- 當用戶訪問一個網站時，網站伺服器可能會發送一個或多個 Cookies 到用戶的瀏覽器。
- 瀏覽器儲存這些 Cookies，並在之後的每次請求中將它們發送回該網站，這樣網站就能夠識別用戶並根據用戶的行為或偏好提供個性化的服務。
- Cookies 可以是會話級（Session Cookies，當瀏覽器關閉時消失）或持久性的（Persistent Cookies，在設定的有效期內一直存在）。

### 3. **安全性考量**：
   - 雖然 Cookies 對於維持網站狀態非常有用，但它們也可能受到安全威脅，如跨站點腳本攻擊（XSS）和跨站點請求偽造（CSRF）。
- 為提高安全性，網站可能使用安全標誌（僅在 HTTPS 連接中傳送）和 HttpOnly 標誌（使 JavaScript 無法訪問 Cookie）。

### 4. **優點**：
- 簡化了用戶的網頁瀏覽體驗，如自動登錄和記住用戶偏好。
- 對於網站來說，有助於提供個性化內容和分析用戶行為。

### 5. **缺點**：
- 可能引發隱私問題，因為存儲了用戶行為信息。
- - 如不妥當管理，可能成為安全漏洞。
### 6. **實際應用範例**：
- 網上購物網站使用 Cookie 來記錄用戶的購物車內容。
- 新聞網站使用 Cookie 來記住用戶的閱讀偏好。


## Session

### 1. **定義與用途**：
- Session 是在伺服器端儲存的用於跟蹤用戶狀態的機制。每個用戶都有一個獨特的 Session，可以用來儲存用戶特定的信息，如身份驗證狀態、購物車內容等。

### 2. **運作方式**：
- 當用戶首次訪問網站時，伺服器創建一個 Session 對象，並分配一個唯一的 Session ID。
- 這個 Session ID 通常通過 Cookie 傳送給用戶的瀏覽器，並在之後的每次請求中被瀏覽器傳回伺服器。
- 伺服器使用這個 Session ID 來檢索對應的 Session 數據，從而保持用戶的狀態和信息。

### 3. **安全性**：
- Session 數據存儲在伺服器端，因此較不易受到客戶端的攻擊。然而，需要正確管理 Session ID，以防止會話劫持和固定攻擊。

### 4. **優點**：
- 提供了一種在伺服器端安全儲存用戶特定信息的方式。
- 減少了需要在客戶端存儲的數據量，提高了效率。

### 5. **缺點**：
- 如果用戶的會話信息過多，會增加伺服器的存儲壓力。
- 會話管理不當可能導致安全漏洞。
### 6. **實際應用範例**：
- 在網路銀行應用中，Session 用於跟蹤用戶的登錄狀態和交易活動。
- 在論壇或社交媒體網站上，Session 用於保持用戶的登錄狀態和用戶設置。


總結來說，Cookies 和 Session 都是維持網路應用中使用者狀態的關鍵機制。 Cookies 主要儲存於客戶端，用於保存使用者偏好和追蹤訊息，而 Session 則儲存於服務器端，用於保存敏感的用戶特定資訊。 透過這兩種機制，網站能夠提供連貫且個人化的使用者體驗。


## cookies 與 Session的關聯

- Cookies 和 Session 通常一起使用來管理網頁應用中的用戶狀態。
- Session ID 通常通過 Cookie 存儲在用戶端，這樣每次用戶與伺服器交互時，伺服器就可以通過這個 ID 來識別並檢索相應的 Session 數據。

### cookies 與 Session 的比較表

| 特性         | Cookies                    | Session                  |
|------------|----------------------------|-------------------------|
| 存儲位置     | 客戶端（瀏覽器）               | 伺服器端                    |
| 安全性       | 相對較低，特別是在未使用 HttpOnly 和 Secure 屬性時 | 較高，因為數據存儲在伺服器上     |
| 數據存儲壽命 | 可以設定存儲期限，從會話期到固定時間      | 通常在會話結束時銷毀         |
| 適用情境     | 跟蹤用戶偏好、狀態和行為分析     | 存儲用戶特定的敏感數據如登錄狀態 |

## 爬蟲運用 cookies 與 session
- 在爬蟲開發中，合法且適當地使用 Cookies 和 Session 可以幫助你模擬真實用戶的瀏覽行為，從而訪問需要用戶登錄或特定狀態才能獲取的資料。

### 基本步驟
以下是如何在爬蟲中使用 Cookies 和 Session 來查找資料的基本步驟：

#### 1. **初始請求和捕獲 Cookies：**
   - 當你的爬蟲首次向目標網站發出請求時，網站可能會返回一些 Cookies。這些 Cookies 可能包含用於追蹤會話的重要信息。
   - 你需要確保你的爬蟲能夠接收並儲存這些 Cookies，以便在後續請求中使用。

#### 2. **模擬登錄（如有必要）：**
   - 如果目標網站需要用戶登錄才能訪問某些資料，你的爬蟲需要模擬登錄過程。
   - 這通常涉及向登錄表單的提交 URL 發送帶有用戶名和密碼的 POST 請求。
   - 登錄成功後，爬蟲會接收到與用戶登錄狀態相關的 Cookies。

#### 3. **帶著 Cookies 發送請求：**
   - 在後續的請求中，爬蟲需要攜帶這些 Cookies，以確保能夠訪問需要驗證的頁面。
   - 爬蟲應該模擬一個正常用戶的行為，這意味著它需要保持會話狀態。

#### 4. **處理 Session 超時和變化：**
   - 需要注意的是，一些網站可能會定期更換 Session，或在一段時間後使 Session 過期。
   - 爬蟲應該能夠處理這些情況，比如通過重新登錄來獲取新的 Cookies。

### 程式範例
以下是一個使用 Python 和 Requests 庫的簡單爬蟲示例，這個爬蟲模擬登錄一個需要身份驗證的網站，並使用獲得的 Cookie 進行後續請求。

這個示例中，我們假設網站有一個登錄接口，它接受 POST 請求並返回包含 Session 信息的 Cookie。
```python=
import requests

# 1. 初始化Session並發出初始請求以捕獲Cookies
session = requests.Session()
initial_url = 'https://example.com'  # 將此替換為目標網站的URL
response = session.get(initial_url)

# 檢查是否成功獲取Cookies
if 'Set-Cookie' in response.headers:
    cookies = response.cookies
else:
    print("未成功獲取Cookies")

# 2. 模擬登錄（如果需要）
login_url = 'https://example.com/login'  # 將此替換為登錄頁面的URL
payload = {
    'username': 'your_username',
    'password': 'your_password'
}

login_response = session.post(login_url, data=payload)

# 檢查是否成功登錄
if 'Welcome' in login_response.text:
    print("成功登錄")
else:
    print("登錄失敗")

# 3. 帶著Cookies發送請求以訪問需要驗證的頁面
target_url = 'https://example.com/protected_page'  # 將此替換為需要驗證的頁面的URL

protected_page_response = session.get(target_url)

# 4. 處理Session超時和變化（根據需要）

# 現在你可以處理protected_page_response，解析其中的資料或進行其他操作
```

## 面試常見問題
以下是常見的 Cookies 和 Session 面試問題：

1. Cookies 和 Session 的定義和用途是什麼？
   回答：Cookies 是用於在客戶端（瀏覽器）存儲小段資料，用於跟蹤用戶、記住偏好設定等。Session 是在伺服器端保存用戶數據的機制，通常用於保持登錄狀態。

2. Cookies 和 Session 之間有什麼區別？
   回答：主要區別在於存儲位置和生命週期。Cookies 存儲在客戶端，可以設置不同的過期時間。Session 存儲在伺服器端，通常在用戶退出或超時時被清除。

3. Cookies 的工作原理是什麼？
   回答：Cookies 是由伺服器在HTTP響應中發送給瀏覽器的小段資料，瀏覽器將其存儲在本地。之後，瀏覽器每次請求都會將Cookies發送回伺服器。

4. Session 的工作原理是什麼？
   回答：Session 使用伺服器端存儲，當用戶訪問網站時，伺服器會為每個用戶創建唯一的會話ID，用於在伺服器端存儲和檢索用戶相關數據。

5. Cookies 的安全性問題是什麼？
   回答：Cookies 可能容易受到跨站腳本（XSS）和跨站請求偽造（CSRF）攻擊，因此需要使用HTTPOnly和Secure標誌來增強安全性。

6. 什麼是持久性 Cookies 和會話 Cookies？
   回答：持久性 Cookies 在瀏覽器關閉後仍保留，而會話 Cookies 在瀏覽器關閉後被刪除。

7. 如何使用 Cookies 和 Session 來跟蹤用戶的登錄狀態？
   回答：通過在Cookies或Session中存儲用戶的登錄標誌，當用戶訪問時檢查這些標誌來識別是否已登錄。

8. 如果用戶禁用 Cookies，如何處理會話跟蹤？
   回答：可以使用URL重寫或其他替代方法來傳遞會話ID，以繼續跟蹤用戶，即所謂的cookieless會話。

9. 什麼是HTTPOnly Cookies和Secure Cookies？
   回答：HTTPOnly Cookies無法通過JavaScript訪問，增強了安全性。Secure Cookies僅在HTTPS連接下傳遞，提高了傳輸安全性。

10. 如何在網站中實現「記住我」功能？
    回答：通常通過持久性Cookies來實現，當用戶選中「記住我」時，保存登錄憑證。

11. 什麼是單點登錄（SSO）？它如何使用 Cookies 或 Session 來實現？
    回答：SSO允許用戶在多個相關應用間單次登錄。它通常使用Cookies或Session來共享身份驗證信息。

12. 如果一個網站需要用戶登錄才能訪問某些資源，你會如何在爬蟲中處理身份驗證和會話狀態？
    回答：需要模擬登錄過程，發送POST請求以提交登錄憑證，然後在後續請求中攜帶Cookies或Session以保持會話狀態。

13. 什麼是跨網站腳本攻擊（XSS）和跨站請求偽造攻擊（CSRF）？如何防止它們？
    回答：XSS攻擊是通過注入惡意JavaScript代碼來入侵，可通過適當的輸入驗證和輸出編碼來防止。CSRF攻擊是利用用戶在其他網站上的信任，可通過使用CSRF令牌來防止。

14. 什麼是JWT（JSON Web Tokens）？它們如何與 Session 比較？
    回答：JWT是一種輕量級的身份驗證標準，用於在客戶端和伺服器之間傳遞信息，不需要伺服器狀態。與Session相比，它們更可擴展，但需要妥善管理和驗證。

15. 在Web應用中，什麼情況下你會選擇使用Cookies而不是Session，或反之？
    回答：Cookies通常用於客戶端存儲輕量級數據，Session用於伺服器端存儲敏感信息。選擇取決於應用需求和性能考量。

16. 如何清除或刪除用戶的 Cookies 或 Session？
    回答：可以通過過期Cookies，或在伺服器端刪除相應的Session來清除用戶的Cookies或Session。


## 總結
本文深入探討了Cookies和Session在網頁中的關鍵作用，以及如何在爬蟲中使用它們來模擬真實用戶的瀏覽行為。

我們論述了它們的定義、運作方式、安全性考量，並提供了實例演示。這些知識對於網頁開發和數據爬取非常重要，能夠幫助開發者更好地理解和應用Cookies和Session。