深刻浅出谈cookie

所谓HTTP cookie又称之为 web cookiebrowser cookie, 在形式上是由服务端发送给用户浏览器端的一小段数据。它会自动地被浏览器存储而后在下一次请求该服务器网络资源时又返还给该服务器。因为HTTP 通讯是无状态的,在登陆页面设计的时候,咱们每每利用cookie做为浏览器状态信息来确认当前用户是否处于登陆状态。node

cookies有如下三个主要应用场景:git

  1. Session管理 如:登陆、购物车、游戏积分、或者任何由浏览器操做记录并同时应记录在服务端的数据。web

  2. 个性设置 如:用户偏好、web 主题、其余个性化设置express

  3. 跟踪 如:记录和分析用户习惯浏览器

cookies曾经是客户端存储数据的惟一方式,可是因为现代浏览器的普及,以及在数据量较大时,携带cookies的通讯会下降网络通讯的效率,愈来愈多的客户端信息倾向于将客户端数据存储在localStoragesessionStorage以及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 类型

浏览器端cookie类型分为session cookiepermanent cookie,他们之间的区别在于前者只要在浏览器关闭后cookie就会消失,而permanent cookie则不会,两者设置的区别在于cookie设置的时候是否添加了expires或者max-age属性。cookie

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 cookie

尽管express原班人马后来离职建立了Koa,在国内还有阿里的egg。可是express目前来讲依然是全球最大的node.js 框架,基于这个缘由。咱们就利用express的cookie机制来从实战角度来看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是否被签名

第二步服务器清理cookie

res.clearCookie('keyname');
复制代码
相关文章
相关标签/搜索