HTTP中的cookie


由於HTTP本身是Stateless,即便是相同的TCP connection,每次請求對於server來說都是陌生人,若想要知道請求的client的身分,可以透過cookie標記並用資料庫去做記錄。

Cookie的目的

Cookie主要的目的有三個:

  • Session 管理:帳號登入、遊戲分數等。
  • 個人化:網站主題、顏色等。
  • 追蹤:記錄及分析使用者行為。

Cookie的建立

server 在 response header 加上

Set-Cookie: <cookie-name>=<cookie-value>

即可。舉例來說若www.example.com在回傳時,設定兩個cookie:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: my_cookie=chip
Set-Cookie: my_cookie2=butter

此時browser會記住這個cookie在www.example.com這個網域。接下來之後對www.example.com的請求都會帶上這兩個和其他此Domain及Path下的cookie:

GET / HTTP/1.1
Host: www.example.com
Cookie: my_cookie=chip; my_cookie2=butter

Cookie的持久性

上述的例子,當browser關閉時,cookie即被刪除,這種類型的cookie叫做 Session cookies,若要建立常駐 cookies,則需要加上Expires的資訊,比如:

Set-Cookie: id=abc; Expires=Tue, 1 Mar 2022 08:00:00 GMT;

Cookie的其他特性

Domain

當Domain被設定時,cookie的作用範圍也包含子網域,否則只包含當前網域。

Path

cookie的作用範圍也包含其子資料夾。

HttpOnly Flag

避免Javascript透過Document.cookie取得cookie來進行跨站腳本攻擊(XSS),對不需要透過Javascript取得的cookies可以設定此旗幟。

Secure Flag

設定Secure Flag的cookies只能透過HTTPS傳送。

SameSite

SameSite可避免一些CSRF攻擊,有以下三種值:

Lax

跨站請求只允許導向時才會發送Cookie。

Strict

不允許跨站請求發送Cookie。

None

跨站請求會發送Cookie,但前提要具有Secure Flag。


See also