浅谈cookie、session
揭秘Cookie:
cookie说的直白点就是保存在用户浏览器端的一个键值对,举个例子,你现在登录了京东商城,你把浏览器关闭之后,你再打开京东,你还是可以对你的账户继续操作,已经购买的商品,订单都是可以看到的,这个就是cookie起了作用。那为什么你再次打开的时候,就直接是已经登录状态了,京东的服务端是怎么知道你已经登录的哪,其实就是cookie起了作用,就是你在登录的时候京东对你的浏览器设置了cookie,你登录的时候它把你的账号密码写到了你浏览器的cookie里面,你下次打开京东的时候,它就默认把你浏览器里面的cookie,也就是你的账号密码发送到了京东的服务端,这样的话,京东就知道你已经登录,所以你再打开jd的时候就是已经登录的状态了,很多网站上面的记住我、30天不需要登录就是用的cookie,前面也说了cookie是存在本地的,如果你清理了浏览器的cookie,那么cookie就没有了,你就是未登录的状态了。
为什么要用Cookie?
在HTTP请求中,每个HTTP请求都是独立,没有办法做上下文关联,但是在真正的应用中,很多场景是需要用到这种关联的。最经典也是最常见到使用Cookie的就是登录操作,登录成功后,我们可以在同一浏览器下的不同Tab页面都能访问我们需要登录才可以看到的页面。这就是通过Cookie来实现的。否则每开一个Tab页面登录一次淘宝,估计你也就不想购物了。
所谓的Cookie到底是什么?
从本质上来说,Cookie我们可以理解为,它就是一个存在硬盘的字符串,Cookie可以做很多操作,以登录为例的话,它实际就是存在硬盘中的账号密码,多数会以一种加密的方式存储。
不同浏览器时Cookie是共用的么?
假设电脑上有三种浏览器,谷歌、欧朋、火狐,如果谷歌上打开淘宝并且登录,那么火狐浏览器打开淘宝时一定还是需要登录,其实认真想下就能够想通了,Cookie是存在硬盘中的一个字符串,那么谷歌和火狐浏览器分别安装在不同的目录下,它们存储Cookie的地址一定是不同,所以不同浏览器之间是不可以共用Cookie的。
揭秘Session:
上面说了cookie,提到cookie肯定不能少了session,什么是session呢,说直白点,就是保存在服务端的一个键值对。举个例子,还是京东,登录的时候已经把账号密码写到cookie里面了,咱们再去打开京东页面的时候,浏览器会自动把京东这个网站下面的cookie发给京东的服务端,也就是cookie里面存的东西,账号密码发到京东的服务端了,那发过去了,京东的服务端肯定是要验证一下,你发的账号密码对不对,要不然你知道谁的账号了,你随便伪造一个cookie发给京东那就直接能操作别人的账号了,那就不安全了。那怎么办呢,服务端就也保存一个键值对不就行了,那你把cookie发过来的时候,和我这保存的这个键值对一样不就ok了,这个就是session,其实就是保存在服务端的一个键值对。
有的人可能会问了,那你的账号密码肯定都是存在数据库里面的,完全不用session啊,cookie发过来的时候,我直接从数据库里面查到这个用户的账号密码做比较就好了,这样当然是可以的,但是我想说你太年轻了,你想如果打开一个网站,里面很多页面都是要验证一下你的登录状态的,那你每次验证登录状态都要去操作数据库,我们都知道计算机在处理数据的时候,都是先从硬盘上取数据然后放到内存里面,内存再给cpu,cpu来进行处理(看下面的图),CPU的处理速度是很快的,就像火箭一样,内存的存取的速度就像高铁的速度一样,而硬盘的读取速度就像普通的汽车一样,而数据库里面的数据都是存在硬盘上的,每次去校验一下账号密码从数据库里面取数据,那效率就很低了。一般session都是存在缓存里面,因为要经常用到,要提升性能,直接把seesion放到内存里面,这样子的话,查的时候直接在内存里面取数据了,就很快了,像一些缓存数据库,redis、memcached这些都是把数据直接存到内存里面的。
为什么要用Session?
在知道Cookie是存在硬盘中的字符串后,如果将存在硬盘中的Cookie盗取,存在登录信息被破解的风险,所以通过Session来避免信息被盗取的风险。
什么是Session?
可以将Session简单的理解为一个对象,这个对象中可以包含很多东西,具体想包含什么是可以由开发人员自定义的。存在服务器中的是一个key,value形式的对象。
Cookie与Session有什么联系?
在WEB应用中,Cookie是可以独立使用的,但是Session必须依赖于Cookie使用,每创建一个Session对象时,都会生成一个唯一的Session_id,它通过Cookie的形式存在浏览器的内存中,随着浏览器关闭则消失,从而保证不留存在硬盘中。
Session的原理是什么?
登录成功后,通过Cookie的形式在浏览器内存中存入一个唯一的Session_id,每一次请求时,都会携带带有Session_id的Cookie信息传到服务器,以Session_id为Key得到唯一的Value信息,则代表发送过来的请求为有效请求。否则为无效请求。