前兩天介紹完 Secure、HttpOnly、SameSite 幾個跟 cookie 安全性有關的屬性之後,大家應該也讀得有點累了,今天要來講點比較輕鬆的,也就是怎麼在後端的 API Server 設置 cookie 時把前幾天講到的屬性給加上去
首先來講講用 express 寫的 API Server,在設定 cookie 時如果想加上其他屬性,只要在 res.cookie()
最後一個參數裡面加上去就好了
app.post('/signin', confirmPassword, (req, res) => {
res.cookie("sessionID", '123456789aabb', {
httpOnly: true,
secure: true,
samwSite: 'Lax',
});
)
但直接把 secure 設定成 true
有個不太方便的地方,就是因為平常在開發時通常不會在 localhost 使用 HTTPS,因此會導致 cookie 送不出去。而解決方法也很簡單,只要根據 NODE_ENV
去做出不同的設定就可以了,所以也千萬別忘記要在 production 上把 NODE_ENV
設為 production
,而開發時則是設為 development
app.post('/signin', confirmPassword, (req, res) => {
res.cookie("sessionID", '123456789aabb', {
httpOnly: true,
secure: process.env.NODE_ENV !== "development",
samwSite: 'Lax',
});
)
而在 gin 裡面也是類似的做法,在驗證完帳號密碼要 set cookie 時,把 Secure、HttpOnly、SameSite 這些屬性都加上去就可以了,也記得在 Secure 那邊要先判斷目前是不是在 production 上,不然在 localhost 測試時會怎麼樣都登入不進去哦
func signInHandler(ctx *gin.Context) {
http.SetCookie(ctx.Writer, &http.Cookie{
Name: "sessionID",
Value: "123456789aabb",
Secure: os.Getenv("GIN_MODE") == "release",
HttpOnly: true,
SameSite: http.SameSiteLaxMode
})
}
func main() {
router := gin.Default()
router.POST("/signin", confirmPassword, signInHandler)
router.Run(":8888")
}
今天用幾個範例講解了怎麼在 API Server 上 Set-Cookie 時可以加上想要的屬性,用起來非常簡單,而且各語言幾乎都是這樣寫,所以就算你寫的不是 Node.js 或 Go,只要上網查一下 flask set samesite cookie
之類的就可以找到不少資料囉~