session, cookie, token 的应用以及发展历程

【导语】:计算机的技术日新月异,计算机的世界危机四伏......随着科技的发展,人类的进步,前端在网络安全方面,也日益发挥着它不可忽视的作用。

今天我们就一起看一看在Web 交互发展史上,对客户端记录发展的一些问题和解决办法,以及 token 在安全方面所发挥的一定的作用。

Token 在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系统使用。其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。

 

其实,在Web交互兴起之前,Web网页只有文档的浏览,不需要记录是谁干了什么。后来,随着电商等类型网站的崛起,记录用户行为的意义就变得尤为重要。

由于http是无状态的会话,所以我们需要一个东西来记录。目前我们用到的主要有三种:session,cookie 和 token

 

1. session:

在服务器端记录,每一个会话会产生一个sessionId。当用户打开某个web应用时,便与web服务器产生一次session。服务器使用 sessionId 把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这样服务器就会根据每个人sessionId的不同,区别开谁是谁了,从而返回给用户不同的请求结果。

缺点:

如果使用单个服务器的话,用户过多的话,会造成服务器开销太大。如果我们系统采用分布式的话,我们登录时,响应我们的那台机器会记录我们登录信息,万一下一个请求,响应我们的不是原来那台机器的话,它并没有存储我们之前会话信息,就会认为我们并没有登录。session粘连或者session复制都不是特别好的方案。

 

那既然服务端存储这些 SessionId 这么麻烦,人类又想出一招,那就是把这些SessionId 都存储在客户端。这个时候,cookie运用而生......

 

2. cookie:

cookie是服务端保存在客户端的临时的少量的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

 

但是,cookie 这种方式很容易被恶意攻击者入侵,那么又怎么验证客户端发给我的session id 的确是我生成的呢?  如果不去验证,服务器都不知道他们是不是合法登录的用户, 那些不怀好意的家伙们就可以伪造session id , 为所欲为了。这就需要我们用一种加密的方法或者可以说暗号,来验证这个id是否由我自己的服务器之前生成而非恶意攻击者篡改的。

说到这里,就不得不提一下 CSRF 跨站点请求伪造(Cross—Site Request Forgery)

------------------------------

举个简单的栗子:

1. 小明下班回家,打开电脑浏览器,点开了某购物商城,输入自己用户名和密码请求登录该网站;
2. 就在当小明用户信息通过验证后,该商城产生Cookie信息并返回给浏览器,此时小明在这个购物商城登录成功,兴奋地点开商品详情,添加购物车,。。。。;
3. 在小明还未退出这个购物商城之前,他在同一浏览器中,打开一个TAB页访问网站B;
4. 网站B接收到小明请求后,给他返回一些攻击性代码,并发出一个请求要求访问他刚刚浏览的网站;
5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在小明不知情的情况下携带Cookie信息,向该购物商城发出请求。但是该购物商城并不知道该请求其实是由B发起的,所以会根据小明的Cookie信息      以小明的权限处理该请求,导致来自网站B的恶意代码被执行。

(啰嗦这么多,其实说白了就是利用他人某些特征,冒充他人,但这些特征不能被购物商城所鉴别是不是冒充的)

 目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。

--------------------------------

3. token:  

1、Token的定义:Token是服务端生成的一串字符串,当作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token并将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

     (就类似于你第一次去白马会所办了会员卡,第二次去了直接拿着会员卡就好了,不需要再去登记预约了,别人去了冒充你的名字,但是他拿着假的会员卡,一刷就能看出他是个冒牌货。。。)

 

2、使用Token的目的:

      (1). Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

      (2). 使得验证更加安全,一定程度上弥补了cookie的不足。

 

3.  Token 实现流程:

服务端收到请求,去验证用户名与密码
验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
客户端收到 Token 以后可以把它存储起来,放到sessionStorage中
客户端每次向服务端请求资源的时候需要带着服务端签发的 Token,(可以放在axios拦截器中)
服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

 

posted @ 2019-10-18 16:50  牧羊狼  阅读(519)  评论(0编辑  收藏  举报