详细了解 Cookie Session Token

发展史

很久很久以前,Web基本上就是文档的浏览而已,既然是浏览,作为服务器、不需要记录谁在某一段时间里都浏览了什么文档。

每次请求都是一个新的HTTP协议,就是请求加响应,尤其不用记住是谁则刚发了HTTP请求,每个请求相对来说都是全新的。

但是随着交互式Web应用的兴起,像在线购物网站和需要登录的网站等就面临一个问题,那就是要管理会话,必须记住哪些人登录系统,哪些人往自己的购物车中加入了商品。

也就是说必须把每个人区分开,这是一个不小的挑战,因为HTTP请求是无状态的,所以想出的办法就是给大家发一个会话标识(Session ID)。

说白了就是一个随机的字串,每个人收到的都不一样,每次大家发起HTTP请求的时候,把这个字符串给一并捎过来,这样就能区分开谁是谁了。

这样大家很高兴了,可是服务器就不高兴了,每个人只需要保存自己的Session ID,而服务器则要保存所有人的Session ID。如果访问服务器多了,就得有成千上万,甚至几十万或上百万个。这对服务器来说是一个巨大的开销,严重限制了服务器扩展能力。

比如用2个机器组成了一个集群,小明通过机器A登录了系统,那么SessionID会保存在机器A上,假设小明的下一次请求被转发到机器B怎么办?机器B没有小明的Session ID。

这时候会采用一点小伎俩:Session sticky,就是让小明的请求一直粘连在机器A上,但是这也不管用,要是机器A挂掉了,请求还得转到机器B上去。

那只好做Session 的复制了,把Session ID在2个机器之间来搬去,非常累。

后来有个叫Mencached的支了招:把Session ID集中存储到一个地方,所有的机器都来访问这个地方的Session数据。

这样一来,就不用复制了,但是增加了单点失败的可能性,要是那个负责Session的机器挂了,所有人都得重新登录一遍,估计得被网络喷子“照顾”一番。

后来尝试把这个单点的机器也集群,增加可靠性,但不管如何,这小小的Session还是一个沉重的负担。

于是有人提出,为什么要保存这个可恶的Session,只让每个客户端去保存该多好。可是如果不保存这些SessionID,怎么验证客户端发出的Session ID的确是正确生成的呢?

如果不去验证,都不知道他们是不是合法登录的用户,哪些不怀好意的家伙们就可以伪造Session ID为所欲为了。

关键点就是验证。比如说,小明已经登录了系统,给他发了一个令牌(Token),这里边包含了小明的user id,下一次小明再次通过HTTP请求访问的时候,把这个token通过HTTP Header带过来不就可以了。不过这和Session ID没有本质区别,任何人都可以伪造,所以得想办法,让别人伪造不了。

那就对数据做一个签名(加密)吧,比如说用HMAC-SHA256真法,加上一个只有我才知道的密钥,对数据做一个签名,把这个签名和数据一起作为token,由于密钥别人不知道,就无法伪造token 了。

这个token不保存,当小明把这个token发过来的时候,再用同样的HMAC-SHA256算法和同样的密钥,对数据再计算一次签名,和token中的签名做个比较,如果相同,就知道小明已经登录过了,并且可以直接取到小明的user id,如果不相同,数据部分肯定被人篡改过,就告诉发送者:对不起,没有您认证。

Token中的数据是明文保存的(虽然会用Base64做下编码,但那不是加密),还是可以被别人看到的,所以不能在其中保存像密码这样的敏感信息。

当然,如果一个人的token被别人偷走了,那也没办法,也会认为小偷就是合法用户,这其实和一个人的Session ID被人偷走是一样的。这样一来,就不用保存Session ID了,只是生成token,然后验证token,用CPU计算时间获取了我的Session 储空间。解除了Session D这个负担,可以说是无事一身轻,机器集群现在可以轻松地做水平扩展,用户访问量增大,直接加机器就行。这种无状态的感觉实在是太好了。

Cookie

cookie是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。cookie是由服务器生成,发送给浏览器,浏览器把cookie以Key-Value形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。

由于cookie是存在客户端上的,所以浏览器加入一些限制,确保cookie 不会被恶療使用,同时不会占据太多磁盘空间。所以每个域的cookie数量是有限的。

Session

Session从字面上讲,就是会话。这个就类似于正在和一个人交谈,怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征表明他就是张三。

Session也是类似的道理,服务器要知道当前发请求给自己的是谁。

为了做这种区分,服务器就要给每个客户端分配不同的身份标识,然后客户端每次向服务器发请求的时候,都带上这个身份标识,服务器就知道这个请求来自于谁了。

