由於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=butterCookie的持久性
上述的例子,當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。