土豆博客

详解Cookies、Session和Token

# 一、概述

Web诞生之初,功能比较单一,基本上就是文档的浏览而已。既然是浏览,作为服务器,不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议,就是请求加响应。并不需要记住是谁刚刚发了HTTP请求,每个请求对服务器来说都是全新的。随着交互式Web应用的兴起,网站有了登录的需求,如在线购物网站,社交网站等等。这就面临很多的问题,比如:

① 服务器必须记住哪些人登录了系统, 哪些人往自己的购物车中添加了商品

② 即使用户没有登录,我也可以根据用户的浏览记录推荐类似的商品

③ 用户登录过系统后,下次再来访问我的网站就不需要再次登录(七天免登陆)

也就是说服务器要识别每个用户,就需要一种机制维护会话状态,这时候Cookie、Session和Token就派上了用场。

# 二、Cookie

访问浏览器的时候,浏览器会发送一个HTTP请求到服务器,服务器会发送一个HTTP响应到客户端,其中包括Set-Cookie,意思就是浏览器建立一个cookie保存服务器指定的内容,比如用户信息和用户操作信息。Cookie有两种保存方式,一种是浏览器会将Cookie保存在内存中,还有一种是保存在客户端的硬盘中。浏览器保存好信息之后,下次我们再次访问网站的时候,浏览器再发送HTTP请求到服务器端时都会携带之前保存的cookie,服务器端会从收到的cookie中识别用户身份,就能让页面为你提供专门属于你的内容了。 3720344365c359860bfdca_articlex.png

2.1 应用场景

① 判断用户是否登录过网站;

② 记录用户使用偏好来制定推送;

③ 保存上次登录的时间等信息。

④ 一段时间内免登陆

⑤ 多个页面之间的数据传递

2.2 不足之处

① cookie存放在客户端,所以是不安全的,人为可以清除。

② cookie有过期时间设定。如果不设置过期时间,说明这个cookie就是当前浏览器的会话时间,浏览器关了,cookie就不存在了。如果有过期时间,cookie就会存储到硬盘上,浏览器关闭不影响cookie。下次打开浏览器,cookie还存在

③ cookie有大小的限制,4KB。

④ 每次访问都要传送cookie给服务器,浪费带宽

# 三、Session

客户端浏览器访问网站的时候,服务器会向客户浏览器发送一个每个用户特有的会话编号sessionID,记录到cookie里。服务器同时也把sessionID和对应的用户信息、用户操作记录在服务器上,这些记录就是session。客户端浏览器再次访问时,会发送cookie给服务器,其中就包含sessionID。服务器从cookie里找到sessionID,再根据sessionID找到以前记录的用户信息就可以知道他之前操控些、访问过哪里。

3.1 为什么需要session

在前面我们说过,cookie的缺陷是放在客户端容易被篡改,很多第三方可以获取到这个Cookie,服务器无法判断Cookie是不是真实用户发送的,所以Cookie可以伪造,伪造Cookie实现登录进行一些HTTP请求,为了解决Cookie的安全隐患,Session机制应运而生。session机制是一种服务器端的机制,它存储在服务器端的,避免了在客户端Cookie中存储敏感数据。Session可以存储在HTTP服务器的内存中,也可以存在内存数据库(如redis)中, 对于重量级的应用甚至可以存储在数据库中。

3.2 应用场景

①保存用户登录信息

②网上商城中的购物车

3.3 不足之处

①因为Session是放在服务器上的,所以Session保存的东西越多,就越占用服务器内存,对于用户在线人数较多的网站,服务器的内 存压力会比较大。

②依赖于cookie(sessionID保存在cookie),如果禁用cookie,则要使用URL重写,不安全

# 四、token

token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名)压缩成一定长的十六进制字符串,基于Token的身份验证的过程如下:

1、客户端向服务器请求,发送用户名和密码 2、服务器根据用户信息通过加密生成token,用户信息包括账号,token过期时间等,具体由服务器自定义。 3、服务器返回token给客户端 4、客户端用cookie存储token,以后的请求都带上这个token 5、服务器把token解密,确认用户信息是否正确,如经过正确就说明验证通过。 6、服务器把验证结果返回客户端

4.1 为什么需要token

那我们既然可以使用session进行身份验证,我们为什么还要选择使用token呢?

基于Token的身份验证是无状态的,不将用户信息存在服务器或Session中,这就解决了在服务端存储信息时的很多问题。

1、session是需要空间进行存储的,如果是多服务器session需要同步信息,但是token在服务器是可以不需要存储用户信息的。

2、token可以使用浏览器的localStorge等,APP也可以使用自带数据库存储字符串。且不会出现cookies出现跨域问题。

3、token可以用JWT来携带部分不太敏感的信息比如用户ID等,服务器只要解密token即可使用部分信息。

3.2 优势

1、支持跨域访问: Cookie是不允许垮域访问的,token支持

2、无状态: token无状态,session有状态的

3、更适用于移动应用: Cookie不支持手机端访问的

4、token可以抵抗CSRF

面试题:Cookie和Session的区别?

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用cookie。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

code
top

扫码添加,一起进步

wechat-code

为了保障最佳预览体验,博客已不支持IE浏览器的访问,邀请您使用以下现代高级浏览器。

谷歌浏览器(推荐) 火狐浏览器

注:如果你使用的是360,QQ等双核浏览器,请开启极速模式