有朋友看到這篇「 你知道 Cookie、LocalStorage、SessionStorage 的使用時機嗎? 」內容,對於
正常來說,JavaScript 在瀏覽器上的行為”大部分”都是可以操作的,但是根據 MDN,在瀏覽器裡,「JavaScript 不被存取」通常指的就是把 Token 放在一個 帶有 HttpOnly 屬性的 Cookie 內。帶有這個屬性的 Cookie,瀏覽器在收到響應時會儲存它、並在每次發請求時自動附加,但JavaScript 卻永遠無法透過 document.cookie 讀取到它。這正是「Token 不被 JS 存取」的典型情境。
防範 XSS 攻擊
如果 Token(或 Session ID)存在於 localStorage
、sessionStorage
或一般 Cookie,任何注入到頁面的惡意腳本都可能透過 JavaScript 把它「讀」出來,再送給攻擊者;而 HttpOnly Cookie 一旦設置,JS 就完全無法碰它,大幅提高了對抗 XSS 的能力。
自動送出請求
帶有 HttpOnly(通常還會加上 Secure、SameSite)屬性的 Cookie,瀏覽器每次發同網域請求時都會自動夾帶,前端無需在程式裡手動把它放到 Authorization
header。
就存取行為來討論,你想把後端做成 Stateless API,但又想沿用瀏覽器的 Cookie 機制(例如使用 Laravel Sanctum),或是當你最在意 XSS 風險,且不需要讓前端程式動態讀取 Token。
這時候就適合選用 HttpOnly Cookie
儲存方式 | JS 是否可讀取 | 安全性 | 使用場景 |
---|---|---|---|
localStorage | 可 | 中 | 客製化操作(如前端自行插 header) |
一般 Cookie | 可 | 中 | 兼顧傳統 Session 或輕量追蹤 |
HttpOnly Cookie | 否 | 高(防 XSS) | 高安全性認證(如金鑰、Session ID、JWT) |
這句話正是在描述「把認證 Token 存成 HttpOnly Cookie 的做法」,也就是:瀏覽器替你管理、JS 永遠拿不到,卻能在每次 API 呼叫時自動帶上,以達到更安全的認證流程。
原文發佈於: