对于 HTTP 无状态的问题,解法方案有很多种,其中比较简单的方式用 Cookie 技术。Cookie 通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。相当于,在客户端第一次请求后,服务器会下发一个装有客户信息的「小贴纸」,后续客户端请求服务器的时候,带上「小贴纸」,服务器就能认得了了。
Cookie 是由 Web服务器保存在用户浏览器(客户端)上的小文本文件(内容通常经过加密),它可以包含有关用户的信息。无论何时,只要客户端连接到服务器,服务器都可以访问 cookie 信息,可以看作是浏览器缓存。
浏览器把 cookie 以 name=value 形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该 cookie 发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保 cookie 不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的 cookie 数量是有限的。
Cookie 四大要素
Cookie 非常轻便,非常小,且对于服务端是没有任何压力的,因为是 cookie 存在浏览器里面,还可以设置失效时间,生效时间等。
客户端和服务端都能生成 cookie,它用来存放一些不敏感的数据,数据类型只能是字符串(json)。
Cookie 记录了用户的帐户 ID、密码之类的信息,通常使用 MD5 方法加密后在网上传递。经过加密处理后的信息即使被网络上一些别有用心的人截获也看不懂。然而,现在存在的问题是,截获 cookie 的人不需要知道这些字符串的含义,只要把别人的 cookie 向服务器提交,并且能够通过验证,就可以冒充受害人的身份登陆网站,这种行为叫做 cookie 欺骗。非法用户通过 cookie 欺骗获得相应的加密密钥,从而访问合法用户的所有个性化信息,包括用户的 E-mail 甚至帐户信息,对个人信息造成严重危害。
Cookie 以纯文本的形式在浏览器和服务器之间传送,很容易被他人非法截获和利用。任何可以截获 Web 通信的人都可以读取 cookie。Cookie 被非法用户截获后,然后在其有效期内重放,则此非法用户将享有合法用户的权益。例如,对于在线阅读,非法用户可以不支付费用即可享受在线阅读电子杂志。
在不同的场合中 session 一词的含义也不尽相同,它可以代表服务器与浏览器的一次会话过程(从一个浏览器窗口打开到关闭的这个期间),也可以指一类用于在客户端与服务器之间保持状态的解决方案。
Session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。
Session 技术也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大多采用 cookie 的方式。
Session 一般保存在服务器端的文件或数据库中,默认则保存在文件中,session 文件是公有的。目前还可以通过使用 redis 来保存 session 信息。
服务器使用 session 技术把用户的信息临时保存在了服务器上,用户离开网站后其 session 会被销毁。这种用户信息存储方式相对 cookie 来说更安全。
1. Session 保存在服务器端,每次读取都在服务器进行,会占用服务器资源。
2. 如果 web 服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候 session 会丢失。
Cookie 保存在客户的浏览器上;Session 保存在服务器上(禁用 cookie 后,session 不能正常使用)。
单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存20个 cookie。而 session 理论上是无限量的。
建议:将登录信息等重要信息存放为 session,其他信息如果需要保留,可以放在 cookie 中。
Token 是服务端生成的一串加密字符串,以作为客户端进行请求的一个令牌。当第一次登录后,服务器生成一个 token 并将此返回给客户端,以后客户端只需带上这个 token 前来请求数据即可,无需再次带上用户名和密码。
Token 技术主要是解决 session 的性能问题。客户端登录成功之后 session 保存在内存。一台服务器的内存大小是固定的,当内存越满时,服务器的性能就越低。那怎么去解决的呢?就是这个 token。
Token 其实也是一个字符串,它最大的一个特点就是不会存储在服务器,还有一个特点就是不再依赖于 cookie 的形式,它可以是请求头或者是请求体的方式,也就是 session 依赖于 cookie,由服务器生成、存储和验证,并以 cookie 的方式存在于客户端,客户端以同样方式发送给服务端。
Session 有状态,token 无状态。因此使用 token 的话,服务器不需要保存会话状态,不用担心会话丢失,利用这种方式也方便部署分布式服务,将一个服务拆分成多个小服务,减轻单台服务器的压力。
在 Web 领域,基于 token 的身份验证随处可见。在大多数使用 Web API 的互联网公司中(Facebook、Twitter、Google+、GitHub等),token 是多用户下处理认证的最佳方式,其好处有:无状态、可扩展、支持移动设备、跨程序调用、安全等。
1. 无状态、可扩展
在客户端存储的 token 是无状态的,并且能够被扩展。基于这种无状态和不存储 session 信息,负载均衡服务器能够将用户信息从一个服务传到其他服务器上。如果我们将已验证的用户的信息保存在 session 中,则每次请求都需要用户向已验证的服务器发送验证信息(称为 session 亲和性)。当用户量大时,可能会造成一些拥堵。而使用 token 之后这些问题都迎刃而解,因为 token 自己 hold 住了用户的验证信息。
2. 安全性
3. 多平台、跨域
CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。只要用户有一个通过了验证的 token,数据和资源就能够在任何域上被请求到。
4. 基于标准
创建 token 的时候,你可以设定一些选项,标准的用法会在 JSON Web Token 体现,它支持众多的语言。这意味在未来的使用中你可以真正地转换你的认证机制。
原文:https://www.cnblogs.com/juno3550/p/14380417.html