HTTP之Cookie&Session


Cookie

- 什么是cookie?

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


- 设置cookie
  1. 服务器通过在响应头里添加一个 Set-Cookie的字符串创造cookie,其格式如下(中括号中的部分是可选的):
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

注意:value部分通常是name=value 格式的字符串,这一项必须填。

  1. 当浏览器在收到的响应报文看到含有Set-Cookie这个字段以后,这个cookie值就会在随后的每次请求中被发送至服务器,cookie值被存储在名为 Cookie 的 HTTP 请求头中,并且只包含了 cookie 的值,忽略全部设置选项。例如:
Cookie: value

注意:这里只有value会发给服务器,在Set-cookie里的可选设置选项只会在浏览器端使用,不会发回给服务器。如果有多个value,可以用逗号隔开,例如:

Cookie: value1; value2; name1=value1

- expires

expires指定Cookie的有效期,它的选项的值是一个 GMT 日期格式的值,例如:

Set-Cookie: name=chiang; expires=Tue, 20 Jun 2017 07:17:37 GMT

如果我们没有设置expires属性,cookie 的生命周期仅限于当前会话中,关闭浏览器意味着这次会话的结束,所以会话 cookie 仅存在于浏览器打开状态之下。如果expires属性的值是一个过去的时间,那么cookie将会被浏览器立即删除。


- domain

指定了 cookie 将要被发送至哪个或哪些域中。默认情况下,domain 会被设置为创建该 cookie 的页面所在的域名,
domin属性将指定作为Cookie适用对象的域名,即cookie将会被发送至哪个或者哪些域名中。默认为为创建Cookie的页面所在域名。
domain属性可以扩充 cookie 可发送域的数量,例如

Set-Cookie: name=chiang; domain=chiang.com

这里我们把domain设置为chiang.com,那么如果我们从a.chiang.com、b.chiang.com发送请求,就可以将该 cookie 的值发送至所有这些站点。因为浏览器会把 domain 的值与请求的域名做一个尾部比较(即从字符串的尾部开始比较),并将匹配的 cookie 发送至服务器。
注意:domain值必须是发送 Set-Cookie 消息头的主机名的一部分,因为这会产生安全问题。不合法的 domain 选择将直接被忽略。


- path

path属性指定了请求的资源 URL 中必须存在指定的路径时才会发送Cookie 消息头。默认为当前发送Set-cookie请求所对应URL的path部分。

Set-Cookie:name=chiang;path=/blog

在这个例子中,path 选项值会与 /blog,/blogxxx 等等相匹配;任何以 /blog 开头的选项都是合法的。
注意:只有在 domain 匹配完毕之后才会对 path 属性进行比较。


- source

source属性只是一个标记而没有值。只有当一个请求通过 SSL 或 HTTPS 创建时,包含 secure 选项的 cookie 才能被发送至服务器。

Set-Cookie:name=chiang;path=/blog

默认情况下,在 HTTPS 链接上传输的 cookie 都会被自动添加上 secure 选项。


- cookie 自动删除

cookie 会被浏览器自动删除的情况:

  1. 会话 cookie (Session cookie) 在会话结束时(浏览器关闭)会被删除
  1. 持久化 cookie(Persistent cookie)在到达失效日期时会被删除
  2. 如果浏览器中的 cookie 数量达到限制,那么 cookie 会被删除以为新建的 cookie 创建空间。

-HTTP-Only cookies

HTTP-Only 的意思是告诉浏览器这个 cookie 绝不能通过 JavaScript 的 document.cookie 属性访问。这个属性是为了帮助阻止通过 JavaScript 发起的跨站脚本攻击 (XSS) 窃取 cookie 的行为。
要创建一个 HTTP-Only cookie,只要在 cookie 中添加一个 HTTP-Only 标记即可:

Set-Cookie: name=chiang; HttpOnly

Session

- 什么是session

维基百科关于session的解释:

在计算机科学领域来说,尤其是在网络领域,会话session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(例如telnet或FTP)中是非常重要的部分。

- 通过cookie来管理session

由于HTTP是无状态协议,也就以为着它无法实现状态管理,例如登陆认证成功的用户状态无法在协议层面保存下来。当该用户下一次继续访问就无法区分他与其他的用户。于是我们使用Cookie 来管理Session,以弥补HTTP 协议中不存在的状态管理功能。
步骤:

  1. 客户端把用户ID和密码等登录信息通过请求报文发送给服务器
  2. 服务器收到请求后,给该用户标记Session ID(如PHPSESSID=048z9j…,为了防止这个ID被盗用,最好将其设置成难以推测的字符串,保证安全),记录其认证状态。然后将这个Session ID写入响应头的Set-cookie。
  3. 客户端在接收到从服务器端发来的Session ID 后,会将其作为Cookie 保存在本地。下次向服务器发送同样的请求时,浏览器会自动发送带有Session ID的Cookie,服务器端可通过验证接收到的Session ID 识别用户和其认证状态。

以上是一个登录认证的session示例,通过这个例子我们可以了解session的基本原理,其实session可以理解为是服务器对cookie的一个映射。

你可能感兴趣的:(HTTP之Cookie&Session)