關於 Express 中的 session-secret

怎麼都沒有人開門見山說一下這是啥。

簡述

自從學 Express 就一直好奇這段 code 的意思:

1
2
3
4
5
app.use(session({
secret: 'keyboard cat', // <- 這到底是什麼?
resave: false,
saveUninitialized: true,
}))

網路上找了很多文章都只寫一些像是:

  • 用來認證該 Session 的資料
  • 用于生成 session 的安全字符串
  • 用于加密目标数据用的字符串

好,能看出它跟加密的東西似乎有點關係,但好像還是很抽象?

好在 Huli 寫的 深入 Session 與 Cookie:Express、PHP 與 Rails 的實作 有提到 Express 是怎麼實作 session 的,這邊節錄幾個段落:

那這個 sessionID 是以什麼樣的形式存進 Cookie 的呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var cookie = require('cookie')
var signature = require('cookie-signature')

// get the session cookie name
var name = opts.name || opts.key || 'connect.sid'

// get the cookie signing secret
var secret = opts.secret

if (secret && !Array.isArray(secret)) {
secret = [secret];
}

// set-cookie
onHeaders(res, function(){

// set cookie
setcookie(res, name, req.sessionID, secrets[0], req.session.cookie.data);
});

function setcookie(res, name, val, secret, options) {
var signed = 's:' + signature.sign(val, secret);
var data = cookie.serialize(name, signed, options);

debug('set-cookie %s', data);

var prev = res.getHeader('Set-Cookie') || []
var header = Array.isArray(prev) ? prev.concat(data) : [prev, data];

res.setHeader('Set-Cookie', header)
}

內容的部分比較特別一點,會以 s: 開頭,後面接上 signature.sign(sessionID, secret) 的結果。

把重點放在 function setcookie(res, name, val, secret, options) { ... },其實答案就出來了。

簡單來說 cookie 最後的值會是 s:加上 signature.sign(val, secret) 產生的一段字串(也就是所謂的鑑別碼)。從這裡能看到 secret 會被丟到 function 裡面做了某些事以後產生一個鑑別碼,既然如此 secret 的用途就很直白了。

secret 就是產生鑑別碼時會一起放進去的自定義字串(或想成是雜湊前要先加鹽的概念)

就是這麼簡單。

所以很多人要你用「環境變數」來設定 secret 就是這個原因。

字串模板的進階用法 tagged-template 在 Seuqelize 中使用環境變數的方式
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×