什麼是 Cookie?#
HTTP cookie 是 Server 給予 Client 的資訊,在 Server 收到 HTTP 請求時,會透過標頭的 Set-Cookie: 將 cookie 回覆給 Client 的瀏覽器儲存,瀏覽器下次再連至該網站時,會直接帶 Cookie 給 Server,Server 則可識別 Client 而讓使用者可以繼續瀏覽,就像瀏覽器沒有關閉一樣。Cookie 主要目的有下述三點,讓瀏覽器的使用上更流暢。
管理:伺服器用來記憶資訊,比如帳號登入。
設定:Client 的設定資訊,比如背景主題。
追蹤:使用者行為的記錄。
Cookie 的安全,由御三家來守護#
由此可知,Cookie 掌控著使用者的身分驗證等敏感資訊的內容,因此就必須有相對應的控制措施進行保護,而最常見的三大保護旗標是 Secure、HttpOnly、SameSite,其中 Secure、HttpOnly 主要用途都是防止 Cookie 被竊取;而 SameSite 用途為防止 CSRF 攻擊。
Secure:用來防止 cookie 不安全的傳遞,啟用後只有在 HTTPS 時,才能將 cookie 傳送給伺服器。
HttpOnly:防止 Cookie 被人看見,啟用後 JavaScritp 無法呼叫document.cookie。
SameSite:只有和 Cookie 是相同來源的請求才能成功,總共有三種值。
Strict:cookie 只有在自己的網站上才會被發送出去,通常為銀行單位使用。
Lax:允許網頁 redirect 到其他網站時,順便把 cookie 送出去,普遍使用這種模式。
None:不使用 SameSite,允許跨站存取。
小知識:Chrome 瀏覽器在 84 版(含)後,如果 Cookie SameSite Flag 沒有帶的話,會強制設定為
SameSite=Lax。
如今都到了 OWASP Top 10–2021,Cookie 的風險還是在榜上#
如果我們沒有啟用 Secure、HttpOnly、SameSite,則會有很高機會造成 A07 Identification and Authentication Failures (身分驗證與授權失敗) 的風險,攻擊者可以透過取得的 Cookie 偽裝受駭者對網站存取敏感資訊或執行惡意操作。

御三家的啟用方法#
因此為了緩解風險,建議將 Secure、HttpOnly、SameSite 進行啟用,啟用方法除了伺服器設定外,也可以透過 WAF 進行啟用。
在 IIS Server 上啟用 Secure、HttpOnly、SameSite Flag#
在 Web.config 中,設定以下值。
<system.web>
<httpCookies sameSite="[Strict|Lax]" httpOnlyCookies="true" requireSSL="true"/>
</system.web>WAF 上啟用 Secure、HttpOnly、SameSite Flag#
F5 Secure、HttpOnly 的設定方式參考官方連結
FortiWeb Secure、HttpOnly、SameSite 的設定方式
config waf cookie-security
edit "<cookie-security_name>"
set secure-cookie enable
set HTTP-only enable
set samesite disable
set samesite-value [strict|lax]
end
end