Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cookie #12

Open
FanWalker opened this issue Oct 14, 2017 · 0 comments
Open

cookie #12

FanWalker opened this issue Oct 14, 2017 · 0 comments

Comments

@FanWalker
Copy link
Owner

FanWalker commented Oct 14, 2017

HTTP Cookies

HTTP cookie(也叫Web Cookie或者Cookie),是服务器发送到用户浏览器并保存到浏览器上的一块数据,它会在浏览器下一次发起请求时被携带并发送到服务器上。

它的诞生是因为HTTP是一种无状态的协议,一次请求完成后,客户端和服务器端的连接就会关闭,再次交换数据时才建立新的连接。这就意味着服务器无法从连接上跟踪会话,即服务器并不清楚是哪个客户端。

可以用它来确定两次请求是否来自同一个浏览器,从而能够确认和保持用户的登录状态。cookie的使用使得基于无状态的HTTP协议记录稳定的状态信息成为了可能。

Cookie主要用在一下方面:
1、 会话状态管理(如用户登录状态、购物车)
2、个性化设置(如用户自定义设置)
3、浏览器行为跟踪(如跟踪分析用户行为)

创建Cookie

服务器端接收到HTTP请求时,会在响应头里面增加一个Set-Cookie头部。浏览器接收到响应之后会取出Cookie信息并保存,之后浏览器每次向该服务器发送请求时都会携带此Cookie信息。Cookie的过期时间、域、路径、有效期、站点都可以根据需要来指定。

cookie 属性

name 字段为一个cookie的名称。
value 字段为一个cookie的值。

domain 字段为可以访问此cookie的域名。
注意:
非顶级域名,如二级域名或者三级域名,设置的cookie的domain只能为顶级域名或者二级域名或者三级域名本身,不能设置其他二级域名的cookie,否则cookie无法生成。

顶级域名只能设置domain为顶级域名,不能设置为二级域名或者三级域名,否则cookie无法生成。

二级域名能读取设置了domain为自身的cookie,不能读取其他二级域名domain的cookie。所以要想cookie在多个二级域名中共享,需要设置domain为顶级域名,这样就可以在所有二级域名里面或者到这个cookie的值了。
顶级域名只能获取到domain设置为顶级域名的cookie,其他domain设置为二级域名的无法获取。

path 字段为可以访问此cookie的页面路径。 比如domain是abc.com,path是/test,那么只有/test路径下的页面可以读取此cookie。

expires/Max-Age 字段为此cookie超时时间。若设置其值为一个时间,那么当到达此时间后,此cookie失效。不设置的话默认值是Session,意思是cookie会和session一起失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此cookie失效。

Size字段 此cookie大小。

http字段 cookie的httponly属性。若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie。

secure 字段 设置是否只能通过https来传递此条cookie

Set-Cookie响应头部和Cookie请求头部

Web 服务器通过发送一个称为 Set-Cookie 的 HTTP 消息头来创建一个 cookie,Set-Cookie 消息头是一个字符串,其格式如下(中括号中的部分是可选的):

Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

服务器告诉客户端要保存Cookie信息,,响应的数据里面应该包含Set-Cookie头,浏览器收到之后会将Cookie保存。

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

[页面内容]

现在,对该服务器发起的每一次新的请求,浏览器都会将之前保存的Cookie信息通过Cookie请求头发送给服务器。

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

会话期Cookie

会话期Cookie是最简单的Cookie:浏览器关闭之后它会被自动删除,也就是它仅在会话期间有效。会话期Cookie不需要指定过期时间(Expires)或者有效期(Max-Age)。需注意的是,有些浏览器提供了会话恢复的功能,这种情况下即便关闭了浏览器会话期Cookie也会被保存,就好像浏览器从来没有关闭一样。

持久Cookie

和关闭浏览器便失效不同,持久Cookie可以指定一个特定的过期时间(Expires)或者有效期(Max-Age)。该选项的值是一个 Wdy, DD-Mon-YYYY HH:MM:SS GMT 日期格式的值,例如:
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

安全和HttpOnly类型Cookie

只有在使用SLL和HTTPS协议向服务器发起请求时,才能确保Cookie被安全地发送到服务器。HttpOnly标志并没有给你提供额外的加密或者安全性上的能力,当整个机器暴露在不安全的环境时,切记绝不能通过HTTP Cookie存储、传输机密或者敏感信息。

HTTP-only类型的Cookie不能使用Javascript通过Document.cookie属性来访问,从而能够在一定程度上阻止跨域脚本攻击(XSS)。当你不需要在JavaScript代码中访问你的Cookie时,可以将该Cookie设置成HttpOnly类型。特别的,当你的Cookie仅仅是用于定义会话的情况下,最好给它设置一下HttpOnly标志。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

Cookie的作用域

Domain和Path指令定义了Cookie的作用域,即需要发送Cookie的URL集合。

Domain指令规定了需要发送Cookie的主机名。如果没有指定,默认为当前的文档地址上的主机名(但是不包含子域名)。如果指定了Domain,则一般包含子域名。

如果设置了Domain=mozilla.org,则Cookie包含在子域名中(如developer.mozilla.org)。
Path指令表明需要发送Cookie的URL路径。字符%x2F (即"/")用做文件夹分隔符,子文件夹也会被匹配到。

如设置Path=/docs,则下面这些地址都将匹配到:

  • "/docs",
  • "/docs/Web/",
  • "/docs/Web/HTTP"

JavaScript通过Document.cookies访问Cookie

通过Document.cookie属性可以来创建新的Cookie,也能够通过该属性来访问未被指定HttpOnly标志的Cookie。

document.cookie = "yummy_cookie=choco"; 
document.cookie = "tasty_cookie=strawberry"; 
console.log(document.cookie); 
// logs "yummy_cookie=choco; tasty_cookie=strawberry"

学习参考:

HTTP cookies
HTTP cookies 详解
cookie属性详解

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant