在请求头中加入set-cookie
字段,客户端收到这个Set-Cookie的ֽ应后,在之后的请求时会在Cookie中上这个值。
一般格式可以参考如下
Set-Cookie: token=dywuh1g87; Expires=Wed, 11 Aug 2024 07:28:00 GMT; Secure; HttpOnly
了解一下cookie
解释一下常用的几个属性
Expires
这个属性用于控制 Cookie 的生命周期。Expires 指定了 Cookie 的过期日期和时间,如果这个属性没有设置会在浏览器关闭时被删除。Max-Age
这个属性同样用于控制 Cookie 的生命周期。但Max-Age 则表示 Cookie 自创建起的最大有效时间(以秒为单位)Domain
这个属性指定了 Cookie 的适用域名。默认情况下,Cookie 仅适用于响应中设置 Set-Cookie 头的域名。如果设置了 Domain 属性,Cookie 可以在该域名的所有子域中使用。举例来说,Domain=baidu.com 会让 Cookie 在 baidu.com 以及 sub.baidu.com 等子域中都可用。Path
这个属性规定了 Cookie 应该在哪个路径下被发送。默认情况下,Cookie 适用于请求路径及其子路径。例如,Path=/a允许 Cookie 仅在 /a及其子路径下有效,而在 /c目录下则不会发送这个 Cookie。Secure
如果设置了 Secure 属性,Cookie 只能通过 HTTPS 连接发送,而不能进行HTTP连接发送,这样确保数据在传输过程中被加密。这在处理敏感信息时尤其重要,比如登录凭据或支付信息。HttpOnly
这个属性限制了 Cookie 只能通过 HTTP 协议访问,而不能通过 JavaScript 代码访问。这增加了 Cookie 的安全性,因为它减少了 XSS(跨站脚本攻击)等安全威胁的可能性。
值得注意的是:expires和max-age在设置后,如果设置了时间,浏览器会将cookie写入磁盘,下次打开依旧有效,但expires存在可以忽略的问题,expires的时间设置后,当客户端和浏览器端时间不匹配时,就会产生偏差。
Set-Cookie是较少的,在报头中可能ߚ在多字段。为此res.setHeader的第二个参数可以是一个数组
cookie存在的性能问题
由于Cookie的实现机制,一旦服务端向客端发了设置Cookie的意图,除非Cookie过期
否则客户端每次请求都会带cookie到服务器,一旦设置的Cookie过多,,将会导致报头较大。所以减少不必要的cookie,毕竟流量就是钱嘛。
cookie性能浪费的几个解决方案
- 细分path
- 为静态组件使用不同的域名
cookie纯在的安全问题
- cookie可以被用户篡改
早期的服务器为了记录用户信息,浏览器会将信息通过cookie传给服务器,这个导致后来的服务器session的出现。cookie会和服务器的session纯在映射关系,但是一旦session过多,就会达到node内存上限(这个上限可以手动增大),这个主要是由于V8的原因,V8一开始目标就是浏览器运行,这个解决的方法可以是redis高速缓存,session的出现一定程度上解决了用户再主动篡改,但是cookie可能会被外人非法劫持,这个也导致了token的产生,目前常见的对应包jsonwebtoken,通过公钥/私钥进行加密,现在的加密技术已经比较成熟了