使用HttpOnly Cookie,Token 不會被 JS 讀取?

更新於 發佈於 閱讀時間約 4 分鐘

有朋友看到這篇「 你知道 Cookie、LocalStorage、SessionStorage 的使用時機嗎?」內容,對於

Token 不被 JS 存取,這件事情感到疑惑

正常來說,JavaScript 在瀏覽器上的行為”大部分”都是可以操作的,但是根據 MDN,在瀏覽器裡,「JavaScript 不被存取」通常指的就是把 Token 放在一個 帶有 HttpOnly 屬性的 Cookie 內。帶有這個屬性的 Cookie,瀏覽器在收到響應時會儲存它、並在每次發請求時自動附加,但JavaScript 卻永遠無法透過 document.cookie 讀取到它。這正是「Token 不被 JS 存取」的典型情境。

為什麼要使用 HttpOnly Cookie?

  1. 防範 XSS 攻擊
    如果 Token(或 Session ID)存在於 localStoragesessionStorage 或一般 Cookie,任何注入到頁面的惡意腳本都可能透過 JavaScript 把它「讀」出來,再送給攻擊者;而 HttpOnly Cookie 一旦設置,JS 就完全無法碰它,大幅提高了對抗 XSS 的能力。
  2. 自動送出請求
    帶有 HttpOnly(通常還會加上 Secure、SameSite)屬性的 Cookie,瀏覽器每次發同網域請求時都會自動夾帶,前端無需在程式裡手動把它放到 Authorization header。

典型範例:Laravel Sanctum 的 SPA 模式

  • 後端 在使用者登入成功後,透過 Set-Cookie: XSRF-TOKEN=…; HttpOnly; Secure; SameSite=Strict 發送一個 HttpOnly Cookie。
  • 前端 只要在 axios/fetch 中設定 withCredentials: true,瀏覽器就會自動把這個 Cookie 附帶在後續所有 API 請求裡。
  • JavaScript 完全無法讀取或篡改這個 Cookie,Token 保存在瀏覽器、卻對前端程式碼「隱身」。

就存取行為來討論,你想把後端做成 Stateless API,但又想沿用瀏覽器的 Cookie 機制(例如使用 Laravel Sanctum),或是當你最在意 XSS 風險,且不需要讓前端程式動態讀取 Token。

這時候就適合選用 HttpOnly Cookie

取捨、比較

raw-image
  • 優點:防 XSS、瀏覽器代為傳送
  • 缺點:無法由前端動態讀取、無法自己決定何時夾帶(必須用 cookie-based API)

回到「Token 不被 JS 存取」

這句話正是在描述「把認證 Token 存成 HttpOnly Cookie 的做法」,也就是:瀏覽器替你管理、JS 永遠拿不到,卻能在每次 API 呼叫時自動帶上,以達到更安全的認證流程。

實作步驟

  1. 後端回應時設定 Set-Cookie: <你的 Token>=…; HttpOnly; Secure; SameSite=Strict
  2. 前端請求時帶上 withCredentials: true
  3. 後端驗證 Cookie 中的 Token,即完成安全的認證策略
留言
avatar-img
留言分享你的想法!
avatar-img
詹姆士的軟體易開罐
27會員
88內容數
這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
當我們架好站、WebService測試完,接著就是測試區域網路連線啦~
Thumbnail
當我們架好站、WebService測試完,接著就是測試區域網路連線啦~
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
※ 靜態資源回傳 ※ 什麼是靜態資源: 定義:是指事先準備好的資源,這些資源在伺服器上是靜態的、不會隨著每個請求而改變。 資源通常包括: 靜態 HTML 文件。 CSS。 圖像(Image)。 Video。 字體文件:google fonts。 favicon:網頁名稱旁邊的ico
Thumbnail
※ 靜態資源回傳 ※ 什麼是靜態資源: 定義:是指事先準備好的資源,這些資源在伺服器上是靜態的、不會隨著每個請求而改變。 資源通常包括: 靜態 HTML 文件。 CSS。 圖像(Image)。 Video。 字體文件:google fonts。 favicon:網頁名稱旁邊的ico
Thumbnail
前面已經安裝好IIS後,並且也新建站台了,那麼接下來這篇就會分享如何使用它
Thumbnail
前面已經安裝好IIS後,並且也新建站台了,那麼接下來這篇就會分享如何使用它
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
整合測試的時候突然遇到一個突然無法登入產品網站的問題,把程式模組單獨拉出來測試又正常,觀察測試報告後發現出現發生登入異常的時間點並不固定,而且只要發生就會連續發生一段時間,程式被中斷掉。後來確認問題在...
Thumbnail
整合測試的時候突然遇到一個突然無法登入產品網站的問題,把程式模組單獨拉出來測試又正常,觀察測試報告後發現出現發生登入異常的時間點並不固定,而且只要發生就會連續發生一段時間,程式被中斷掉。後來確認問題在...
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
Accept:用戶端能夠接收的內容類型。 Accept: text/plain, text/html Accept-Charset:瀏覽器可以接受的字元編碼集。 Accept-Charset: utf8 Accept-Encoding:指定瀏覽器可以支援的web伺服器返回內容壓縮編碼
Thumbnail
Accept:用戶端能夠接收的內容類型。 Accept: text/plain, text/html Accept-Charset:瀏覽器可以接受的字元編碼集。 Accept-Charset: utf8 Accept-Encoding:指定瀏覽器可以支援的web伺服器返回內容壓縮編碼
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News