cookie 和 session

cookie 和 session 作为对客户端身份的确定,这里写的是在 node.js 的 express 框架下的 cookie 与 session 使用,主要基于 cookie-parser 和 express-session 中间件所写,本文仅限于个人学习所用,有较多引用



res.cookie

app.use(cookieParser()); 
// 对 cookie 进行解析

res.cookie 设置

res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true });
res.cookie('name', 'tobi', { domain: '.example.com', path: './admin', secure: true });
res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true });

res.cookie 中的配置

domain: 域名
name=value: 键值对,可以设置要保存的 key/value,这里的 name 不能与其他属性项的名字一样
expires: 过期时间(秒),即设置在某个时间点之后 cookie 就会失效
maxAge: 最大失效时间(毫秒),设置在多长时间之后失效
secure: 当 secure 值为 true 时,cookie 在 http 中是无效的,在 https 中才有效
path: 表示 cookie 影响到的路,如 path=/。如果路径不能匹配时,浏览器则不会发送这个 cookie
httpOnly: 是微软对 cookie 做的扩展。如果在 cookie 中设置了“httpOnly”属性为真,则通过程序
         (JS脚本、applet 等)将无法读取到 cookie 信息,防止 XSS 攻击产生
singed: 表示是否签名cookie, 设为true 会对这个 cookie 签名,这样就需要用res.signedCookies
        而不是 res.cookies 访问它。被篡改的签名 cookie 会被服务器拒绝,并且 cookie 值会重置为它的原始值



获取 cookie

res.cookies.name

删除 cookie

res.cookie('rememberme', '', {expires: new Date(0)});
res.cookie('username', 'zhangsan', {domain: 'ccc.com', maxAge: 0; httpOnly: true});



参考https://juejin.im/post/5a7212826fb9a01cbc6eb6de

cookie-parser

    cookie 签名与解析

    cookieParser 初始化时,传入 secret 作为签名的密钥

    设置 cookie 时,将 signed 设置为 true,表示即将对 cookie 进行签名

    获取 cookie 时,可以通过 req.cookies,也可以通过 req.signedCookies 获取

var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();

app.use(cookieParser('secret'));

app.use(function (req, res) {
       res.cookie('nick', 'chyingp', {signed: true});
});

app.listen("3000");

    签名前的 cookie 的值为 chyingp,签名后的 cookie 值为

s%3Achyingp.uVofnk6k%2B9mHQpdPlQeOfjM8B5oa6mppny9d%2BmG9rD0,

    decode后为

s:chyingp.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0



签名 cookie 解析

    1. 将签名 cookie 对应的原始值提取出来

    2. 验证签名 cookie 是否合法

cookie 签名的作用

    防止 cookie 被篡改,当有人伪造 cookie 时,签名不一样,则后台会经过验证,判断 cookie 是伪造的,但当用户名和签名相同的情况下,就会很容易伪造了



express-session

    使用

        var session = require('express-session');
        var express = require('express');
        var app = express();
    
        app.use(session({
            name: 'zns_sess_id',
            maxAge: 1800*1000,
            resave: true,
            saveUninitialized: true
        }));
    
        app.listen("8080");
配置项(有些属性与 cookie 相同比如 maxAge)
secret: 一个 string 类型的字符串,作为服务器端生成 session 的签名
name: 返回客户端的 key 的名称
resave: 强制保存 session 即使它没有变化。默认 true
saveUninitialized: 强制将未初始化的 session 存储。 当新建了一个 session 
                   且未设定属性或值时, 它就处于未初始化状态。 在设定一个 cookie 前, 
                   这对于登陆验证, 减轻服务端存储压力, 权限控制是有帮助的。
                  (默认: true) 。 建议手动添加
cookie: 与cookie的设置一样,设置发送到客户端 的key 的属性, 默认值为
        { path: ‘/’ , httpOnly: true, secure: false, maxAge: null }
rolling: 在每次请求时强行重新设置 cookie, 这将重置 cookie 过期时间(默认: false)                  



参考https://juejin.im/post/5bbc47a15188255c9e02edbd

session 和 cookie 区别和联系

    session 在服务器端,cookie 在客户端
    session 中保存对象,cookie 保存字符串
    session 安全性比 cookie 高
    但 session 必须基于 cookie 运行,即 cookie 失效,则 session 也失效



总结

    cookie 是客户端发送请求过来,服务器返回回去时,在报文的头部会设置 cookie 在下次客户端发送请求时,会把 cookie 一并发过去,做为服务器对客户端的认证和识别而 session 是基于 cookie 的一种技术,在每次客户端发送请求时,都会发送一个 cookie,只是 session 中每次 cookie 的值不同且由服务器生成,按照双方约定的规定,只有服务器存的值与客户端发送过来的值相同,服务器才会认同

你可能感兴趣的:(cookie 和 session)