至于客户端怎么保存这个“身份标识",可以有很多种方式,对于浏览器客户端,大家都默认采用cookie的方式。

服务器使用Session 把用户的信息临时保存在了服务器上,用户离开网站后Session会被销毁。

这种用户信息存储方式相对cookie来说更安全,可是Session有一个缺陷:如果Web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候Session就会丢失。

Token

在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,token是多用户下处理认证的最佳方式。

以下特性会在程序中使用基于Token的身份验证:

1、无状态、可扩展
2、支持移动设备
3、跨程序调用
4、安全

大部分的API和Web应用部使用token。例如Facebook,Twiter,Google+,GitHub等

Token的起源

在介绍基于Token的身份验证的原理与优势之前,不妨先看看之前的认证都是怎么做的。

基于服务器的验证

HTTP协议是无状态的,这种无状态意味着程序需要验证每一次请求,从而辨别客户端的身份。

在这之前,程序都是通过在服务端存储的登录信息来辨别i求的。这种方式一般都是通过存储Session来完成。随着We应用程序移动端的兴起,这种验证的方式逐渐暴露出了问题,尤其是在可扩展性方面。

基于服务器验证方式暴露的一些问题:

1、Seesion;每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。
2、可扩展性:在服务端的内存中使用Seesion 存储登录信息,伴随而来的是可扩展性问题。
3、跨域资源共享(CORS):当需要让数据跨多合移动设备使用时,跨域惊源的共享会是一个让人头疼的问题,在使用Ajax抓取另一个域的资源,就可能会出现禁止请求的情况。
4、跨站请求伪造(SRF):用户在访问银行网站时,很容易受到跨站请求伪造的攻击,并且容易被利用访回其他的网站。

在这些问题中,可扩展性是最突出的,因此有必要去寻求种更有行之有效的方法。

基于Token的验证原理

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

NosSession意味着程序可以根据需要去增减机器,而不用担心用户是否登录。

基于Token的身份验证的过程如下:

1、用户通过用户名和密码发送请求
2、程序验证
3、程序返回一个签名的token给客户端
4、客户端储存token,并且每次用于每次发送请求
5、服务端验itoken并返回数据

每一次请求都需要token。token应该在HTTP的头部发送从而保证了HTTP请求无状态。

通过设置服务器属性 Access-Control-Allow-Origin:*, 让服务器能接受到来自所有城的请求。、

需要注意的是,在ACAO头部标明(designating)*时,不得带有像HTTP认证,客户端SSL证书和cookie的证书。

实现思路:

1、用户登录校验,校验成功后就返回token给客户端
2、客户端收到数据后保存在客户端
3、客户端每次访问API是携带token到服务器端
4、服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码。

当在程序中认证了信息并取得token之后,便能通过这个token做许多的事情。

甚至能创建一个基于权限的token传给第三方应用程序,这些第三方程序能够获取到我们的数据(当然只有在我们允许的特定的token下)。

Tokens的优势

无状态、可扩展

在客户端存储的Tokens是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载均衡器能够将用户信息从一个服务器传到其他服务器上。

如果将已验证的用户信息保存在Session,则每次请求都需要用户向已验证的服务器发送验证信息。

但是不要着急。使用token之后这些问题都会迎刃而解,因为tokens 自己hold住了用户的验证信息。

安全性

请求中发送token而不再是发送cookie能够防止跨站请求伪造(CSRF).

即使在客户端使用cookie存储token。cookie也仅是一个存储机制而不是用于认证。不怒急昂信息存储在Session中,让我们少了对Session的操作。

token 是有时效的,一段时间后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回操作,通过ken revocation 可以使一个特定的token或是一组形同的认证的token无效。

可拓展性

Token 能够创建与其他程序共享权限的程序。例如,能将一个随便的社交帐号和自己的Fackbook或Twitter 系起來。

当通过服务登录Twitter (我们将这个过程称作Buffer)时,可以将这些Buffer附到Twitter 数据流上。

使用token时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,可以通过建自己的API,产生特殊权限的tokens.。

多平台跨域

再来谈论一下跨域资源共享(CORS),对应用程序和服进行扩展的时候,需要介入各种各种的设备和应用程序。

只要用户有一个通过了验证的token,数据和资源就能在任何域上被请求到。

本文出自 《计算机与网络》 2019. 22期 “详细了解 Cookie Session Token”

