为什么要使用双token
想知道这个问题的答案,我们先了解一下单点登录(SSO)。
单点登录(Single Sign-On,SSO)是一种认证技术,允许用户使用单一的登录凭据(如用户名和密码)访问多个独立的软件系统。SSO系统的一个常见例子是Google账户,用户登录一次Google账户后,可以访问Gmail、Google Drive、YouTube等多个Google服务。
实现单点登录的方式
一、Cookie+Session模式
首先,用户用账号密码访问认证中心。校验通过后,服务器在一个session表中存储一个键值对,key是sessionId,value是用户的一些信息。然后,服务器将sessionId返回给用户。用户将sessionId存储起来,访问子系统时带上sessionId。子系统无法直接校验sessionId,所以会将sessionId发给认证中心。认证中心查找session表,如果表中有记录,则校验通过,并通知子系统,子系统就可以将受保护的资源返回给用户。
- 优点:可以方便地控制用户。例如,如果用户进行了违规操作,可以通过删除认证中心的session表中的对应记录来禁止其登录。
- 缺点:维护成本较高,需要维护集中式的session存储,并确保其高可用性和可靠性,需要额外的负载均衡和故障转移机制。扩展性差,每次认证都需要访问集中式的认证中心,当用户量大时,认证中心可能成为性能瓶颈。
二、双Token模式
首先介绍单Token模式。
用户用账号密码访问认证中心,校验通过后,服务器生成一个token(通常使用JWT)并返回给用户。用户请求子系统时带上token,子系统通过解析token来校验其有效性。
- 优点:各个子系统就不依赖于认证中心,降低了系统间的耦合和成本。
- 缺点:这种模式下,对用户的控制变得困难。例如,需要让某个用户下线时,需要通知各个系统。
因此,引入了双Token模式。
用户用账号密码访问认证中心,校验通过后,服务器生成两个token:一个是accessToken即访问token,有效时间短(如10分钟或20分钟),另一个是refreshToken即刷新token,有效时间长(如一天或一周)。用户访问子系统时使用accessToken,如果accessToken过期,则使用refreshToken向认证中心请求新的token,此时accessToken和refreshToken都会更新,然后用户使用新的accessToken访问子系统。
这种模式下可以保证对用户的控制,因为accessToken的有效时长较短,用户需要隔一段较短的时间访问一次认证中心。例如,如果用户进行了违规操作,可以通过认证中心不给其新的token来禁止其继续访问。