pfan123/Articles

COOKIE与SESSION知识

pfan123 opened this issue · 0 comments

什么是Cookie

Cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据,用来跟踪浏览器用户身份的会话方式。

怎么使用Cookie?

通常我们有两种方式给浏览器设置或获取Cookie,分别是HTTP Response Headers中的Set-Cookie Header和HTTP Request Headers中的Cookie Header,以及通过JavaScript对document.cookie进行赋值或取值。

rfc6265第5.2节定义的Set-Cookie Header,除了必须包含Cookie正文,还可以选择性包含6个属性path、domain、max-age、expires、secure、httponly,它们之间用英文分号和空格("; ")连接。

Cookie的正文部分,是由&连接的key=value键值对字符串,类似于url中的查询字符串。下面是一个标准的Set-Cookie Header:

Set-Cookie: key=value; path=path; domain=domain; max-age=max-age-in-seconds; expires=date-in-GMTString-format; secure; httponly

在浏览器端,通过document.cookie也可以设置Cookie,以MDC文档为例,Cookie的内容除了必须包含正文之外,还可选5个属性:path、domain、max-age、expires、secure。下面是简单的示例:

document.cookie = "key=value; path=path; domain=domain; max-age=max-age-in-seconds; expires=date-in-GMTString-format; secure";

有两点需要说明:

  • max-age作为对expires的补充,现阶段有兼容性问题(IE低版本不支持),所以一般不单独使用;
  • JS中设置Cookie和HTTP方式相比较,少了对HttpOnly的控制,是因为JS不能读写HttpOnly Cookie;

Cookie 字段

rfc6265第5.3节定义了浏览器存放每个Cookie时应该包括这些字段:name、value、expiry-time、domain、path、creation-time、last-access-time、persistent-flag,、host-only-flag、secure-only-flag和http-only-flag。

  • name、value:由Cookie正文指定;
  • expiry-time:根据Cookie中的expires和max-age产生;
  • domain、path:分别由Cookie中的domain和path指定;
  • creation-time、last-access-time:由浏览器自行获得;
  • persistent-flag:持久化标记,在expiry-time未知的情况下为false,表示这是个session cookie;
  • secure-only-flag:在Cookie中包含secure属性时为true,表示这个cookie仅在https环境下才能使用;
  • http-only-flag:在Cookie中包含httponly属性时为true,表示这个cookie不允许通过JS来读写;
  • host-only-flag:在Cookie中不包含Domain属性,或者Domain属性为空,或者Domain属性不合法(不等于页面url中的Domain部分、也不是页面Domain的大域)时为true。此时,我们把这个Cookie称之为HostOnly Cookie;

什么是 Session

Session 指的就是访问者从到达某个特定主页到离开为止的那段时间。 Session 其实是利用 Cookie 进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了。

ps: 为这个用户创建的Cookie的名称是aspsessionid。这个Cookie的唯一目的就是为每一个用户提供不同的身份认证

session

cookie 和session 的区别

  • 1.session 在服务器端,cookie 在客户端(浏览器)
  • 2.各大浏览器对 cookie 个数的限制通常是 20~50 个,大小限制通常在 4095~4097 字节之间,建议页面cookie操作时,应尽量保证cookie个数小于20个,总大小 小于4KB
  • 3.session 默认被存在在服务器的一个文件里(不是内存)
  • 4.session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
  • 5.session 可以放在 文件、数据库、或内存中都可以。
  • 6.用户验证这种场合一般会用 session

Q&A

1.服务端如何识别特定的客户?

每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。

2.设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?

登录信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。

参考资料:

你所不知道的HostOnly Cookie

COOKIE和SESSION有什么区别?

session与cookie的区别

Cookie个数限制及大小

深入理解 Session 与 Cookie

会话管理,cookie-parser 和 express-session