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,如果验证成功,就向客户端返回请求的数据
作者:牧羊狼
出处:https://www.cnblogs.com/edwardwzw/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利,谢谢您的配合。
Freedom is not let you do whatever you wanna but teach you not to do the things that you donnot wanna do.