Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

session和cookie 的区别 #4

Open
sunyongjian opened this issue Nov 30, 2016 · 0 comments
Open

session和cookie 的区别 #4

sunyongjian opened this issue Nov 30, 2016 · 0 comments
Labels

Comments

@sunyongjian
Copy link
Owner

大概的比较一下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。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant