likes
comments
collection
share

cookie、session、token你都知道吗?(强烈推荐)

作者站长头像
站长
· 阅读数 21

前言

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第4篇文章,点击查看活动详情

cookie、session、token是我们前端用于与后端通信的手段之一,了解他们对我们的帮助极大,强烈建议一定要认真看完。

http协议是无状态协议,cookie、session、token可以帮助服务器区分到底是谁在访问

session 

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷: 如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。 

session兴起原因

随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等等,马上就面临一个问题,那就是要管理会话,必须记住哪些人登录系统,  哪些人往自己的购物车中放商品,  也就是说我必须把每个人区分开,这就是一个不小的挑战,因为HTTP请求是无状态的,所以想出的办法就是给大家发一个会话标识(session id), 说白了就是一个随机的字串,每个人收到的都不一样,  每次大家向我发起HTTP请求的时候,把这个字符串给一并捎过来, 这样我就能区分开谁是谁了

每个人只需要保存自己的session id,而服务器要保存所有人的session id !如果访问服务器多了, 就得由成千上万,甚至几十万个。这对服务器说是一个巨大的开销 , 严重的限制了服务器扩展能力, 比如说我用两个机器组成了一个集群, 小F通过机器A登录了系统, 那session id会保存在机器A上, 假设小F的下一次请求被转发到机器B怎么办?机器B可没有小F的session id啊。

解决办法

有时候会采用一点小伎俩: session sticky , 就是让小F的请求一直粘连在机器A上, 但是这也不管用, 要是机器A挂掉了, 还得转到机器B去。那只好做session 的复制了, 把session id 在两个机器之间搬来搬去,也比较麻烦,如图:

cookie、session、token你都知道吗?(强烈推荐)

后来有个叫Memcached的想了一个好办法:把session id 集中存储到一个地方, 所有的机器都来访问这个地方的数据, 这样一来,就不用复制了, 但是增加了单点失败的可能性, 要是那个负责session 的机器挂了, 所有人都得重新登录一遍。如图:

 

cookie、session、token你都知道吗?(强烈推荐)

 后来人们也尝试把这个单点的机器也搞出集群,增加可靠性, 但不管如何, 这小小的session 对后台来说是一个沉重的负担

于是有人就一直在思考, 我为什么要保存这可恶的session呢, 只让每个客户端去保存该多好?经过人们的不断努力,终于,诞生了token

token

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

在这之前,程序都是通过在服务端存储的登录信息来辨别请求的。这种方式一般都是通过存储Session来完成。

随着Web,应用程序,已经移动端的兴起,这种验证的方式逐渐暴露出了问题,尤其是在可扩展性方面,基于服务器验证方式(cookie、session)暴露的一些问题:

1.Session:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。

2.可扩展性:在服务端的内存中使用Session存储登录信息,伴随而来的是可扩展性问题。

3.CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个域的资源,就可以会出现禁止请求的情况。

4.CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。

 为了解决这些问题诞生出了token。

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

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

在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式。大部分你见到过的API和Web应用都使用tokens。例如Facebook, Twitter, Google+, GitHub等。

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

1.用户通过用户名和密码向服务端发送请求

2.服务端通过验证,生成一个token发送给客户端

3.客户端保存token,并且每次发送请求时带上token

4.服务器验证token,并返回数据

使用token的几个优势:

1.无状态、可扩展

2.支持移动设备

3.跨程序调用

4.安全

无状态、可扩展

基于这种无状态和不存储Session信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。Tokens也能够创建与其它程序共享权限的程序。

安全性

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

cookie、session、token你都知道吗?(强烈推荐)

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

cookie、session、token你都知道吗?(强烈推荐)

多平台跨域

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

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

 cookie

cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。

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

与session的区别

cookie和session的区别就是保存在了前端。而session保存在了后端,两者都是后端生成。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session, session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie

使用cookie的缺点:

  1. cookie可以被用户禁止
  2. cookie不安全(对于敏感数据,需要加密)
  3. cookie只能保存少量的数据(大约是4k),cookie的数量也有限制(大约是几百个),不同浏览器设置不一样,反正都不多
  4. cookie只能保存字符串
  5. 对服务器压力小