Session和Cookie和Token
Cookie是保存在客户端、Session保存在服务端,两者都是用来校验用户登录状态的。因为http是无状态的,所以客户端每次向服务端发起请求的时候,服务端是不认识客户端的.
session是一种服务器端的对象. 保存在服务器中. 每个session有一个唯一的sessionid.
cookie是存储在浏览器客户端的一小段文本, 用来记录用户信息的.
Cookie:
cookies的作用主要是,当你访问了某些网页,并且对网页的一些设置进行修改,cookies就能跟踪并记录到这些修改,当你下一次访问这个网页的时候,这个网页会分析你电脑上的cookies,进而采取措施像你返回更符合你个性化的网页;
当然,目前大部分广告的定位基础也是基于cookies的,比如你此前访问了大量的健身类网站,cookies记录了你的访问行为,广告主就能够根据你的访问行为,向你推送健身类的广告。
“是否让浏览器记住你的密码?”这句话你是否还记得,我们在浏览器首次登陆某个网站的时候,就会弹出该提示,提醒我们保存账号密码,下次访问就不再需要输入账号密码了,这是Cookie的作用之一,但保存在计算机中的Cookie信息是一个比较私密的内容,既然是放在本地的Cookie内容,那就有可能被有心者一探究竟。让我们一起来深度解析的Cookie的作用和弊端。
浏览器中的Cookie
当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。如果你清理了Cookie,那么你曾登录过的网站就没有你的修改过的相关信息。Cookie是非常常见的, 基本上你的浏览器中都会存储了成百上千条Cookie信息。
浏览器能够自动存储并管理Cookie。你可以在浏览器的设置中找到一大串的网站存储下来的Cookie以及查看这些Cookie。不过查看这些Cookie并不是什么有趣的事情。如果你的系统装有多个浏览器的话,那么每个浏览器都有着自己的Cookie。一个网站只能够读取属于自己网站的Cookie。举个例子来讲,当你访问IT之家时,我们是不能够检测到其它网站的Cookie的,这可以防止恶意网站窥探以及窃取你的登陆信息。
Cookie的好处
如果没有Cookie的存在,网络对于我们来说不会如此便捷。它存储着你的网站登录信息,如果没有他们,你将不能够登陆网站。网站通过Cookie信息来记忆以及辨认你的帐号,它可以记忆你的偏好设置。它还可以使网站提供个性化的内容,举个例子,如果你在淘宝上购物,淘宝可以记忆你所查看过的产品并据此来向你来推荐商品,即便你没有登陆个人帐号。
Cookie的坏处
伴随着互联网巨大商机的出现,Cookie也从一项服务性工具变成了一个可以带来巨大财富的工具。部分站点利用Cookie收集大量用户信息,并将这些信息转手卖给其他有商业目的的站点或组织,如网络广告商等,从中牟利。使用Cookie技术,您在浏览Web站点时,不论是否愿意,您的每一个X作都有可能被记录下来,在毫无防备的情况下,您正在浏览的网站地址、使用的计算机的软硬件配置,甚至您的名字、电子邮件地址都有可能被收集并转手出售。随着互联网的商业化发展,该问题越来越严重,个人隐私的泄露所带来的并不单纯是一些垃圾邮件,一旦个人资料被滥用,信用卡密码被盗,后果不堪设想。也正因为如此,有关Cookie的争论从未停止过,用户对Cookie的态度也是爱恨交加。
只要某个浏览器访问了某个网站(服务器), 该服务器就会为这个浏览器创建唯一的sessionid. 并将其传给浏览器客户端, 浏览器将其存放在客户端cookie中. (注意是只要访问, 就会有session 和 cookie , 并不是必须要登录, 即: 访问了就会有,登录只是验证身份 )
每打开一个浏览器, 这个浏览器就被标注为一个唯一的客户端. 当这个客户端第一次向某个服务器发送请求后, 服务器会自动生成对应这个客户端的session. 并把它的sessionid通过响应response返回(response.headers 中"Set-Cookie": Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]), 然后客户端会将sessionid 作为cookie的一个字段储存在客户端cookie中. 第二次客户端请求该服务器就会将cookie放在请求头中,cookie中有sessionid ( 注意: 第一次请求时,请求头headers中是没有cookie的 ) . 然后服务器就会根据该sessionid找到服务器对应的session. 进而可以知道 用户以前是登录过的 或者 以前是访问过的.
如: 打开浏览器访问网站A并登录(注意这里已登录)了, 当关闭浏览器客户端后, 再次重启浏览器客户端, 上一次访问服务器的sessionid仍然储存在服务器上, 但当重启客户端后再次访问服务器(未登录). 此时服务器会生成新的sessionid, 进而客户端会根据该sessionid生成新的cookie. 而在客户端再次访问时的请求头中的cookie就会包含新的sessionid. 所以虽然原来的session还存在服务器中, 但已经登录的信息却存储在原来的cookie中. 新的sessionid不含有的登录信息, 该客户端会被判断为未登录的状态.
其实服务器是不会知道浏览器关闭了没有, 所以关闭浏览器时服务器是不会删除session的.也正是这个原因服务器才会设置一个session失效时间的.
等距离上一次使用该session的时间达到设置的失效时间时, 服务器就会认为客户端已停止活动.便会将相应的session删除.
会话cookie 是一种临时的cookie,它记录了用户访问站点时的设置和偏好,关闭浏览器,会话cookie就被删除了
持久化cookie:存储在硬盘上,不同的操作系统,不同的浏览器存储的位置不一样,不管浏览器退出,或电脑重启,持久cookie都存在。持久cookie有过期时间。
对于会话cookie, 关闭一个浏览器, cookie就会消失, 储存在cookie中的sessionid也会消失. 重启浏览器访问服务器会产生新的sessionid和cookie.
当然,我们可以在登陆时点击下次自动登录. 比如说CSDN"记住我一周", 或者我们的购物车信息可以在切换不同的浏览器时依然可用. 这就要用到我们上文提到的另一种cookie了----->硬盘中cookie, 这时sessionid 将长期保存在硬盘上的cookie中, 直到失效为止.
Token:
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后(需要登录),服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这Token前来请求数据即可,无需再次带上用户名和密码。
Token出现的背景:
随着网站的用户越来越多, 网站需要记录的session越来越多, 很占地方, 用户频繁向客户端请求数据,服务端频繁查session对比, 造成服务器压力. 加上服务器都在做一个分布式的处理. 如果在一台服务器A上存储了用户的session, 而在另一台服务器B上没有存储. 用户登录时, 因为负载均衡, 将用户分到了服务器B上, 那服务器B上就没有记录用户登录的状态. 为了解决这个弊端, 就产生了Token. Token一般使用md5 或这 sha1, 将我们的密钥,公钥,时间戳等信息经过一定的算法, 给它加密成一个字符串(通常采用base64编码). 服务器将该字符串返回给我们的客户端. 服务器本身不保存这个东西. 客户端拿到token后,下次请求服务端时 会将token放在headers中的Authorization + Cookie 发送给服务端. 服务端根据我们的cookie生成一个token,并与客户端的token对比. 进而判断出用户是否是一个已登录的状态.
token的优势:
1. 它不需要在服务端存储. 大大降低了服务器的负担. 它可以保存在客户端的任意位置, 如cookie中, localstorage, sessionstorage 服务端只需要存储一种计算token的算法, 来与客户端进行比对就ok了.
2. token可以跨域传输
3. token可以有效避免session劫持
缺点:
token需要存储在浏览器中, 可能会被恶意攻击者窃取. 如果token泄露或者被盗用, 安全隐患较大.
session的优势:
session实现简单,易于上手.
session可以存储大量的用户信息,为商城等业务场景提供了大量便利
缺点:
session需要存储在服务器上, 占用服务器cpu和内存.
session只适用于同一域名的访问, 不适用于跨域访问
session容易被恶意攻击者窃取.