Session与Cookie

  • 引入

随着web网站的快速发展,一种新的需求产生了,网站已经不再用于单纯的信息展示,而是一个庞大的具有交互式的多网页的应用。在web应用中,信息的登录是一种很常见的功能,登录后页面跳转必须保持登录状态,不能但是每一次页面跳转都需要重新登录。在这样的需求下cookie应运而生。

cookie

  • 为什么要使用cookie

在前端与后台的http联系中,单纯从请求来说是一个独立的过程。(也就是说发送一个请求,抛开数据内容,后台不知道也不关注上一次是否发送过信息)。但是有些时候我们想让后台知道上一次或前几次的请求信息,这时就需要在发送的内容上做文章。向后台发送一些想让后台知道的,上次请求的情况。而部分内容就是cookie。

  • 什么是cookie

cookie就是一个数据
上文我们知道,cookie就是一种让后台知道,之前请求情况的数据。那么我们就要关心,数据的内容和存储方式。我们知道一般都是前端发送包含cookie请求到后台,后台通过cookie来了解之前访问的情况,那么cookie一定是存储在前端的。(也就是说,前端每请求一次数据,更新并保存cookie在浏览器,下一次请求将之前保存的cookie,发给后台,让后台了解以前请求的情况)。至于存储的内容,由前后端协商设计。后台需要了解什么信息就存储什么信息。

ps:同时cookie也可以存储一些不太重要的信息(如曾经浏览的商品,购物车内容)

  • cookie的特点
  1. 存储在浏览器中

浏览器记录上次请求的数据,下一次请求发给后台,并记录这次返回的信息。
也可以记录一些不重要的信息,为后台减轻存储压力

  1. 存储容量较小(一般4KB)

cookie由于每次请求都要向后台发送数据,所以容量要有限制,否则会大大降低网络传输效率。

  1. 不安全(可以修改或是伪造)

由于数据在浏览器中存储,任何人都可以随意进行更改,达到欺骗后台的目的。所以cookie存储一些不太重要的信息,对于一些重要信息要进行防篡改和加密处理。

  1. cookie使用流程

首次访问后台分配cookie给浏览器,浏览器保存cookie
浏览器第二次访问,将保存的cookie发给后台,后台识别并更新cookie,返回浏览器再次保存

  1. cookie的属性
  • name:一个唯一确定的cookie名称。通常来讲cookie的名称是不区分大小写的。
  • value:存储在cookie中的字符串值。最好为cookie的name和value进行url编码
  • domain:cookie对于哪个域是有效的。所有向该域发送的请求中都会包含这个cookie信息。这个值可以包含子域(如:
    yq.aliyun.com),也可以不包含它(如:.aliyun.com,则对于aliyun.com的所有子域都有效,这里子域表示网站的二级域).
  • path: 表示这个cookie影响到的路径,浏览器跟会根据这项配置,像指定域中匹配的路径发送cookie。
  • expires:失效时间,表示cookie何时应该被删除的时间戳(也就是,何时应该停止向服务器发送这个cookie)。如果不设置这个时间戳,浏览器会在页面关闭时即将删除所有cookie;不过也可以自己设置删除时间。这个值是GMT时间格式,如果客户端和服务器端时间不一致,使用expires就会存在偏差。
  • max-age: 与expires作用相同,用来告诉浏览器此cookie多久过期(单位是秒),而不是一个固定的时间点。正常情况下,max-age的优先级高于expires。
    HttpOnly: 告知浏览器不允许通过脚本document.cookie去更改这个值,同样这个值在document.cookie中也不可见。但在http请求张仍然会携带这个cookie。注意这个值虽然在脚本中不可获取,但仍然在浏览器安装目录中以文件形式存在。这项设置通常在服务器端设置。
  • secure: 安全标志,指定后,只有在使用SSL链接时候才能发送到服务器,如果是http链接则不会传递该信息。就算设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息,所以不要把重要信息放cookie就对了服务器端设置
  1. cookie的应用

cookie最大的一个用途就是,浏览器跳转保持登录和短时间免登陆。
cookie还有一个用途就是,保存一些不重要的信息,如:曾经浏览的商品等。
cookie目的是为曾经使用过该网站的人提供一些数据保存。
ps:浏览器是否有(该网站的)cookie不能作为是否曾经登录的依据。因为cookie存储在浏览器,可能被篡改不安全。

session

为解决cookie不安全的问题,我们可以使用session,来提高网站安全性。

  1. 什么是session

