-
Notifications
You must be signed in to change notification settings - Fork 54
Description
大概的比较一下session和cookie 的区别,不涉及深入的原理。
cookie
-
首先,http是无状态的协议,客户每次读取web页面的时候,服务器都打开新的会话,服务器也不会自动维护客户的上下文信息,要实现辨别用户身份,就用到了cookie
-
当我们填好用户密码登录的时候,会向服务器发送一个请求,服务器验证用户通过后,就会给客户端返回一个响应头'Set-Cookie' ,从而使客户在之后的请求,请求头中都有用户信息的cookie,服务器拿到请求头中的cookie,验证正确以及是否过期,来决定是否允许访问。这种会话cookie,是保存在内存中的,也就是当浏览器程序关闭以后,内存消失,cookie也就不存在了。还有一种像chrome带有保存密码的功能,是将cookie信息保存在客户端硬盘中,使得我们下次打开浏览器还可以保持用户登录状态。
-
cookie的内容主要包括:名字,值,过期时间,路径和域, 所以不在作用范围内的(路径或者domain域名) ,cookie不会生效,同样过期时间后,cookie也会消失
-
一个domain下最多保持20条cookie,每条cookie的不超过4k
session
-
session是一种服务器端的信息管理机制,将各种信息以文件的形式保存在服务器的硬盘中。但是为了与客户端交流,知道当前客户端访问是否有权限,这种服务器端保持状态的方案在客户端也需要一个标识辨别用户,就要用到cookie。通过在cookie添加session_id,来辨别是谁访问的。当客户端第一次向服务器发出请求,客户端会先检查一下,客户端的cookie里有没有session——id ,如果没有就会新创建一个。如果第二次请求有这个id,就会从存放的数据里检索对应的sessionid,匹配从而响应对应的页面或者数据。但是由于这个sessionid也是依赖cookie的,存在于客户端内存中,也就是当浏览器关闭,cookie消失,这个sessionid也就不存在了。再次访问,服务器就会认为没有,还会再创建一个sessionid。
当然这个sessionid 也可以保存在客户端硬盘中,从而保证下次打开浏览器,还拥有sessionid保持访问状态。 -
另外当浏览器 禁止cookie后,服务器端的做法是重定向url ,在url后面拼接一个 sessionid=xxxxxxx,从而保持了解客户端的状态。
两者的比较,关系
- 首先最简单明了的是 ,cookie是存放在客户端 ,浏览器中的,session是将信息存放在服务器中的。
- cookie容易被劫持,在客户端存放的cookie 信息就会泄露,容易修改cookie造成cookie欺骗。而session就安全一些,首先这个sessionid 的值通常是打开浏览器第一次请求服务器端得到的,不知道具体访问时间,就无从劫持。关闭浏览器的第二次访问,sessionid已经修改。再次 ,sessionid 是通过秘钥,使用md5或者其他加密算法加密,也不容易破解。当考虑到安全性的时候应该使用session
- 两者不是对立的,不能具体说哪个好,而是共同作用。通常一些不重要小巧的信息,都放在cookie中,登陆信息等重要信息使用session。 都是用session,请求过多的话,会加重服务器的负担,考虑减轻服务器压力,结合使用cookie。