一、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用户需要的类型包):
npm i cookie-parser
npm i -D @types/cookie-parser
安装完成后,将cookie-parser配置为全局中间件(例如在main.ts文件中)。
import * as cookieParser from 'cookie-parser';
// 在初始化文件中的某个地方
app.use(cookieParser());
设置 Cookies
// HttpOnly 默认 false 不允许 客户端脚本访问
// 使用 @Response 装饰器
@Get()
index(@Response() res) {
// 设置 cookie
res.cookie("username", 'zhangsan', {
maxAge: 900000, // 过期时间
httpOnly: true, // 是否只有后端可以访问,前端在JS无法访问
});
res.send('这是文章页面')
}
获取 Cookies
// 使用 @Request 装饰器
@Get('getCookies')
getCookies(@Request() req){
return req.cookies.name;
}
删除 Cookies
res.cookie('rememberme', '', { expires: new Date(0)});
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 加密
配置中间件的时候需要传参
app.use(cookieParser('this signed cookie'));
设置 Cookie 的时候配置 signed 属性
@Get()
index(@Response() res) {
// 设置 cookie
res.cookie("username", 'zhangsan', {
maxAge: 900000, // 过期时间
httpOnly: true, // 是否只有后端可以访问,前端在JS无法访问
signed: true, // 是否加密
});
res.send('这是文章页面')
}
signedCookies 获取加密后的 Cookie
console.log(req.signedCookies);