Cookie筆記

qfstudy發表於2018-08-18

1.Cookie

HTTP Cookie(也叫Web Cookie或瀏覽器Cookie)是伺服器傳送到使用者瀏覽器並儲存在瀏覽器的一小塊資料,它會在瀏覽器下次向同一伺服器再發起請求時被攜帶併傳送到伺服器上。通常,它用於告知服務端兩個請求是否來自同一瀏覽器。Cookie使無狀態的HTTP協議記錄穩定的狀態資訊成為了可能。每個 Cookie 的大小一般不能超過4KB。

Cookie的常用場合:

  • 會話(session)狀態管理:儲存登入、購物車等需要記錄的資訊。
  • 個性化設定:如使用者自定義設定、主題等
  • 追蹤:記錄和分析使用者行為。

Cookie 包含以下幾方面的資訊。

  • Cookie 的名字
  • Cookie 的值(真正的資料寫在這裡面)
  • 到期時間
  • 所屬域名(預設是當前域名)
  • 生效的路徑(預設是當前網址)

瀏覽器的同源政策規定,兩個網址只要域名相同和埠相同,就可以共享 Cookie。

Cookie曾一度用於客戶端資料的儲存,因當時並沒有其它合適的儲存辦法而作為唯一的儲存手段,但現在隨著現代瀏覽器開始支援各種各樣的儲存方式,Cookie漸漸被淘汰。由於伺服器指定Cookie後,瀏覽器的每次請求都會攜帶Cookie資料,會帶來額外的效能開銷(尤其是在移動環境下)。新的瀏覽器API已經允許開發者直接將資料儲存到本地,如使用 Web storage API (本地儲存和會話儲存)或 IndexedDB

2.建立Cookie

當伺服器收到HTTP請求時,伺服器可以在響應頭裡面新增一個Set-Cookie選項。瀏覽器收到響應後通常會儲存下Cookie,之後對該伺服器每一次請求中都通過Cookie請求頭部將Cookie資訊傳送給伺服器。另外,Cookie的過期時間、域、路徑、有效期、適用站點都可以根據需要來指定。

2.1 Set-Cookie響應頭部和Cookie請求頭部

伺服器使用Set-Cookie響應頭部向瀏覽器傳送Cookie資訊。一個簡單的Cookie可能像這樣:

Set-Cookie: "xxx=dd"
複製程式碼

伺服器通過該頭部告知瀏覽器儲存屬性為xxx值為dd的Cookie資訊。

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: xxx=dd
複製程式碼

對該伺服器發起的每一次新請求,瀏覽器都會將之前儲存的Cookie再傳送給伺服器。

GET /sample_page.html HTTP/1.1
Host: www.example.com
Cookie: xxx=dd
複製程式碼

2.2 會話期Cookie

會話期Cookie:瀏覽器關閉之後它會被自動刪除,也就是說它僅在會話期內有效。會話期Cookie不需要指定過期時間(Expires)或者有效期(Max-Age)。

2.3 Cookie有效期

和關閉瀏覽器便失效的會話期Cookie不同,Cookie可以指定一個特定的過期時間(Expires)或有效期(Max-Age)。

Set-Cookie: id=1; Expires=Wed, 21 Oct 2005 07:28:00 GMT;
複製程式碼

當Cookie的過期時間被設定時,設定的日期和時間只與客戶端相關,而不是服務端。

2.4 Cookie的Secure 和HttpOnly

標記為 Secure 的Cookie只應通過被HTTPS協議加密過的請求傳送給服務端。

為避免跨域指令碼 (XSS) 攻擊,通過JavaScript的 Document.cookieAPI無法訪問帶有 HttpOnly 標記的Cookie,它們只應該傳送給服務端。如果 Cookie 不想被客戶端 JavaScript 指令碼呼叫,那麼就應該為其設定 HttpOnly 標記。

Set-Cookie: id=1; Expires=Wed, 21 Oct 2005 07:28:00 GMT; Secure; HttpOnly
複製程式碼

2.5 Cookie的Domain和Path

Domain 標識指定了哪些主機可以接受Cookie。如果不指定,預設為當前文件的主機(不包含子域名)。如果指定了Domain,則一般包含子域名。

Path 標識指定了主機下的哪些路徑可以接受Cookie(該URL路徑必須存在於請求URL中)。以"/" 作為路徑分隔符,子路徑也會被匹配。 例如,設定 Path=/xxx,則以下地址都會匹配:

  • /xxx
  • /xxx/Web/
  • /xxx/Web/HTTP

2.6 JavaScript通過Document.cookies訪問Cookie

通過Document.cookie屬性可建立新的Cookie,也可通過該屬性訪問非HttpOnly標記的Cookie。

相關文章