[筆記] Chrome DevTools 改寫特定 API 的 Respose Header 加速開發

前後端分離開發時,往往會遇上 CORS 跨域問題。若是遇上是採用 session 來進行驗證的專案,那跨域設置 Cookie 和發送 Cookie 便成了一份亟需解決的難題。這邊筆記下 Chrome 所提供的改寫 Response Header 的工具,以及使用上的限制。

html logo


內容

這邊假設前後端是使用 session 來進行狀態驗證。過往在同域的環境下,設置 session 是稀鬆平常的是,也無須其他設定。不過一遇上跨域環境,那前後端都有一些事情要處理。

必備條件

後端伺服器

1. 在收到登入請求時,必須回傳下列的 Reponse Header,且 Set-Cookie 必須要加上 “Samesite = None” 和 “SECURE” 字樣。這樣一來瀏覽器才會接受設置,並在後續的 API 發送過程中,帶上 Cookie

2. 後端 Set-Cookie 的值若在調整中,導致有多個 Set-Cookie 也沒關係。不過只能其中有一個有 SECURE,否則 override 的功能會失敗


前端伺服器

1. 必須告知後端要開發的網域,如 https://localhost:8899
2. 因為後端 Set-Cookie 必須為 SECURE,所以本地端必須要是 https 連線。這一點可以用 mkcert 來達成
3. 在發送 API 請求時,以 Axios 為例,需要改寫成以下:

簡單說就是開啟 withCredentials 功能,這值預設為 false

4. 改寫 API 登入回傳的 header 時,請一定要避免被後端伺服器判定為無效 session,你才來得及覆寫


使用方法

1. 開啟 DevTool,並先點擊 Preserve Log
2. 選擇你想要進行修改的 API 請求,點下右邊的「鉛筆編輯」符號

notes-chrome-devtools-override-api-respose-header-1

notes-chrome-devtools-override-api-respose-header-2

3. 修改你想要補上的 Header,這邊以編輯 Set-Cookie 為例。修改完後點選方框以外的地方即可完成
4. 先回到登入頁面後,再將欲跳轉的頁面 axios.defaults.withCredential 給設置為 true。這樣一來當你畫面成功登入並跳轉後,就會啟動 override 的覆寫機制,進而讓瀏覽器願意帶上 Cookie 與遠端伺服器進行資料存取了

notes-chrome-devtools-override-api-respose-header-3


注意事項

1. 這個 Override 功能不僅僅是擷取 api 回傳部分,你的 CSS, JS 檔案都有可能在你開發的過程中被快取。如果你想要將其清除的話,可以在 Sources -> Override 內找到並將其刪除即可
2. Google Chrome 在 v94 版本以後,已經將 Samesite = LAX 改為標準值,你也無法自行關閉


參考資料

1. Cookie 的 SameSite 属性
2. 如何判斷網站的 same-origin/cross-origin,same-site/cross-site,SameSite 與 cookie 的再探討
3. https://stackoverflow.com/questions/67761241/same-site-flags-were-removed-in-chromium-91-how-can-i-disable-them-for-local-d/67782159#67782159

按讚加入粉絲團

延伸閱讀