为什么会有cookie?
因为http是一种无状态协议,也就是说每次连接之后就不会记住上一次连接。而Cookie就像是服务器给每个来访问的用户贴的标签,而这些标签就是对来访问的客户端的独有的身份的一个标识,这里就如同每个人的身份证一样,带着你的个人信息。而所以Cookie是存在客户端的,这里其实就是在你的浏览器中。每个cookie的大小为最多4K,
无状态的原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。
cookie是用来做什么的?
cookie机制采用的是在客户端保持状态。当一个客户端第一次连接过来的时候,服务端就会给他打一个标签,这里就如同给你发了一个身份证,当你下次带着这个身份证来的时候,服务器就知道你是谁了。
实现状态保持主要有两种方式:
1.在客户端存储信息使用Cookie 2.在服务器端存储信息使用Session
cookie的种类:
会话Cookie:不设置过期时间,保存在浏览器的内存中,关闭浏览器,Cookie便被销毁
普通Cookie:设置了过期时间,保存在硬盘上
Cookie的主要内容包括:
名字,值,过期时间,路径和域
cookie是不能进行跨域的
什么是session?
称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。
Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
session是用来做什么的?
通过服务器来保持状态的。session的原理:
基本原理是服务端为每一个session维护一份会话信息数据,而客户端和服务端依靠一个全局唯一的标识来访问会话信息数据。用户访问web应用时,服务端程序决定何时创建session。
创建session的步骤:
- 生成全局唯一标识符(sessionid);
- 开辟数据存储空间。一般会在内存中创建相应的数据结构,但这种情况下,系统一旦掉电,所有的会话数据就会丢失,如果是电子商务网站,这种事故会造成严重的后果。不过也可以写到文件里甚至存储在数据库中,这样虽然会增加I/O开销,但session可以实现某种程度的持久化,而且更有利于session的共享;
- 将session的全局唯一标示符发送给客户端。
cookie和session的区别:
cookie保存在客户端浏览器中,而Session保存在服务器上。
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用cookie;
为什么session可以状态保持还需要cookie?
虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。
cookie和session是否可以同时使用?
Session是服务端支持 cookie是客户端支持 一般情况下两个都能使用的 除非你禁用Session使用就跟一般的数组变量赋值读取差不多($_SESSION[xxx]) 前提是Session开启
cookie的读取就跟一般的数组变量一样($_COOKIE[xxx]) 设置使用setcookie函数
session和cookie使http变为有状态的
基于session认证的缺点:
1.session是存储在服务器端的内存,每次经过一次认证之后,都要在服务端做一次记录,以方便用户下次请求的鉴别,如果认证永辉增加,服务器的开销会很大。
2.用户认证以后,服务端做认证记录,下次请求必须要在这台这台服务器上请求,才能拿到授权资源,这样在分布式的应用中,相应的限制了负载均衡器的能力,也就限制了应用的扩展能力。
3.CSRF因为基于cookie来进行用户识别的,cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。