文章导读
cookie-parser 是Express的中间件,用来实现cookie的解析,是官方脚手架内置的中间件之一。
它的使用非常简单,但在使用过程中偶尔也会遇到问题。一般都是因为对 Express + cookie-parser 的签名、验证机制不了解导致的。
本文深入讲解 Express + cookie-parser 的签名和验证的实现机制,以及cookie签名是如何增强网站的安全性的。
文本同步收录于GitHub主题系列 《Nodejs学习笔记》
入门例子:cookie设置与解析
先从最简单的例子来看下 cookie-parser 的使用,这里采用默认配置。
cookie设置:使用 Express 的内置方法 res.cookie() 。
cookie解析:使用 cookie-parser 中间件。
var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser());
app.use(function (req, res, next) {
console.log(req.cookies.nick); // 第二次访问,输出chyingp
next();
});app.use(function (req, res, next) {
res.cookie('nick', 'chyingp');
res.end('ok');
});
app.listen(3000);
在当前场景下, cookie-parser 中间件大致实现如下:
app.use(function (req, res, next) {
req.cookies = cookie.parse(req.headers.cookie);
next();
});进阶例子:cookie签名与解析
出于安全的考虑,我们通常需要对cookie进行签名。
例子改写如下,有几个注意点:
cookieParser 初始化时,传入 secret 作为签名的秘钥。
设置cookie时,将 signed 设置为 true ,表示对即将设置的cookie进行签名。
获取cookie时,可以通过 req.cookies ,也可以通过 req.signedCookies 获取。
var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();
// 初始化中间件,传入的第一个参数为singed secret
app.use(cookieParser('secret'));
app.use(function (req, res, next) {
console.log(req.cookies.nick); // chyingp
console.log(req.signedCookies.nick); // chyingp
next();
});
app.use(function (req, res, next) {
// 传入第三个参数 {signed: true},表示要对cookie进行摘要计算
res.cookie('nick', 'chyingp', {signed: true});
res.end('ok');
});
app.listen(3000);签名前的cookie值为
chyingp ,签名后的cookie值为
s%3Achyingp.uVofnk6k%2B9mHQpdPlQeOfjM8B5oa6mppny9d%2BmG9rD0 ,decode后为
s:chyingp.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0 。下面就来分析下,cookie的签名、解析是如何实现的。









