cookie 也好 session也罢 最怕的则是已经登录的用户被非法者伪造。
所以如果从安全角度讲 他俩的本质区别就是session会定期清缓存吧,保证cookie时效性有限,相对安全性高那么一丢丢,其实本质上还是没太大区别。
如果从存储方式上讲二者的区别则是 一个在客户端一个在服务端 其实这一点 也是有些不准确的 因为cookie和session 他们用来确定唯一客户端用户身份的cookie 至少都会存一份在客户端(这点二者相同) ,要是说非要说存储方式不同,更多是讲除确定唯一身份cookie以外的那些key和val的对应的信息吧,这些信息的cookie存储在客户端,而这些信息的session存储在服务端 一般放在缓存中。
cookie安全问题
再就讲下安全性问题,此处说不安全主要讲对于xss攻击和中间人攻击层面,原理嘛,前者为脚本对浏览器中的cookie有查询和更改权限造成的;后者是因为只要消息要在网络中传输就有被中间人篡改和查看的可能。有人说session比cookie 安全,如果针对此类安全威胁,其实也就那么回事儿吧 session和cookie差别不大(除非不法者盯着屏幕里浏览器cookie看,那确实session安全一丢丢,前提还得在cookie中其他字段存了敏感信息情况下,所以二者安全性差别真不太大 我觉得开始引用session的原因更多是因为时效和在内存中可存储更全面的用户会话信息吧安全性只是一小方面 当然时效性从时间可以演变出一切的角度也会对安全有些帮助) 要说安全性区别不大,主要是因为二者都要依赖用来确认唯一身份的cookie,此类安全主要还是要看影响该cookie安全要素的控制,即该唯一确认用户的存储和传输是否安全。
cookie 安全参数
假如cookie 的httpOnly 和 secure 两个参数都设置为 true 那么此时 其实cookie 已经很安全了 同样session也就安全了,为何呢
- httponly 设置为true时 则表示 服务端给客户端设置的该cookie ,只有服务端response headers中的setcCookie可以对其进行再设置,而对于查看,也只有客户端向服务端发出请求时,该cookie才会被查看并发送给服务端。即此参数表示脚本无法对被设置为true的cookie key进行查看或操作,也就是cookie存储在客户端也是安全的了,当然你要说像前面说的非法者直接盯着客户端屏幕来看,这个没办法了,这是线下问题,线上无解。
- secure 设置为true 时 则表示cookie要在https环境下被加密传输,才可以,否则比如通过http协议直接传输,会被判断为不安全,从而不对cookie进行传输。
即secure 为true时 首先会在http的数据传输给tcp前,检查ssl会话是否建立成功,是否可提供安全的传输环境来传输cookie 如果没有 那不好意思 cookie数据不会被直接交给 tcp协议,如果ssl 会话建立成功,那么此时会拿着服务端的公钥进行对cookie数据的加密,并加盖客户端私钥签章,交给网络层tcp协议进行传输,经过链路层 最后当到达服务端tcp协议层时,ssl会话再把数据通过客户端公钥验证,验证通过后再通过服务端私钥解密,最后获得cookie数据,再将cookie数据交给应用层http协议,http交给服务器,服务器交给应用,去进行校验及逻辑处理,根据判断及处理结果,返回最终html数据,再附加http相关信息交给HTTP协议,http往底层交最后发给客户端。