Cookie 屬性解析:SameSite、Secure、HttpOnly 與 CHIPS
DDEVELOPER
開發發布: 11 分鐘閱讀

Cookie 屬性解析:SameSite、Secure、HttpOnly 與 CHIPS

Cookie 是維持網站登入狀態的基礎,但把 Secure、HttpOnly、SameSite、Partitioned 與 __Host- 當成「全部加上就安全」的清單,容易讓登入流程失效,也可能漏掉真正需要的防護。

這些設定各有作用:限制傳輸管道、阻止 JavaScript 直接存取、限制跨網站傳送,或將內嵌元件的狀態依網站分開儲存。本文從實際請求出發,說明各項屬性的作用與限制,以及它們和 CSRF、XSS、第三方 Cookie 政策的關係。

日文原文發布: 2026-06-17

HttpOnly:阻止指令碼存取,不是停止請求

HttpOnly 讓 JavaScript 無法透過 document.cookie 等非 HTTP Cookie 介面存取該 Cookie,降低 XSS 直接竊取工作階段識別碼的風險。

Set-Cookie: session=abc123; Secure; HttpOnly

不過,瀏覽器仍可能把它附加到 JavaScript 發出的請求。攻擊者即使讀不到 Cookie,也可能利用受害者的登入狀態執行操作。

這不表示每次 fetch 都會帶上 Cookie。fetch 的預設 credentials 模式是 same-origin;要傳送到不同來源,通常需要 credentials: "include",而且仍須符合 SameSite 與第三方 Cookie 政策。HttpOnly 不能取代 XSS 防護,仍應依輸出情境正確跳脫內容、避免不安全的 HTML 插入,並搭配適當的內容安全政策(CSP)。

SameSite:限制跨網站傳送,不能代替授權

SameSite 決定 Cookie 是否符合跨網站請求的傳送條件。CSRF 攻擊會誘使受害者的瀏覽器向已登入的網站發出非預期請求;SameSite 能減少部分風險,但不能判斷使用者是否有權執行該操作。

表格若超出畫面寬度,可左右捲動。

值主要行為需要確認的流程
Strict限於同網站情境。從其他網站點一般連結進入時,第一個請求不會帶上 Cookie。
Lax另外允許使用 GET 等安全方法的跨網站頂層導覽。一般連結、重新導向,以及以 POST 返回的流程。
None不受 SameSite 的跨網站限制,但必須搭配 Secure。其他 Cookie 限制及瀏覽器政策仍然適用。

明確設定 Lax 時,跨網站 iframe、fetch 或一般 POST 表單提交不會帶上該 Cookie。省略 SameSite 並不完全等同於明確設定 Lax:部分瀏覽器為了相容性,會在頂層 POST 請求中傳送剛設定的 Cookie,例如設定後兩分鐘內。測試時必須分開確認。

None 不會解除第三方 Cookie 封鎖。若網站用 Lax 允許的 GET 請求修改資料,也不能靠 Lax 阻擋這類操作;不受信任的同網站子網域也可能發出符合 SameSite 條件的請求。

伺服器仍須依應用情境使用 CSRF 權杖、Origin 或 Referer 驗證、Fetch Metadata 標頭檢查及重新驗證身分等防護。SameSite 並不是授權機制。

網站(site)與來源(origin)是不同概念

來源(origin)由網址的 scheme(例如 https)、主機與連接埠組成;包含 scheme 的網站判定(schemeful site)則以 scheme 與可註冊網域為基礎。以下比較一般頂層文件的網址:

表格若超出畫面寬度,可左右捲動。

網址組合來源(origin)網站(site)
https://app.example.com 與 https://api.example.com不同來源同網站
https://example.com 與 http://example.com不同來源scheme 不同,因此不同網站

iframe 的祖先文件也會影響同網站情境的判定,不能只比較兩個主機名稱。連接埠不同會構成不同來源,但 Cookie 本身不按連接埠隔離。

Cookie 的傳送條件、CORS 是否允許讀取跨來源回應,以及 JavaScript 能否存取另一份文件的 DOM,是不同規則。帶有憑證的 CORS 回應必須以 Access-Control-Allow-Origin 指定請求來源,不能使用萬用字元,並設定 Access-Control-Allow-Credentials: true。CORS 阻止讀取回應,不足以證明請求沒有送出或伺服器沒有處理。

把權杖改放 localStorage,不代表比較安全

localStorage 的內容可由 JavaScript 讀取。如果攻擊者能在應用程式的來源中執行指令碼,存放其中的存取權杖就可能被直接竊取。

HttpOnly Cookie 可以阻止直接讀取,但符合條件的請求仍會帶上它,所以還是需要防範 CSRF,以及 XSS 利用登入狀態發出的請求。兩種儲存方式的攻擊面不同,沒有哪一種能省略工作階段設計。

應一併考慮權杖有效期、輪替、伺服器端撤銷、登出、重新驗證身分及授權檢查。只看儲存位置,無法判斷整個登入機制是否安全。

依防護範圍理解各項屬性

Secure 限制傳輸管道;HttpOnly 限制指令碼存取 Cookie;SameSite 限制跨網站傳送;Partitioned 在支援的環境中依頂層網站分開儲存狀態;__Host- 則限制 Cookie 的設定範圍。

每項設定都有邊界。HttpOnly 不能阻止 CSRF,Secure 不能阻止 XSS,SameSite 不能取代授權,Partitioned 也不能解決所有第三方 Cookie 問題。除錯時,要同時檢查瀏覽器儲存的 Cookie 與實際送出的請求,再檢查伺服器端的 CSRF、XSS 及工作階段防護。

參考資料與來源

編輯說明

本文使用 AI 協助編輯,並於發布前由編輯確認。內容仍可能包含事實、解讀或時效上的錯誤;進行重要判斷前,請查閱所列的一手資料或官方文件。

相關工具

相關文章