cookie和session
cookie和session:
cookie
基于cookie机制实现追踪。分轻、重类
cookie与session关系相当于是 主键:value 的模式
原理:
客户端第一次访问服务器,server会发送一个随机生成的令牌给client,而以后的访问中,client都是带着令牌去访问server,只要是对应的cookie,服务器都是自动登录,现在一般站点会自动关闭。所以有时需要关闭前退出
- 客户端: http request
- 服务端: http response + set-cookie
- 客户端: http request + cookie
- 服务端: http response
Cookie主要用于以下三个方面:
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户行为等)
Set-Cookie首部字段
NAME=VALUE 赋予Cookie的名称和其值,此为必需项
expires=DATE Cookie的有效期,若不明确指定则默认为浏览器关闭前为止
会话期Cookie
基于内存保存,会话期Cookie是最简单的Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效
会话期Cookie不需要指定过期时间(Expires)或者有效期(Max-Age)。需要注意的是,有些浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期Cookie也会被保留下来,就好像浏览器从来没有关闭一样
持久性Cookie
基于硬盘保存,和关闭浏览器便失效的会话期Cookie不同,持久性Cookie可以指定一个特定的过期时间(Expires)或有效期(Max-Age)
例:
Set-Cookie: id=a3fWa;
Expires=Wed, 21 Oct 2015 07:28:00 GMT;
注意:当Cookie的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端
path=PATH 指定了主机下的哪些路径可以接受Cookie(该URL路径必须存在于请求URL中)。若不指定则默认为文档所在的文件目录,以字符 %x2F ("/") 作为路径分隔符,子路径也会被匹配
如设置 Path=/docs ,则以下地址都会匹配:
/docs
/docs/Web/
/docs/Web/HTTP
domain=域名 指定了哪些主机可以接受Cookie。如果不指定,默认为当前文档的主机(不包含子域名)。如果指定了Domain,则一般包含子域名
如果设置Domain=magedu.com,则Cookie也包含子域名(如:study.magedu.com)
Secure 标记为Secure的Cookie只应通过被HTTPS协议加密过的请求发送给服务端。但即便设置了Secure标记,敏感信息也不应该通过Cookie传输,因为Cookie有其固有的不安全性,Secure标记也无法提供确实的安全保障。从Chrome 52和Firefox 52开始,不安全的站点 (http:)无法使用Cookie的Secure标记
HttpOnly 加以限制使 Cookie 不能被 JavaScript 脚本访问,为避免跨域脚本(XSS)攻击,通过JavaScript的 Document.cookie API无法访问带有HttpOnly标记的Cookie,它们只应该发送给服务端。如果包含服务端Session信息的Cookie不想被客户端JavaScript脚本调用,那么就应该为其设置HttpOnly标记
浏览器对cookie的限制:
Cookie存储的限制是不一样的。例如:单个域名可存储的 Cookie 数量、Cookie 大小等
在进行页面Cookie操作的时候,应该尽量保证Cookie的个数小于20个,总大小小于4KB,这是一个安全且保险的范围
session
轻cookie无法保存过多个人信息,刷新一次页面可能就丢失了,所以服务器采用了session机制。访问时,在server内存中用一段空间存放session,每个session对应一个cookie的内容
原理:
每个session都有一个sessionId,这个ID存放有两种方式:
- 通过URL存取,比如:Java程序中,URL会带上一个jsessionId=xxxxxx等,这样每次重新请求的时候都传了sessionId给服务器
- 通过cookie存取(Tomcat默认如此),这种cookie是session cookie,区别于persistent cookies也就是我们常说的cookie,session cookie要注意的是存储在浏览器内存中,而不是写到硬盘上。程序一开始执行,服务器就生成一个sessionId并通过cookie携带客户端浏览器的缓存中,当下一次访问的时候,服务器先检测一下是否有这个cookie,如果有就取它的ID,如果没有就再生成一个。这就是为什么关闭浏览器之后,再进去session已经没有了,其实在服务器端session并没有清空,而是sessionId变了
当将浏览器关闭,服务器保存的session数据不是立即释放的,此时数据还会存在一段时间(可以在程序中加以设置,Tomcat默认15分钟),只要我们知道那个sessionId,就可以继续通过请求获得此session的信息。session里面的数据都放在服务器端,通过sessionId保证不会访问错误,服务端自动对session进行管理,如果在规定的时间内没有访问,则释放掉这个session
注意:
- sessionId通常是看不到的,但是当我们把浏览器的cookie禁止之后,Web服务器会采用URL重写的方式传递sessionId,这样就可以在地址栏看到sessionId了
- session cookie不可以跨窗口使用,但可以跨同一个窗口的多个标签页
cookie和session比较:
相同点与不相同点:
- cookie和session两者都是在服务器端生成
- session将数据信息保存在服务器端,可以是内存,文件,数据库等多种形式,cookie将数据保存在客户端的内存或文件中
- 单个cookie保存的数据不能超过4K,每个站点cookie个数有限制,比如IE8为50个、Firefox为50个、Opera为30个;session存储在服务器,没有容量限制
- cookie存放在用户本地,可以被轻松访问和修改,安全性不高;session存储于服务器,比较安全
- cookie有会话cookie和持久cookie,生命周期为浏览器会话期的会话cookie保存在缓存,关闭浏览器窗口就消失,持久cookie被保存在硬盘,知道超过设定的过期时间;随着服务端session存储压力增大,会根据需要定期清理session数据
- session中有众多数据,只将sessionID这一项可以通过cookie发送至客户端进行保留,客户端下次访问时,在请求报文中的cookie会自动携带sessionID,从而和服务器上的的session进行关联
cookie缺点:
- 、使用cookie来传递信息,随着cookie个数的增多和访问量的增加,它占用的网络带宽也很大,试想假如cookie占用200字节,如果一天的PV有几个亿,那么它要占用多少带宽?
- cookie并不安全,因为cookie是存放在客户端的,所以这些cookie可以被访问到,设置可以通过插件添加、修改cookie。所以从这个角度来说,我们要使用sesssion,session是将数据保存在服务端的,只是通过cookie传递一个sessionId而已,所以session更适合存储用户隐私和重要的数据
session 缺点:
- 不容易在多台服务器之间共享,可以使用session绑定,session复制,session共享解决
- session存放在服务器中,所以session如果太多会非常消耗服务器的性能cookie和session各有优缺点,在大型互联网系统中,单独使用cookie和session都是不可行的

浙公网安备 33010602011771号