什麼!? SameSite Cookies Policy 更新了— Chrome SameSite Attribute 簡介
簡介
相信大家都對Cookies 這個概念不陌生,就算你沒有編程的經驗,在瀏覽不同網站時,總會彈出一兩個訊息,要求用戶同意網站存取用家的Cookies,用以"優化"用家的體驗和幫助網站分析訪客人數。
而在最近這幾個月,Cookies Policy 有了一個重要的更新:
為了提升網絡安全,Google 提出
將SameSite Attibute 的default value 由 "None"轉變為"Lax",亦會要求SameSite Attribute ="None"的 Cookie 必須加入 Secure Flag,加強資料的保護。更新的詳情可在這個連結中看到。
這個更新將會影響數以萬計(甚至億計?)網站的Cookies Policy。如果你沒有看懂以上的更新,不要緊。下文將會簡單介紹Cookies 的結構,並解釋SameSite Attribute 的作用和Secure Flag 的用途。

Cookies 起源和結構
我們平常瀏覽網站都是通過HTTP 協定來進行的。例如想看Medium 的文章,就在瀏覽器中輸入: http://www.medium.
但HTTP 協定本身是無狀態的(Stateless protocol),亦即是說伺服器不會知道用戶上一次是做了什麼。
例如在一個購物網站中,顧客購買了一個蘋果和兩瓶水,在結帳的頁面時,如果網站不使用"額外的手段",伺服器是不知道用戶到底買了什麼,嚴重影響頁面的實現。
因此,Cookies 就是為了辨別用戶身份和儲存部份的客戶資料而發明。Cookies 是載有小量資料的檔案,自動儲存於互聯網瀏覽器中,可供網站日後檢索。
而Cookies 組成分為三大部份 (如下圖):
- 名稱 (Name)
- 數據 (Value)
- 屬性 (Attributes) — 可以沒有、只有一個或有多個屬性

SameSite 屬性 (SameSite Attribute)
SameSite 是其中一個Cookies 的屬性,亦都是今次改動的範圍之一。簡單來說:
SameSite 用來阻止瀏覽器將 Cookies 跨網站發送(prevents the browser from sending this cookie along with cross-site requests)。
主要目標是用以減少跨網站信息洩漏的風險,並針對跨網站偽造要求的攻擊(cross-site request forgery attacks)作保護。 SameSite 設有三個數值 — 1)Strict, 2) Lax 和 3) None。
Strict
Strict 的要求最為嚴格,完全禁止第三方 Cookies,只有當前網頁的 URL 與請求目標一致,才會送出Cookie。
Set-Cookie: CookieName=CookieValue; SameSite=Strict;
例如在下圖中,widget.example 在瀏覽器中了建立了一個Cookie 並將 SameSite 設定為"Strict"。由於目前用家瀏覽的URL 為site.example 與Cookie 的URL 不同,Cookie 並不會向site.example 送出。

這個規則非常嚴格,適合用於銀行需要交易的網站中,保障客戶資料的安全。
Lax
Lax 的要求則較為寬鬆,大多數情況也是不發送Cookie 到第三方 ,但是 Get 請求除外。
Set-Cookie: CookieName=CookieValue; SameSite=Lax;
繼續上圖的例子,如果site.example 將Cookie 的SameSite 設定為"Lax",remote.example (第三方) 提出Get 的指令。與"Strict" 不同,Cookie 將會向remote.example 發送。

這是一個平衡網絡安全和用家體驗的做法。由於Cookies 可以跨網站發送,用家並不需要多次重新登入就可以瀏覽不同網頁。而風險較高的要求,例如POST,在Lax 的設定下將會被禁止,阻止cross-site request forgery attacks 進行。
None
顧名思義,這將容許所有網站對Cookie 的存取,並與Secure Attribute 息息相關,將會在下文詳細介紹。
Secure 屬性 (Secure Attribute)
Secure Attribute 用以限制Cookie 傳輸的方式。如果Secure Attribute 設置為True 時,Cookie只能以"安全"的形式向伺服器傳輸,例如是HTTPS 的方式,並在過程中進行加密使Cookie 的內容不會被容易竊取。
而在這次的Cookie Policy 改動中,如果SameSite 設置為None,Cookie 的Secure Attribute 必須為True,增加資料的保密程度。換句話說:
下面的設置為無效:
Set-Cookie: widget_session=abc123; SameSite=None
下面的設置有效:
Set-Cookie: widget_session=abc123; SameSite=None; Secure
延伸閱讀
如你對API 有興趣,可參閱:
如你對系統架構(IT Architecture) 有興趣,可參閱:
如你對數據管理(Data Governance) 有興趣,可參閱: