所谓HTTP cookie又称之为 web cookie或browser cookie, 在形式上是由服务端发送给用户浏览器端的一小段数据。它会自动地被浏览器存储而后在下一次请求该服务器网络资源时又返还给该服务器。因为HTTP 通讯是无状态的,在登陆页面设计的时候,咱们每每利用cookie做为浏览器状态信息来确认当前用户是否处于登陆状态。node
cookies有如下三个主要应用场景:git
Session管理 如:登陆、购物车、游戏积分、或者任何由浏览器操做记录并同时应记录在服务端的数据。web
个性设置 如:用户偏好、web 主题、其余个性化设置express
跟踪 如:记录和分析用户习惯浏览器
cookies曾经是客户端存储数据的惟一方式,可是因为现代浏览器的普及,以及在数据量较大时,携带cookies的通讯会下降网络通讯的效率,愈来愈多的客户端信息倾向于将客户端数据存储在
localStorage
和sessionStorage
以及IndexedDB
里。安全
当一个浏览器向一个服务器发送请求的时候该服务器就会在response的时候自动发送Set-Cookie header
给到浏览器。bash
通常状况下格式以下:服务器
Set-Cookie: key=value
Set-Cookie: key=value; Expires=<date>
Set-Cookie: key=value; Max-Age=<non-zero-digit>
Set-Cookie: key=value; Secure
Set-Cookie: key=value;; HttpOnly
复制代码
浏览器端cookie类型分为session cookie
和permanent cookie
,他们之间的区别在于前者只要在浏览器关闭后cookie就会消失,而permanent cookie
则不会,两者设置的区别在于cookie设置的时候是否添加了expires
或者max-age
属性。cookie
在浏览器端,若是用户但愿可以在代码层面获取cookie,能够直接调用document.cookie.网络
console.log(document.cookie);
复制代码
但这里会有一个漏洞,一旦网络遭遇XSS 跨站攻击,恶意代码能够轻易经过document.cookie
获取到当前用户cookie中的敏感信息,如userID, token等。因此在应用设计的时候,有些cookie会设置为httpOnly cookie
,这样,cookie只能被服务端读取,而浏览器端获取不到任何cookie信息。因此从在这里必须强调若是是token这类的敏感信息,绝对不能存储在HTTP cookie中,由于很是容易受到劫持。原则上,cookie设置HTTPS读取是起码的规定,若是能够的话,最好放置在httpOnly cookies中。
尽管express原班人马后来离职建立了Koa,在国内还有阿里的egg。可是express目前来讲依然是全球最大的node.js 框架,基于这个缘由。咱们就利用express的cookie机制来从实战角度来看cookie.
当网络请求到达node.js服务器后,在服务器response的时候设置,代码以下:
res.cookie('key','value',{});
// 前两个参数比较好理解,也就是你要在cookie中要放入的某个键值对,第三个参数是一个可设可不设的对象,是对键值对的额外规定,好比咱们在给某个cookie设置有效时间期限的时候,就须要用到他。
res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true });
复制代码
下面有一张表格详细描述了第三个参数相关配置:
属性 | 类型 | 描述 |
---|---|---|
domain | httpURL string | 默认值:本机服务器域名,通常不设置,能够设置其余服务器域名 |
encode | function | 默认值:encodeURIComponent,通常不设置,其做用在于对于cookie值进行加密 |
expires | Date | 若是不设置,cookies的类型则为 session cookie, 值为0. 若是设置则cookies的类型则为 permanent cookie,值得类型为GMT时间格式 |
httpOnly | boolean | 默认值:false, 若是设置的话,那么cookie的值只有服务器能够读取,浏览器端没法读取,每每用于极其严格的token加密 |
maxAge | number | 它的做用和expires很是类似,设置毫秒值便可,用于登陆token类的设置 |
path | string | 默认值:"/",通常不设置,通常为指定路由的cookie的设置 |
secure | boolean | cookies只能用于https通讯,在目前商业应用中,强烈建议设置 |
signed | boolean | cookies是否被签名 |
res.clearCookie('keyname');
复制代码