cookies

前言

之前在项目中使用跨域传cookies时,对cookies进行了一些了解,所以整理出来分享给大家

MDN

MDN对http cookies的解释为

An HTTP cookie (web cookie, browser cookie) is a small piece of data that a server sends to the user’s web browser.

Cookies are mainly used for three purposes:

Session management
Logins, shopping carts, game scores, or anything else the server should remember

Personalization
User preferences, themes, and other settings

Tracking
Recording and analyzing user behavior

request 和 response

总所周知,request和repsonse上都可以携带cookies,当我们对response.cookies添加和删除时,request.cookies也会跟着变化,那么他们是引用的同一个实例么?

Request.Cookies,Response.Cookies是两个不同的实例,两个集合实例的添加、删除操作就不同了,对Response.Cookies添加、删除都会及时的反映到Request.Cookies,对Request.Cookies的添加、删除操作,Response.Cookies没有反应

具体分析过程点我 侵删

cookies

在这里主要谈到nodejs如何操作cookies

1
2
3
4
5
6
7
request.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);

request.headers.cookie //字符串 ;分隔

response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);

response.headers.cookie //字符串 ;分隔

cookie属性

HttpOnly 属性: 这是微软对Cookie做的扩展。如果在Cookie中设置了”HttpOnly”属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。

Secure属性: 当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被窃取到Cookie 的具体内容。同上,在客户端我们也无法在document.Cookie找到被设置了Secure=true的Cookie键值对。Secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,HttpOnly属性的目的是防止程序获取Cookie后进行攻击。我们可以把Secure=true看成比HttpOnly更严格的访问控制。

path属性: 指定可访问Cookie的目录。例如:”userId=320; path=/shop”;就表示当前Cookie仅能在shop目录下使用。

domain属性: 指定可访问Cookie的主机名.主机名是指同一个域下的不同主机,例如:www.google.com和gmail.google.com就是两个不同的主机名。默认情况下,一个主机中创建的Cookie在另一个主机下是不能被访问的, 但可以通过domain参数来实现对其的控制,其语法格式为:”name=value; domain=CookieDomain”;以google为例,要实现跨主机访问,可以写为: “name=value;domain=.google.com”;这样,所有google.com下的主机都可以访问该Cookie。

Expires属性:
指定过期时间,格式为”name=value;; expires=GMT_String”; 其中GMT_String是以GMT格式表示的时间字符串,超过这个时间,Cookie将消失,不可访问。

Max-Age属性:
指定过期时间,用来替代expires, 可以为正数,表示此Cookie从创建到过期所能存在的时间,以秒为单位,此Cookie会存储到客户端电脑,以Cookie文件形式保存,不论关闭浏览器或关闭电脑,直到时间到才会过期。 可以为负数,表示此Cookie只是存储在浏览器内存里,只要关闭浏览器,此Cookie就会消失。maxAge默认值为-1。 还可以为0,表示从客户端电脑或浏览器内存中删除此Cookie。

Cookie的限制

一、浏览器允许每个域名所包含的 Cookie 数:

Microsoft 指出 Internet Explorer 8 增加 Cookie 限制为每个域名 50 个,但 IE7 似乎也允许每个域名 50 个 Cookie(《Update to Internet Explorer’s Cookie Jar》)。

Firefox 每个域名 Cookie 限制为 50 个。

Opera 每个域名 Cookie 限制为 30 个。

Safari/WebKit 貌似没有 Cookie 限制。但是如果 Cookie 很多,则会使 header 大小超过服务器的处理的限制,会导致错误发生。

二、不同浏览器间 Cookie 总大小也不同:

Firefox 和 Safari 允许 Cookie 多达 4097 个字节, 包括名(name)、值(value)和等号。
Opera 允许 Cookie 多达 4096 个字节, 包括:名(name)、值(value)和等号。
Internet Explorer 允许 Cookie 多达 4095 个字节, 包括:名(name)、值(value)和等号。
注:多字节字符计算为两个字节。在所有浏览器中,任何 Cookie 大小超过限制都被忽略,且永远不会被设置。