session是保存在服务器上的数据
我们知道由于cookie是保存在客户端上的,所以有被篡改的风险,不安全。要保存重要的数据一定要保证不会被篡改才是安全的,如果文件存储在服务器端,用户无法私自进行修改,那么安全性就会大大提高。session就是一种服务端存储信息的方式。

  1. session原理

session是一种基于cookie的存储方式。说的通俗一点,session负责存储数据,cookie负责告诉后台,是哪一个数据。当建立一个新session的时候,向客户端下发一个session-id,让客户端保存session-id在cookie中,下一次发起请求的时候,将session-id发回后台,后台通过session-id,在很多session中查找到相应session-id对应的session进行操作。

  1. session与数据库的对比

我们知道session和后台数据库都是在服务端的数据存储方式。那么这两者有什么区别呢?

  • session有过期时间:我们可以设置session的过期时间,当时间到达设置后,销毁session,以节约空间。
  • 访问速度:session的数据存储在内存中,session的操作比数据库要快很多,单纯的读取速度大概是后者的10000倍。在高并发的时候,使用session处理不需要长期保存的文件,效率是极高的。
    数据库的信息是一定要长期保存的。session的访问依赖于前端的session-id,如果用户删除掉cookie中的session-id,那么对session信息就难以操作。
    我们可以把session理解为,一种不需要长期保存的带时间销毁机制的高速数据库。
  1. session的使用应注意
  • session-id为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。
  • 如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?
    例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。
  • session的默认失效时间是20分钟
  • session不能替代数据库,不能将session时间设置为无限长,这样会导致内存占用过大。当然session的数据也可以写入数据库中,长期保存。

安全性

  1. cookie防篡改

cookie作为登录状态保存在前端,有被篡改的可能。通过添加签名的方式,提升安全性。签名的作用不是禁止恶意修改,而是可以看出是否有修改过。如果被修改过,那么服务端判定cookie无效。

  1. 加密

cookie也可以加密保存在前端,但是实际意义不大,重要的信息一般保存在session。cookie如果存有重要信息,就算再严谨的加密方式,总会有破解的可能。安全性不如session。

  1. 复制尝试破解

cookie就是一个状态验证,如果有人复制走你的cookie信息,尝试利用cookie登录你的账户。后台是无法分辨登录的合法性。此类安全问题无法避免(cookie就相当于你的账户,密码。如果有人恶意获取cookie,就相当于获取了账户和密码),技术有提供方便,就会带来风险。
解决方案:提示用户选择是否保存cookie,验证cookie发送ip是否异常

区别

  1. 存取方式

Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。

而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。

  1. 隐私策略

Cookie存储在客户端阅读器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。

假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。

  1. 有效期

使用过Google的人都晓得,假如登录过Google,则Google的登录信息长期有效。用户不用每次访问都重新登录,Google会持久地记载该用户的登录信息。要到达这种效果,运用Cookie会是比较好的选择。只需要设置Cookie的过期时间属性为一个很大很大的数字。

由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了阅读器该Session就会失效,因而Session不能完成信息永世有效的效果。运用URL地址重写也不能完成。而且假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易招致内存溢出。

  1. 跨域支持

Cookie支持跨域名访问,例如将domain属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中,例如Google、Baidu、Sina等。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。

仅运用Cookie或者仅运用Session可能完成不了理想的效果。这时应该尝试一下同时运用Cookie与Session。Cookie与Session的搭配运用在实践项目中会完成很多意想不到的效果。

  1. 浏览器支持

Cookie是需要客户端浏览器支持的。假如客户端禁用了Cookie,或者不支持Cookie,则会话跟踪会失效。关于WAP上的应用,常规的Cookie就派不上用场了。

假如客户端浏览器不支持Cookie,需要运用Session以及URL地址重写。需要注意的是一切的用到Session程序的URL都要进行URL地址重写,否则Session会话跟踪还会失效。关于WAP应用来说,Session+URL地址重写或许是它唯一的选择。

假如客户端支持Cookie,则Cookie既能够设为本浏览器窗口以及子窗口内有效(把过期时间设为–1),也能够设为一切阅读器窗口内有效(把过期时间设为某个大于0的整数)。但Session只能在本阅读器窗口以及其子窗口内有效。假如两个浏览器窗口互不相干,它们将运用两个不同的Session。

  1. 服务器压力

Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。因而像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。

而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。关于Google、Baidu、Sina来说,Cookie或许是唯一的选择。

你可能感兴趣的:(Session与Cookie)