详细介绍cookie和session的区别

cookie和session的区别

Cookie

Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。

在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证 ,这样就能防止用户A购买了一件商品放入购物车内,当再次购买商品时服务器看可以判断该购买行为是属于用户A的会话还是用户B的会话了。
要跟踪该会话,必须引入一种机制。
Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。
cookie可以看成是http协议的一个扩展,本质上cookie就是http的一个扩展,有两个http头部是专门负责设置以及发送cookie的,他们分别是Set-cookie以及cookie 当服务器返回给客户端一个相应信息的时候,如果包含Set-cookie这个头部,意思就是告诉客户端建立一个cookie,并且在后续的http请求中自动发送这个cookie到服务器端,直到这个cookie过期,如果cookie的生存空间是整个会话期间的话,那么cookie将会保存在内存中,浏览器关闭的时候就会自动的清楚这个cookie,另外一种情况是,保存在客户端的硬盘中,浏览器关闭的话,cookie也不会被清除,下次打开浏览器访问对应的网站时候,coolie就会自动再次发送到服务器端

一个cookie的设置需要经历4个步骤:

  • 当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器;
  • 服务器在向客户端回传相应的超文本的同时也会发回这些个人信息,存放于HTTP响应头(Response Header),其中包含Set-Cookie头部;
  • 当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置
  • 自此,客户端再向服务器发送请求的时候,都会把相应的Cookie再次发回至服务器,Cookie信息则存放在HTTP请求头(Request Header)中,其中包含cookie头部
  • 服务器端发送一个http响应到客户端

**有了Cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。比如,我们可以从很多网站的登录界面中看到“请记住我”这样的选项,如果你勾选了它之后再登录,那么在下一次访问该网站的时候就不需要进行重复而繁琐的登录动作了。在客户端的第二次请求中,请求头中的cookie头部提供给服务器端可以用来唯一标识客户端身份的信息,**这个时候服务器端可以判断客户端是否启用了cookies,用户也可以在和应用程序交互的过程中禁用cookie的使用,但是这个情况是很少发生的,Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回),通过response.addCookie(Cookie cookie)向客户端设置Cookie。 Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。

Cookie的不可跨域名性

很多网站都会使用Cookie。例如,Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。那浏览器访问Google会不会也携带上Baidu颁发的Cookie呢?或者Google能不能修改Baidu颁发的Cookie呢?
答案是否定的。Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。
Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。

需要注意的是,虽然网站images.google.com与网站www.google.com同属于Google,但是域名不一样,二者同样不能互相操作彼此的Cookie。
注意:用户登录网站www.google.com之后会发现访问images.google.com时登录信息仍然有效,而普通的Cookie是做不到的。这是因为Google做了特殊处理。

session

除了使用Cookie,Web应用程序中还经常使用Session。来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。客户端与服务器之间的交互称为称为一个
Session。

  1. 要使用Session,第一步就要创建Session,Session在何时创建呢?怎么创建的?
  2. session中存储了什么内容,在Session过程中进行了什么操作
  3. Session持续的时间
  4. 如何根据键值从 Session中获取匹配的内容

Session是在什么时候创建的? 是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会随机的为该Session生成唯一的Sessionid。在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,这些内容都保存在服务器上,向客户端发送的只有sessionID;当客户端再次发送请求的时候,会将这个Sessionid带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。
Session中存储了什么内容 session中存放了一些用户数据
Session的持续时间 一般情况下,服务器会在一定的时间内,默认是30分钟保存这个session,过了时间限制后,就会销毁这个session,在销毁之前,可以将用户的一些信息以key value的形式暂时的存放在这个session中。也有使用数据库将这个session序列化保存起来的,这样就没了时间的限制,但是随着时间的增加和访问量的增加,数据库会急速的膨胀。

Session的客户端实现形式

SessionID客户端提供了两种方式来保存
1.使用Cookie来保存,是最常见的方式,服务器通过设置cookie的方式将SessionID发送到客户端上,如果不设置这个过期时间,那么cookie就不会存放到硬盘上,当客户端关闭的时候,Cookie就消失了,对应的SessionID就丢失了,如果设置这个时间为若干时间之后,那么这个Cookie就会保存在客户端的硬盘中,即使浏览器关闭,这个值仍然会存在,下次访问相应网站的时候,同样会发送到服务器上
2.使用url附加信息的形式来保存,比如jsp网站上会有aaa.jsp?JSESSIONID=* 这种形式就是使用url附加信息来保存SessionID的和使用cookie保存sessionID但是不设置Cookie时间是一样的。
3.第三种方式是在页面表中添加了隐藏域,这种方式实际上和第二种方式一样,前者通过GET方式发送数据,后者使用POST方式发送数据

cookie与session的区别

cookie数据保存在客户端种session数据保存在服务器端
当登陆一个网站的时候,如果web服务器端使用的是session,则所有的数据保存在服务器上面,客户端每次请求服务器的时候,会发送当前会话的sessionid,服务器会根据当前sessionid判断相应的用户数据,以确定用户是否登陆,或者是否具有某种权限。因为数据是保存在服务器上的,因此数据不能伪造,但是如果能够获取某个登陆用户的sessionID,用特殊的浏览器伪造该用户的请求也是能够成功的。sessionID四服务器和客户端是随机分配的,一般来说不会有重复,但是如果有大量并发的请求,也是有重复的可能性的

如果浏览器使用的是 cookie,那么所有的数据都保存在浏览器端,比如你登录以后,服务器设置了 cookie用户名(username),那么,当你再次请求服务器的时候,浏览器会将username一块发送给服务器,这些变量有一定的特殊标记。服务器会解释为 cookie变量。所以只要不关闭浏览器,那么 cookie变量便一直是有效的,所以能够保证长时间不掉线。如果你能够截获某个用户的 cookie变量,然后伪造一个数据包发送过去,那么服务器还是认为你是合法的。所以,使用 cookie被攻击的可能性比较大。如果设置了的有效时间,那么它会将 cookie保存在客户端的硬盘上,下次再访问该网站的时候,浏览器先检查有没有 cookie,如果有的话,就读取该 cookie,然后发送给服务器。如果你在机器上面保存了某个论坛 cookie,有效期是一年,如果有人入侵你的机器,将你的 cookie拷走,然后放在他的浏览器的目录下面,那么他登录该网站的时候就是用你的的身份登录的。所以 cookie是可以伪造的。当然,伪造的时候需要主意,直接copy cookie文件到 cookie目录,浏览器是不认的,他有一个index.dat文件,存储了 cookie文件的建立时间,以及是否有修改,所以你必须先要有该网站的 cookie文件,并且要从保证时间上骗过浏览器

总结:

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
https://www.jb51.net/article/128745.htm
https://blog.yoodb.com/yoodb/article/detail/1492

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值