Cookie、session与token
生活中的场景
当用浏览器浏览过某个网站的的东西后,比如某宝的商品,在之后的时间再次打开浏览器,页面上会出现之前浏览过的相似商品的信息。这是什么原因呢?这是因为本地计算机内还保留着之前登录网站所留下的cookie信息。初次登录网站时,服务器会将一部分内容(比如你所输入的信息)存放在本地计算机内。当登录同一网站时,web服务器会检查是否还有上次留下的cookie资料,有则按照资料里的内容判断推送特定的内容给你。
cookie
是什么?
一小段文本信息。主要包括名字、值、过期时间、路径(Path)和域(domain)。其中路径和域 构成cookie的作用范围。
工作原理
客户端访问服务器,如果服务器认为需要记录客户状态,会通过response向客户端浏览器颁发一个cookie。客户端将其保存起来。当浏览器再次访问同一网站时,浏览器将请求网址与该cookie一同交给服务器。服务器会检查该cookie,以辨认用户状态。还可以根据需要更该内容。
分类
持久cookie:设置了过期时间,浏览器会将cookie保存在硬盘上。关闭后再次登录仍然有效知道过期时间结束。可在浏览器不同进程间共享
会话cookie:没有设置过期事件,存在内存里,关闭浏览器窗口就会消失。
session
是什么?
记录客户状态的机制。客户端浏览器访问服务器时,服务器将客户信息以某种形式记录在服务器上。客户再次访问时,服务器从session中检查该客户状态就可以了。
工作原理
当客户请求创建一个session时,服务器会先检查客户端请求里是否已经包含sessionid,若是有的话,则将该sessionid检索出来(检索不到,新建一个),不包含sessionid,则新建一个会话,并建立一个与之关联的sessionid。这个sessionid将在本次响应中返回给客户端保存。
在客户请求时,通过cookie将sessionid传送到服务器。服务器通过sessionid作为key,可以读取到相应的信息,从而达到保持会话的目的。
禁用cookie
实现session的方法不依赖cookie
URL重写:将sessionid值附加在URL路径后面
表单隐藏字段:浏览器自动修改表单,添加隐藏字段,在表单提交时将sessionid传给服务器。
sesson共享
不同网站之间sessionid共享问题---修改cookie的域名为父域名达到cookie共享,实现sessionid的共享。但子站的cookie信息也被共享了。
cookie与session区别
cookie在客户端存放,session在服务器端。
cookie易泄漏,不安全,可以cookie欺诈
session会在一定时间保留在服务器上,访问增多,增加量服务器资源消耗。
单个cookie数据不能超过4K,一般最多保存20个。
重要信息(登录信息等)保存在session,其他cookie
token
概念
服务端生成的一个字符串,作为客户端请求到一个令牌。当第一次登录时,服务器生成一个一个token并返回给客户端。以后客户端只需带上token即可。无需用户名和密码。
意义
客户端频繁的请求,而服务器需要不断去数据库检验信息,并做出回应,带来了巨大的压力,使用token就可以减少数据库访问次数,服务器更健壮。
实现方式
使用设备号/设备mac地址作为token(推荐)
缺点:客户端需要携带设备号等信息,服务端需要保存
优点:客户端不需要重新登录。
token超时时,服务器将客户端传递的token向数据库查询,赋值给变量token,重新计时。
解决重复提交问题
session与token并用,同一用户的多次请求,验证每次请求的token是否一致,不一致认为重复提交。
使用sessionid作为token
优点:方便,不用存储数据。
缺点:session过期后,客户端需要重新登录。解决办法:过滤器拦截请求,获取token,每次请求重置有效期。