前言
cookie存在于客户端(浏览器),session存在于服务端。session的主要信息存在于服务器,在客户端只存放一个sessionid(基于cookie的),每次请求,客户端都会自动把sessionid发送到服务端去(因为是通过cookie保存的sessionid,每次发送请求,客户端会自动发送cookie到服务端),服务端根据sessionid去session里获取信息,做相应的操作。
cookie机制
web应用程序是使用HTTP协议来传送数据的。而HTTP是无状态的协议。所以一旦HTTP报文交换完成,客户端和服务器端就会谁也不认识谁了,这意味着服务器无法从连接上跟踪会话。即当用户A购买了一件商品并放入购物车中,当再次购买该商品时,服务器已经无法判断是哪个用户的会话了,所以才必须引入一种机制用于跟踪会话。
cookie就是这样的一种机制。因为HTTP是无状态的,服务器是无法单单仅凭网络连接是无法知道客户身份的。所以这个时候服务器就会给客户端发一个通行证,每个客户端一个,无论谁访问都必须携带自己的通行证,这样服务器就能从通行证上确认客户的身份。
而这样的通行证,也就是cookie,实际上是一小段文本信息。当客户端请求服务器后,如果服务器需要记录该用户状态,就会使用response回复报文向客户端颁发一个通行证cookie。而客户端收到cookie后会将cookie保存起来,当浏览器再次请求该网页时,浏览器会连同cookie一同交给服务器。服务器检查该cookie,以此辨认用户状态。
查看某个网页颁发的cookie很简单,在浏览器地址处输入javascript:alert(document.cookie)就可以了
如果浏览器不支持浏览器cookie就会被ban掉,比如大部分手机浏览器就不支持。
不同的浏览器会采用不同的方式保存cookie,比如ie浏览器会在“C:\Documents and Settings\你的用户名\Cookies”文件夹下以文本文件形式保存,一个cookie保存一个文件。
- cookie是不可跨域名的。
- cookie的有效期:cookie的maxage决定着cookie的有效期,单位为秒。cookie通过getMaxAge()和setMaxAge(int maxAge)方法来读写maxAge属性。MaxAge属性为正数时,表示该cookie会在MaxAge秒后自动失效。浏览器会将MaxAge为正数的cookie持久化,写到对应的cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒内,登录该网站时该cookie仍然有效。但是MaxAge为负数时,则表示该cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该cookie失效。这样的cookie也会被视作临时cookie,不会被浏览器持久化存储,不会写到cookie文件中。cookie信息保存在浏览器内存中,因此关闭了浏览器后该cookie就消失了。而如果MaxAge为0,则表示删除该cookie。
Session机制
Session是另一种记录客户状态的机制,不同的是cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是session。当客户端浏览器再次访问时只需要从该session中查找客户的状态就可以了。
如果说cookie机制是通过检查客户身上的通行证
来确定客户身份的话,那session机制就是通过检查服务器上的客户明细表
来确认客户身份的。session相当于程序在服务器上建立的一份客户档案,客户来访时只需要查询客户档案就可以了。
- session的生命周期:session保存在服务器端,而为了尽可能提升存取速度,服务器一般把cookie放在内存里。每一个用户都会有独立的session,而如果session内容过于复杂,当大量客户访问服务器时可能导致内存溢出所以其内容要尽可能精简。session在第一次访问服务器的时候创建。session生成后,只要用户继续访问,服务器就会更新session最后的访问时间,并维护该session。
- session的有效期:为防止内存溢出,服务器会把长时间都没有活跃的session删除。这个时间就是session的超时时间,如果超过时间没有访问服务器,session就自动失效了。
- session对cookie的使用:session虽然保存在服务器上,但是其正常运行还是需要客户端浏览器的支持。因为session需要使用cookie作为识别标志。Session在运作时会向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该session的id。session就依据该cookie来识别是否为同一用户。该cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器有效,并且个浏览器窗口之间不共享。
- URL地址重写:有些浏览器是不支持cookie的。这个时候就需要用到URL地址重写,其原理是将该用户session的id重写到url地址中。服务器能够解析重写后的URL获取session的id。在文件名的后面,在URL参数的前面添加了字符串“;jsessionid=XXX”。增添的jsessionid字符串既不会影响请求的文件名,也不会影响提交的地址栏参数。
session和cookie的区别
- cookie数据存放在客户端的浏览器上,session数据 放在服务器上。
- cookie比session更不安全,别人可以分析存放在本地的cookie并进行cookie欺骗。(可考虑对cookie加密)
- session会在一定时间内保存在服务器上。当访问增多时,会比较占用服务器的内容,考虑到减轻服务器负担,可以考虑使用cookie
- 单个cookie保存的数据不能超过4K,浏览器都限制一个站点最多保存20个cookie。session没有这种限制。
token机制
token也称为令牌,是服务器生成的一串字符串,作为客户端进行请求的一个标识。
当用户第一次登录后,服务器会生成一个token并将此token返回给客户端,以后客户端只需带上这个token请求数据即可,无需再次带上用户名和密码。(听起来跟cookie有点像,但是跟cookie是由很大区别的,且听我娓娓道来)
简单token的组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成一定长度的十六进制字符串,以防止token泄露)
cookie和token的区别
- token存在哪儿都行,客户端可存放在localstorage或者cookie,而服务器端则会存放于数据库(服务器端的session是直接放在内存中的)
- cookie举例:服务员看你的身份证后,给你一个编号,以后,进行任何操作,都出示编号,然后服务员再去查看你是谁
- token举例:直接给服务员看自己的身份证
- 对于token而言,服务器不需要去查看你是谁,是无状态的,而cookie则是相对有状态的。
- token的可拓展性更强。
- token可抵御csrf,因为cookie容易伪造,但是token是不容易伪造的。
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取