iT邦幫忙

2021 iThome 鐵人賽

DAY 16
2

前言

前兩天介紹完 Secure、HttpOnly、SameSite 幾個跟 cookie 安全性有關的屬性之後,大家應該也讀得有點累了,今天要來講點比較輕鬆的,也就是怎麼在後端的 API Server 設置 cookie 時把前幾天講到的屬性給加上去

Node.js

首先來講講用 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',
    });
)

Go

而在 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 之類的就可以找到不少資料囉~


上一篇
Day15-守護餅乾大作戰(二)
下一篇
Day17-Session 管理(一)
系列文
從以卵擊石到堅若磐石之 Web API 安全性全攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言