首页 > 语言 > JavaScript > 正文

深入剖析Express cookie-parser中间件实现示例

2024-05-06 15:22:12
字体:
来源:转载
供稿:网友

文章导读

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 secretapp.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的签名、解析是如何实现的。

cookie签名、验证实现剖析

Express完成cookie值的签名, cookie-parser 实现签名cookie的解析。两者共用同一个秘钥。

cookie签名

Express对cookie的设置(包括签名),都是通过 res.cookie() 这个方法实现的。

精简后的代码如下:

res.cookie = function (name, value, options) {  var secret = this.req.secret; var signed = opts.signed; // 如果 options.signed 为true,则对cookie进行签名 if (signed) {  val = 's:' + sign(val, secret); } this.append('Set-Cookie', cookie.serialize(name, String(val), opts)); return this;};            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选