Cookie与Session
Cookie
HTTP是一种不保存状态的协议,也就是无状态协议。Http自身不对请求和响应之间的通信状态做出保存,也就是说在在HTTP这个级别,协议对于发送过的请求和响应都不做出保存。
事实上:由于通常一台服务器会服务于几万个甚至更多的客户(客户端),如果把所有的客户端信息都记录下来,那么会大大增加服务器的压力,HTTP协议是无状态的,也就意味着服务器没法记住某个客户发出的请求和做出的响应,这样的话客户下一次再次请求时,服务器也无法识别这个客户,因此又会做出新的响应。比如登录时,客户明明已经登录过了,但是跳转到网站的其他页面,由于是服务器是无状态的服务器还得请求一次。为了实现期望的保持状态功能,于是引入了cookie技术。
Cookie是保存在客户端的小段文本,随着客户端每一个请求发送该url下的所有cookies到服务器端。
Cookie的详细工作流程如下:
1、第一次请求时,浏览器中是没有cookie信息的。
2、服务器接收到请求后,会首先检查是否存在Cookie,如果没有Cookie,会生成一个Cookie。在响应头中Set-Cookie中生成Cookie信息。生成的Cookie文本中,存在一个sessionId,服务器会记录下来这个sessionId。
3、客户端再次请求时,浏览器会自动将Cookie信息添加到请求头上,服务器接到请求会根据sessionId来判断身份。
Session
Session保存在服务器端(在服务器端生成),通过唯一的sessionId来区别每一个用户。sessionId随每个请求发送到服务器(sessionId实际上是Cookie中的一个字段),Session实际上是一个保存在服务器的数据表,每一个sessionId对应一个用户。通过Cookie获取到SessionId,然后再通过session的key获取session值。
思考:如果不使用Cookie能不能实现维持会话?
仔细分析Cookie的功能,我们使用Cookie最重要的就是保存了一个sessionId然后每次请求时,在请求头中携带过去。如果没有了Cookie,那么我们可以不可以通过其他的手段把这个sessionId发送到服务端,并通过其他手段再吉首这个sessionId。比如我们可以通过在Url后面添加上sessionId,这样的话服务器端也能获取到sessionId,然后 服务端再将sessionId返回回来,客户端再进行保存。这样的话也能够实现类似于Cookie的功能,但是这样不太安全,因为sessionId直接在Url后面是可见的,很容易就被模仿了。也存在一个方法提高安全性,那就是服务器产生一个tooken,每请求一次tooken发生变化,tooken只能使用一次,这样也能提高安全性。