网络编程-HTTP cookie

1.cookie的起源

早期Web开发面临的最大问题之一是如何管理状态。简言之,服务器端没有办法知道两个请求是否来自于同一个浏览器。那时的办法是在请求的页面中插入一个token,并且在下一次请求中将这个token返回(至服务器)。这就需要在form中插入一个包含token的隐藏表单域,或着在URL的qurey字符串中传递该token。这两种办法都强调手工操作并且极易出错。

Lou Montulli那时是网景通讯的一个雇员,被认为在1994年将“magic cookies”的概念应用到了web通讯中。他意图解决的是web中的购物车,现在所有购物网站都依赖购物车。他的最早的说明文档提供了一些cookies工作原理的基本信息该文档在RFC2109中被规范化(这是所有浏览器实现cookies的参考依据),并且最终逐步形成了REF2965.Montulli最终也被授予了关于cookies的美国专利。网景浏览器在它的第一个版本中就开始支持cookies,并且当前所有web浏览器都支持cookies。

2.cookie是什么?

HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。

3.创建cookie

当服务器收到HTTP请求时,服务器可以在响应头里面添加一个 Set-Cookie 选项。浏览器收到响应后通常会保存下Cookie,之后对服务器每一次请求中都通过 Cookie 请求头部将Cookie信息发送给服务器。另外,Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。

Set-Cookie: value; Path=/show_cookie; Domain=www.localhost.com; Max-Age=10; HttpOnly; Secure

其中:

  • value 通常是以name=value的格式来指定cookie的值。
  • Path 设置访问哪些路径应该携带这个cookie。如果不设置,则访问所有路径都携带这个cookie。
  • Domain 设置访问哪些域名范围的主机时应该携带这个cookie。如果不指定,默认为 origin,不包含子域名。如果指定了Domain,则一般包含子域名。
  • Max-Age 用来设置cookie什么时候过期,MaxAge为负数或等于0表示立即过期,MaxAge大于0表示过多少秒之后过期。(Expires也可以设置cookie持久化时的过期时长,Expires是老式的过期方法。)
  • Secure 属性是一个标记并且没有其它的值。一个secure cookie只有当请求是通过SSL和HTTPS创建时,才会发送到服务器端。
  • HttpOnly 属性也是一个标记,它使JavaScript 脚本无法获得Cookie。其主要目的为防止跨站脚本攻击(Cross-sitescripting,XSS)对Cookie 的信息窃取。

Cookie: name=value; name2=value2; name3=value3

一系列的名称/值对,形式为 =。名称/值对之间用分号和空格 ('; ')隔开。

3.3.Document.cookie

通过 Document.cookie 属性可创建新的 Cookie,也可通过该属性访问非 HttpOnly 标记的Cookie。

document.cookie = "name=mars"; 
document.cookie = "age=24"; 

通过 JavaScript 创建的 Cookie 不能包含 HttpOnly 标志。

4.HTTP session

session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作 / 消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。然而当 session 一词与网络协议相关联时,它又往往隐含了 “面向连接” 和 / 或 “保持状态” 这样两个含义。

session 在 Web 开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候 Session 也用来指这种解决方案的存储结构。

session 机制是一种服务器端的机制,服务器使用一种类似于散列表的结构 (也可能就是使用散列表) 来保存信息。

session,简而言之就是在服务器上保存用户的信息。服务器使用 session id 来标识 session,session id 由服务器负责产生,保证随机性与唯一性,相当于一个随机密钥,避免在握手或传输中暴露用户真实密码。但该方式下,仍然需要将发送请求的客户端与 session 进行对应,所以可以借助 cookie 机制来获取客户端的标识(即 session id),也可以通过 GET 方式将 id 提交给服务器。

5.参考资料

1.HTTP cookies explained - Human Who Codes

2.RFC 2965 - HTTP State Management Mechanism

3.Session (computer science) - Wikipedia

4.HTTP cookies - HTTP | MDN

posted @ 2020-08-23 17:20  MarsZuo  阅读(166)  评论(0编辑  收藏  举报