要彻底了解Session、Cookie、Token只需5分钟

 

imToken钱包为广大用户提供值得信任的服务,助您安全便捷的管理帮助你安全管理比特币, 以太坊, ATOM, EOS, TRX, CKB, BCH, LTC 等资产,并支持币币兑换和 DApp 浏览器。

在我们通常的编程学习中,我们经常接触到“会话,令牌”这两个概念;

但很多小白都说不出其中的区别,“他们之间的区别、联系、使用场景,甚至在查阅了大量信息后,仍然模糊不清。

通过对这篇文章的了解,让我们花5分钟来彻底理解它。我相信聪明的你一定会在阅读后有所收获!

#为什么引入会话管理?

首先,HTTP协议是一种“无状态”协议,因此服务器无法自动区分这两个请求是否来自同一客户端(或用户)。

然而,在许多业务场景中,必须区分访问者的身份。

因此,服务器必须建立会话管理机制来解决“http协议的无状态问题”。

定义:

指用于在服务器端存储(和区分)客户端(非用户)当前访问的会话的机制。

工艺流程:

1) 当客户端第一次请求服务器是,服务器将生成一个sessionid(通常以文件的形式存储)作为客户端的唯一标识符,并通过在响应头(ResponseHeaders)中发送Set Cookie通知浏览器。需要保存此ID。

2) 当客户端第N次(N>=2)请求服务器时,它将自动在请求头(RequestHeaders)中携带此Cookie:sessionid=xx

3) 当服务器再次收到客户端请求时,它将首先检查请求头中是否有Cookie:sessionid=xx。如果没有cookie或cookie已过期,则会提示用户“必须先登录才能访问”,以实现(并区分)有状态会话管理。

通过以上知识,我们可以清楚地知道以下4个经典面试问题的答案:

1) 如果浏览器cookie被禁用,会话机制也将同时失效;

2) 如果同一用户账户使用不同的浏览器登录系统,则会话不同

3) 如果浏览器已关闭,则不会立即关闭会话会话(因为只有当会话在服务器端过期时,服务器才会删除会话文件本身)

4) 如果web服务器实现了多个负载平衡机制,那么当请求路由到另一个业务平衡服务器是,会话也将丢失。


#群集会化管理

众所周知,单个服务器的负载限制是一个固定值。

传统的会话机制仅适用于独立应用程序。一旦项目用户数量达到一定规模,服务器集群转型计划将变得紧迫。

对于群集环境中的会话管理,目前业界有两种主流解决方案:

选项1:提供会话共享机制

原则:不再使用文件存储会话,而是使用第三方中间件(如redis)来管理会话

优点:项目转换成本小(因为代码风格与传统一致)

缺点:依赖集中式中间件,一旦中间件本身性能失效,将立即导致系统瓶颈。

场景2:Token方案

原则:

1) 令牌由服务器本身根据算法生成,然后发送到客户端,服务器不需要额外的存储。

2) 当客户端请求服务器是,令牌将附加到请求标头

3) 服务器验证令牌以决定是拒绝还是允许访问。

优点:不依赖任何集中式中间件(完全依赖服务器计算能力来解决)

缺点:一旦颁发了令牌,就已经确定了有效期,并且会话不能像会话一样在服务器端随时终止。