如果做前後端分離的專案,通常前後端是不同源的,在做 Cookie based Authentication 會遇到跨域設定 Cookie 失敗的問題。
跨域設定 Cookie 預設是不允許的,因為這會有資安風險,當然若我們前後端設定妥當,跨域設定自然是沒有問題且安全的,以下是跨域設定任何 Cookie 時應該注意的事項。
-
客戶端 ⇒ 要在請求附上
withCredentials
或credentials: 'include'
,表示允許寫入 Cookie,以及請求才會附上 Cookie -
伺服器 ⇒ 因為接收傳來的請求屬於跨域請求,所以要設定
Access-Control-Allow-Origin
-
伺服器 ⇒ 由於傳來的請求帶有
withCredentials
,Access-Control-Allow-Origin
值不能為*
,要特別寫入前端的 origin -
伺服器 ⇒ 由於傳來的請求帶有
withCredentials
,還要再設定Access-Control-Allow-Credentials: true
-
(Chrome v80 更新) 如果只做到以上幾點,仍然無法設置成功,會跳出以下錯誤:
This set-cookie didn't specify a "SameSite" attribute and was defaulted to "SameSite=Lax" and broke the same rules specified in the SameSiteLax value
意思是說,這個 Cookie 的 sameSite 被設值為 Lax,Lax 是不能被跨域腳本設定的,因此 Cookie 被禁止。若想解決這個問題還要做到下面的設定!
-
Set-Cookie 的 options 要設定為
sameSite: "none"
-
但如果要設定
sameSite=none
,還得再設定secure=true
Cookie 才能被允許 -
如此就能 Set-Cookie 了!
- 前端我設定跑在 http://localhost:5500
- 後端設定在 http://localhost:8000
- 進入
/server
後輸入npm run dev
就能運行後端伺服器
- 純 JS/HTML
- nodejs
- express
- cors plugin
- cookie-parser plugin