cookie和session

cookie和session:

基于cookie机制实现追踪。分轻、重类
cookie与session关系相当于是 主键:value 的模式

原理:

客户端第一次访问服务器,server会发送一个随机生成的令牌给client,而以后的访问中,client都是带着令牌去访问server,只要是对应的cookie,服务器都是自动登录,现在一般站点会自动关闭。所以有时需要关闭前退出

  1. 客户端: http request
  2. 服务端: http response + set-cookie
  3. 客户端: http request + cookie
  4. 服务端: 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存放有两种方式:

  1. 通过URL存取,比如:Java程序中,URL会带上一个jsessionId=xxxxxx等,这样每次重新请求的时候都传了sessionId给服务器
  2. 通过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

注意:

  1. sessionId通常是看不到的,但是当我们把浏览器的cookie禁止之后,Web服务器会采用URL重写的方式传递sessionId,这样就可以在地址栏看到sessionId了
  2. 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都是不可行的
posted @ 2023-01-29 14:12  suyanhj  阅读(40)  评论(0)    收藏  举报