15.Session和Cookie以及Token的详解

HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。于是WEB的设计者们提出了Session和Cookie两种解决机制。Session是存储在服务器的一种解决机制,Cookie是存储在客户端的一种解决机制。

Session

Session称为“会话控制”,是指从注册进入系统到注销退出系统之间所经过的时间在服务器上记录并跟踪用户的状态。当客户端浏览器访问服务器的时候,服务器会把客户端信息以某种形式(可以存放在服务器的文件、数据库、或内存中)记录在服务器上,这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

Cookie

Cookie是暂时或永久存储在客户端的一段通常经过加密的“小型文本数据“,记录着用户信息,跟踪用户。一般来说,单个域名设置的 Cookie 不应超过30个,每个 Cookie 的大小不能超过4KB。Cookie由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。Cookie文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用,以此来辨认用户状态。

Cookie 主要用于以下三个方面:

  • 会话(Session)状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

基于Session的验证

大多数的应用都是用 Cookie 来实现Session跟踪的。会话变量保存在服务器,会话ID保存在客户端。

  1. 服务器启动一个会话
  2. 服务器注册会话变量(PHP称为:关联数组或Ruby称为:Hash)
  3. 会话ID是由服务器生成的会话变量的键,是一个加密的随机数,响应返回客户端,保存在客户端Cookie,后期可以通过Cookie(最常见)或URL参数形式使用会话ID
  4. 使用会话变量
  5. 取消已注册的会话变量及销毁会话

基于Token的验证

客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。

基于 Token 的方案中,服务端根据用户身份信息生成 Token,发放给客户端。客户端收好 Token(客户端通过cookie、sessionStorage、localStorage都可以进行存储),并在之后的数据请求中带上 Token,服务端接到请求后校验并解析 Token 得出用户身份,无需再次带上用户名和密码。

Session和Token验证的区别

Session是基于域名的验证,Token是基于特征的验证。

a.可拓展性

基于会话的身份验证:因为会话存储在服务器的内存中,所以当大量用户一次使用系统时,扩展就成为一个问题。
基于令牌的身份验证: 扩展没有问题,因为令牌存储在客户端。

b.多设备

基于会话的身份验证: Cookie通常在单个域或子域上工作,并且如果它们跨域工作,则通常会被浏览器禁用(第三方Cookie)。当从不同的域向移动设备和Web设备提供API时,就会出现问题。
基于令牌的身份验证: cookie没有问题,因为请求标头中包含JWT。

c.状态保持

基于会话的身份验证: 有状态。
基于令牌的身份验证:无状态。

d.应用场景

基于会话的身份验证: 网站前端登陆。
基于令牌的身份验证:API场景(比如百度站长平台资源的主动推送)和APP场景。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/basic/thinking-in-programming/3693.html

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注