一、Cookie 简介

  • HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页 面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何 关系的。如果我们要实现多个页面之间共享数据的话我们就可以使用 Cookie 或者 Session 实现
  • cookie 是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域名的时候共享数据

    二、Cookie 特点

  • cookie 保存在浏览器本地

  • 正常设置的 cookie 是不加密的,用户可以自由看到;
  • 用户可以删除 cookie,或者禁用它
  • cookie 可以被篡改
  • cookie 可以用于攻击
  • cookie 存储量很小。未来实际上要被 localStorage 替代,但是后者 IE9 兼容

    三、NestJS 中使用 Cookie

  • NestJs 中使用 Cookie 的话我们可以用 cookie-parser 来实现

  • https://docs.nestjs.cn/8/techniques?id=cookies
  • 首先安装需要的包(以及TypeScript用户需要的类型包):

    1. npm i cookie-parser
    2. npm i -D @types/cookie-parser
  • 安装完成后,将cookie-parser配置为全局中间件(例如在main.ts文件中)。

    1. import * as cookieParser from 'cookie-parser';
    2. // 在初始化文件中的某个地方
    3. app.use(cookieParser());
  • 设置 Cookies

    1. // HttpOnly 默认 false 不允许 客户端脚本访问
    2. // 使用 @Response 装饰器
    3. @Get()
    4. index(@Response() res) {
    5. // 设置 cookie
    6. res.cookie("username", 'zhangsan', {
    7. maxAge: 900000, // 过期时间
    8. httpOnly: true, // 是否只有后端可以访问,前端在JS无法访问
    9. });
    10. res.send('这是文章页面')
    11. }
  • 获取 Cookies

    1. // 使用 @Request 装饰器
    2. @Get('getCookies')
    3. getCookies(@Request() req){
    4. return req.cookies.name;
    5. }
  • 删除 Cookies

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

    四、NestJS 中 Cookie 中的一些参数

    | domain | 域名 | | —- | —- | | expires | 过期时间( 秒 ),在设置的某个时间点后该 Cookie 就会失效 , 如 expires=Wednesday, 09-Nov-99 23:12:40 GMT | | maxAge | 最大失效时间(毫秒),设置在多少后失效 | | secure | 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效 | | path | 表示 cookie 影响到的路,如 path=/。如果路径不能匹配时,浏览器则不发送这 个 Cookie httpOnly:是微软对 COOKIE 做的扩展。如果在 COOKIE 中设置了“httpOnly”属性,则通 过程序(JS 脚本、applet 等)将无法读取到 COOKIE 信息,防止 XSS 攻击产生 signed : 表 示 是 否 签 名 cookie, 设 为 true 会 对 这 个 cookie 签 名 , 这 样 就 需 要 用 res.signedCookies 而不是 res.cookies 访问它。被篡改的签名 cookie 会被服务器拒绝,并且 cookie 值会重置为它的原始值 | | signed | 指示是否应该对cookie进行加密 |

五、NestJS 中 Cookie 加密

  • 配置中间件的时候需要传参

    1. app.use(cookieParser('this signed cookie'));
  • 设置 Cookie 的时候配置 signed 属性

    1. @Get()
    2. index(@Response() res) {
    3. // 设置 cookie
    4. res.cookie("username", 'zhangsan', {
    5. maxAge: 900000, // 过期时间
    6. httpOnly: true, // 是否只有后端可以访问,前端在JS无法访问
    7. signed: true, // 是否加密
    8. });
    9. res.send('这是文章页面')
    10. }
  • signedCookies 获取加密后的 Cookie

    1. console.log(req.signedCookies);