[warning] 通过与一些做测试的朋友交流,发现有一些工作了好几年的朋友,都并不了解Session与Cookie,这里,我用两个例子来给朋友们好好分析分析!
Session和Cookie相关概念实例演示:以Cookie记录用户状态实例演示:以Session记录用户状态Session和Cookie相关概念
Session和Cookie都是由服务器生成的。
Session和Cookie都是键值对形式保存,主要用于存储特定的一些状态值。
Session保存在服务器,Cookie保存在客户端。通常来说,Session的ID会以Cookie的形式返回给客户端的。
Session和Cookie都是有生命周期的。Cookie的生命周期受到Cookie自身的有效期和客户端的影响,一般来说,浏览器(客户端)是会自动将存活的Cookie封装在请求头里面,向服务器发送。如果Cookie有效期过期或客户端清理了Cookie,则发送的请求中就没有Cookie值;Session的生命周期受到Session自身的有效期和客户端是否关闭的影响。SessionID虽然是已Cookie的形式返回给客户端,但是它是不受客户的Cookie容器的管理,而是和客户端进程有关,即客户端进程不关闭,一般Session在客户端就不会失效。
Session和Cookie都是有作用域的。
[info]下面我会自己写一个例子来演示 看不懂相关代码的,可以留意一下我关于django方面的教程
实例演示:以Cookie记录用户状态
创建一个登陆与欢迎页面 ,页面逻辑如下:
代码解释:
如果用户已登录,则显示“欢迎您,xx”,并且提供注销按钮;
如果用户未登录,则显示一个登录窗口,让用户输入用户名与密码。
服务端代码逻辑如下:
代码解释:
如果是POST方式访问,从提交过来的数据中验证用户是否登录成功,登录成功便,并且返回给客户端,进入欢迎页。
如果是GET方式访问,则,如果从cookie中能获取到用户名,则认为用户已登录,返回欢迎页。
step1:首次访问http://127.0.0.1:8000/login_cookie/ 可以观察到 Request headers 中没有Cookie,页面处于未登录状态
step2:登录后(输入账号名ptqa,密码4399)自动跳转首页,此时可以观察到,在Response Headers 中存在Set-Cookie:username=ptqa; Path=/
从这里,我们也可以看见,cookie是在服务端设置的。这时候,客户端接收到服务端设置的cookie后,会保存在浏览器的cookie管理器中,下一次再请求时会自动带上这些cookie,服务端便会知道当前的用户是已经通过了登录校验的用户。如此这般,便能维持了会话的状态了。
step3:此时,刷新页面或新开窗口访问http://127.0.0.1:8000/login_cookie/ 可观察到请求中的Request Headers 中自动带上 Cookie:username=ptqa; 页面处于已登录状态。
总结:
显然,通过cookie的方式验证用户登录容易被破解,如下使用jmeter篡改Cookie值,则同样可以进入已登录状态显示界面,如下
发送请求后,可以看到,用户已经登录了。
实例演示:以Session记录用户状态
前端登录与欢迎页 逻辑如下:
代码解释:
如果用户已登录,则显示“欢迎您,xx”,并且提供注销按钮;
如果用户未登录,则显示一个登录窗口,让用户输入用户名与密码。
服务端的处理逻辑如下:
代码解释:
如果是POST方式访问,从提交过来的数据中验证用户是否登录成功,登录成功便,并且返回给客户端,进入欢迎页。
如果是GET方式访问,则,如果从Session中能获取到用户名,则认为用户已登录,返回欢迎页。
step1:首次访问http://127.0.0.1:8000/login_session/ 可观察到Request Headers 中并没有sessionId 并且处于未登录状态
step2:登录,输入账号ptqa,密码4399 ,在Response Headers 中可以观察到存在 Set-Cookie:sessionid=qigvbt2ckkcc5rydr46dehzjryg0mh41;
step3:重新刷新页面或新开窗口,则观察到在Request Headers 中带有Cookie Sessionid,并且处于登录状态。
显然,这种使用sessonid的方式比较安全,如果篡改sessionid,则无法进行登录。如下:
发送请求后,sessionid在服务端验证并不存在,所以依然是未登录的状态。
[info] 本人非专业开发,正在学习的路上,参考代码只供参考,写得不好,请不要见笑,将你写的认为更好的示例留言哦,一起交流学习~
领取专属 10元无门槛券
私享最新 技术干货