第一部分 cookie
首先了解一下会话
Cookie是由网景公司的前雇员Lou Montulli在1993年发明的,在RFC2109(已废弃,被RFC2965取代)里初次被描述的,每个客户端最多保持三百个cookie,每个域名下最多20个Cookie(实际上一般浏览器现在都比这个多,如Firefox是50个),而每个cookie的大小为最多4K,不过不同的浏览器都有各自的实现。对于cookie的使用,最重要的就是要控制cookie的大小,不要放入无用的信息,也不要放入过多信息。
1.1 cookie概述
HTTP 是一个无状态协议,所以客户端每次发出请求时,下一次请求无法得知上一次请求所包含的状态数据;
Cookie是解决HTTP无状态性的有效手段,服务器可以设置或读取Cookie中所包含的信息。
简单的说,cookie是服务器发给用户的一个标识,用来帮助服务器识别用户,从而记录用户状态。
cookie 其他参数option:
1.2 Cookie分类
1.3 Cookie 的安全隐患
Cookie提供了一种手段使得HTTP请求可以附加当前状态, 现今的网站也是靠Cookie来标识用户的登录状态的:
用户提交用户名和密码的表单,这通常是一个POST HTTP请求。
服务器验证用户名与密码,如果合法则返回200(OK)并设置Set-Cookie为authed=true。
浏览器存储该Cookie。
浏览器发送请求时,设置Cookie字段为authed=true。
服务器收到第二次请求,从Cookie字段得知该用户已经登录。 按照已登录用户的权限来处理此次请求。
这里面的问题在哪里?
假如我们直接设置Cookie字段为authed=true并发送该HTTP请求, 服务器岂不是被欺骗了?这种攻击非常容易,
1.4 Cookie 防篡改机制
服务器可以为每个Cookie项生成签名,由于用户篡改Cookie后无法生成对应的签名, 服务器便可以得知用户对Cookie进行了篡改。
第二部分: cookie-parser
实例代码(不签名形式):
chrome中cookie显示为name=value
2.2 cookie-parser API
cookie-Parser和 express-session 这两个中间件在express 4版本之后解耦了,最开始如果用express-session 的话一定也要用cookieParser,
中间件包含三个模块: ;
其中,cookie cookie-signature这两个模块是private的。所有的public API都在cookie-Parser中。
cookie-Parser 有四个接口;
2.2.1 cookieParser(secret, options) 返回的是一个中间件函数
2.2.2 cookieParser.JSONCookie(str)
将cookie作为json格式解析, 如果是json格式的value,就返回, 否则返回过去式;
2.2.3 cookieParser.JSONCookies(cookies)
给定一个对象,会重复调用cookieParser.JSONCookie
2.2.4 cookieParser.signedCookie(str, secret)
解析签名cookie,
2.2.5 cookieParser.signedCookies(cookies, secret)
给定一个对象, 重复调用cookieParser.signedCookie(str, secret)
实例代码(签名):
chrome中cookie显示为bwf=s%3......... 签名前是bwf=hhw
关注我们
如果需要源码可以关注“IT实战联盟”公众号并留言(源码名称+邮箱),小萌看到后会联系作者发送到邮箱,也可以加入交流群和作者互撩哦~~~!
领取专属 10元无门槛券
私享最新 技术干货