### 回答1: CookieSession Token 在 Web 应用中都被用来跟踪用户状态。两者的主要区别在于,Cookie 是存储在用户设备上的,而 Session Token 则是存储在服务器端的。 Cookie 是由浏览器自动创建和发送给服务器的,用户可以在浏览器的设置中查看和管理它们。Cookie 中可以存储一些键值对数据,在用户的不同请求之间共享数据。Cookie 适用于存储一些简单的数据,例如用户名和密码等。 Session Token 是在用户登录时在服务器端创建,并在用户与服务器进行交互时发送。服务器端会为每个用户维护一个唯一的 Session TokenSession Token 是在服务器端存储的,用户可以在浏览器中查看,但不能编辑或删除。Session Token 适用于存储用户身份,例如权限、购物车等。 总结,Cookie主要用来存储简单的,不太敏感的数据,且存在浏览器端;而Session token用来标识用户身份,数据都是存在服务器端。 ### 回答2: cookiesessiontoken都是现在常见的认证方式,用于保证Web应用程序的安全性和隐私性。在理解三者的区别之前,需要先了解它们的基本概念含义。 1. Cookie Cookie 是服务器发送给浏览器的小型数据文件,存储在用户的计算机中。浏览器在之后的请求中会将此文件发送到服务器,以便于验证用户的身份和记录用户的行为。 Cookie 的优点在于它可以存储比 Session 更多的信息,并且可以在浏览器关闭后仍然保持数据有效。缺点是 Cookie 可以被恶意软件或黑客轻易窃取。 2. Session Session 指的是服务器创建的一个会话过程,用于在特定时间段内记录某个用户的交互状态。通过 Session,Web应用程序可以在不同的页面之间共享数据,为用户提供个性化服务。 Session 的优点在于它存储在服务器上,保障了比 Cookie 更好的安全性和隐私性。但是, Session 也会消耗服务器的资源,因此需要谨慎管理。 3. Token Token 是一种随机生成的字符串,用于验证用户的身份和权限。在 Web 应用程序中,Token 可以被用来替代 CookieSession,因为它不会存储在用户的计算机中,也不需要服务器存储用户的状态。 Token 的优点在于它们相对更安全,因为它们没有任何销售性的信息存储在用户的浏览器中。另外, Token 机制可以支持无状态应用,也就是应用程序无需保存任何会话信息,更好的支持了分布式架构。 在以上区别基础上,三者的区别主要在于存储地点(客户端或服务器端)、存储内容(数据信息)、安全性和使用场景等。 - Cookie主要存储在客户端,并可以将更多的数据存储在客户端,Session存储于服务端提供了更好的安全性,但会占用更多服务器资源,Token能够将Session信息存储于客户端,也可以保证数据安全。 - Cookie主要用于客户端与服务端的交互;Session更注重用户身份的鉴别与用户状态的维护;Token更多地用于 API 认证。 - 一般情况下Cookie的安全性最低,Session的安全性中等,Token相对而言较为安全。 - 通常情况下,Token方式的应用程序可以跨平台、跨域和分布式部署,更加灵活多变。 综上所述,Cookiesessiontoken都是Web开发中常用的验证方式,它们在存储及应用方式上均有所差别。仔细分析自身需求,选择最适合的认证方式相比盲目跟随更为优合理。 ### 回答3: CookieSessionToken都是web应用中常见的身份认证和信息存储方式,它们之间最大的不同在于其存储的位置和方式。 Cookie是由服务器在浏览器中生成的,并存储在浏览器中的文件中。当浏览器向服务器发出请求时,会自动通过Cookie中的信息向服务器证明身份。Cookie在用户登录后会保存用户名、密码和一些其他信息,以便下次登录时自动填充,从而提高用户体验。 Session是一个服务器端的解决方案,它可以在服务器端存储用户的会话信息,并且在用户进行请求时将信息传输到客户端。Session的实现依赖于Cookie,服务器通过发送一个包含Session ID的Cookie,来记录用户的会话信息,服务器则将Session信息保存在服务器端的内存或者文件系统中,以确保用户信息的安全性。 Token是一种无状态的身份认证方式,它不同于CookieSession的保存信息方式,而是保存在客户端中。当用户登录时,服务器会生成一个Token并将其返回给客户端,客户端在后续的请求中会带上这个Token,服务器会通过验证Token的合法性来判断用户的身份。 总的来说,Cookie是一种简单且易用的Web身份认证方式,Session需要服务器支持,可以更好的保证用户信息的安全性,Token则更适合Web接口/移动端API身份认证。不同的应用场景可以选择适合的认证方式,以确保用户信息和身份的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漏墨小子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值