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容易被恶意攻击者窃取. 

 

 

 

 

 
posted @ 2023-08-08 22:01  Avicii_2018  阅读(48)  评论(0编辑  收藏  举报