cookie是Web服务器识别客户端的一种方法,一个服务器可能会同时与数千个不同的客户端进行对话,识别不同客户端是非常有必要的,常见的使用场合如网站去识别不同用户,给予不同反馈(如广告的相关推荐,个性化问候,信息管理等)。
cookie大致分为两种:会话cookie和持久cookie。会话cookie生存周期是一次会话过程,当用户退出浏览器时,会话cookie就会被删除。持久cookie的生存周期取决于设置的时间,它们被存储在硬盘上,用户退出浏览器它们不会消失。
用户首次访问Web站点时,服务器会在响应首部里加入Set-Cookie属性来标识客户端,格式如下:
cookie名-值键值对是强制规定必须设置的,其他属性可选,中间由分号隔开。注意一个Set-Cookie字段只能设置一个cookie,设置多个 cookie,需要添加多个的Set-Cookie字段。
客户端获取到cookie后,会将其存储在浏览器的cookie数据库中,再次访问时会在请求首部里添加Cookie字段,将保存的cookie发送给服务器端,这样服务器就能识别出客户端了。cookie的基本思想就是让浏览器积累一组服务器特有的信息,每次访问服务器时都将这些信息提供给它。cookie经常被滥用当做存储工具,由于前端也可以用js来设置cookie,一些不需要被发送到服务器端的数据也会被存储在cookie中发送过去,这无疑增大了网络开销。cookie的本质作用是让服务器识别客户端,我们经常拿cookie跟session作比较,其实Session机制本身就可以通过cookie来实现。
Session是存放在服务器端的类似于HashTable的数据结构,用来存放用户数据,当浏览器第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。一般情况下,服务器会在一定时间内(默认20分钟)保存这个HashTable,过了时间限制,就会销毁这个HashTable。在销毁之前,程序员可以 将用户的一些数据以键值对的形式暂时存放在这个HashTable中。
我们通常用以下两种方式来保存 Session ID:
[1] 使用Cookie来保存,这是最常见的方法。服务器通过设置Cookie的方式将Session ID发送到浏览器。
[2] 使用URL附加信息的方式(当cookie被禁止时可以采取这种方式)
下面我们来分析一下保存用户登录状态的Session实现方法,用户首次访问网站时需要在登录页面进行登录,登录后跳转到网站首页,关闭浏览器后再次访问网站,不需要进行登录,可直接访问首页。首先分析一下逻辑,首次访问网站时,请求首部是没有Cookie字段的,服务器找不到Session ID,要通知浏览器跳转到登录页面,同时生成HashTable和Session ID,在响应首部里的Set-Cookie字段加入Session ID返回给客户端。用户再次访问该网站时请求首部里有了Cookie字段,包含Session ID,服务器端提取出Session ID,查找到对应的HashTable,即找到Session ID则判断为已登录状态。前面我们说到,HashTable的默认保存时间为20分钟,也就是说,过了20分钟我们就无法保存登录状态了。现在通用的解决办法是,将用户的用户名和加密之后的密码也通过Cookie的方式存放在客户端,当服务器上的Session销毁以后,使用Cookie里面存放的用户名和加密之后的密码重新执行一次登录操作,重建Session,并更新客户端上Cookie中存放的的Session ID。需要注意的是,虽然在前端也能通过cookie来判断登录状态,但任何前端的验证都是不可靠的,判断状态还是要通过后端来实现。
参考:https://segmentfault.com/a/1190000004556040
https://www.cnblogs.com/xlh-2014/p/8110685.html