web应用的session和token有什么联系?

Http协议本身是一种无状态的协议,如果Http服务器需要浏览器提供用户名和密码来进行身份核验,那么浏览器每一次请求时,都需要做一次用户认证才行,因为Http服务器并不知道请求是哪个用户发出的。

为了让Http服务器识别出来是哪个用户发出的请求,需要在服务器存储一份用户登录的信息,这份登录信息会随着第一次请求的响应回传给浏览器。浏览器将其保存为cookie,以便下次请求时带上登录信息。这样下次请求时,服务器就能识别出请求来自哪个用户了。这就是传统的基于会话的认证。

基于server-session的认证流程

server-session流程图

(1)用户第一次访问时,服务器就会创建会话(session)对象,服务器为每一个session都分配一个唯一的sessionid,以保证每个用户都有不同的session对象。

(2)服务器在创建完session后,会把sessionid通过cookie返回给用户所在的浏览器,这样当用户再次发送请求时,通过cookie把sessionid传回服务器,服务器就能够根据sessionid找到与该用户对应的session对象。

session通常有失效时间的设定,当失效时间到了,服务器会销毁之前的session,并创建新的session返回给用户。但只要用户在失效时间内,有发送新的请求给服务器,通常服务器都会session的失效时间再延长。

(3)服务器获取用户的session对象后,看里面有没有登录成功的凭证,就能判断这个用户是否已经登录。当用户注销后,服务器会把session对象里的登录凭证清掉。

这种方式将会话信息存储在web服务器里面,在用户在线量比较多时,会占据较多的内存。另外当服务端应用采用集群部署的时候,多台服务器之间需要进行session共享。

通常的解决方案是采用redis缓存服务器来管理session,既可以减轻应用服务器的负担,又可以实现session共享。

除了在服务端管理会话信息,还可以将登录凭证保存在浏览器端。下面来看看基于浏览器cookie的认证流程。

基于cookie的认证流程

cookie-based认证流程

(1)用户发起登录请求,服务器验证用户名和密码等身份信息,如果验证通过,就为该用户创建一个登录凭证,最简单的凭证形式可以只包含:用户id、凭证创建时间和过期时间。

(2)服务器先对登录凭证进行数字签名,然后再用对称加密算法做加密处理,将加签加密的登录凭证(命名为ticket),写入cookie,再回传给浏览器。

添加数字签名的目的是防止登录凭证里的信息被篡改,一旦信息被篡改,那么服务器验签肯定会失败。加密的作用是防止cookie被截取后,泄露其中的用户信息。

(3)用户再次发起请求时,服务器通过登录凭证名称(ticket)获取到相关的cookie值。先做解密处理,再做验签。如果这两步成功,就可以拿到原始的登录凭证;如果这两步不成功,则不允许请求。

(4)服务器用这个凭证的过期时间和当前时间做对比,判断凭证是否过期。如果过期,就需要用户再重新登录;如果未过期,则允许请求继续。

这种方式最大的优点就是实现了服务端的无状态化,彻底移除了服务端对会话的管理的逻辑,服务端只需要负责创建和验证登录cookie即可,无需保持用户的状态信息。

如果服务端做了集群部署,只需要每个服务器的登录逻辑中加签验签和加密解密的代码一致,那么就可以在集群内实现会话共享。

但是server-session方案和cookie-based方案都要用到cookie,不适合native app里面使用,只适合浏览器。现在大部分互联网应用都是支持多端的,既要支持web端,也要支持app,就要考虑下面介绍的基于token的会话管理方式。

token-based会话管理

token-based会话管理流程与基于cookie的流程基本一致,只不过把ticket换成了token。在客户端获得token以后,再次请求时需要在http header或url参数中带上token。

token-based认证方式有以下特点:

  • 不需要依赖cookie,适用于app应用。当然这种方式也同样适用于web应用,token可以存在localStorage或者sessionStorage里面。每次发ajax请求的时候,都把token拿出来放到ajax请求的header里即可。

  • 在web应用里也存在跨域的问题。比如应用部署在a.com,api服务部署在b.com,从a.com里面发出ajax请求到b.com,会报跨域错误。这种问题可以用CORS(跨域资源共享)的方式来解决。

  • 存在token刷新的问题。很多场景都不希望每隔一段时间需要用户重新登录的情况出现。这个时候就得考虑token的自动刷新的问题,在token有效期过期前,通过程序逻辑自动刷新token。

总结

基于token的方案是实现会话管理的方案之一,但不是唯一的方案。目前应用最多的会话管理方案还是基于token的方案,不仅有很多实现,而且还有现成的标准可用,这个标准就是JWT(json-web-token)。在后面的文章中我们再来聊聊JWT标准。

参考资料:3种web会话管理的方式

(0)

相关推荐

  • Cookie、Session、Token 的区别

    首先我们来说一下认证(Authentication): 通俗的来说认证就是 验证当前用户的身份.例如,你上班打卡,为了防止你作弊,就需要你用到你的指纹来打卡,如果打卡系统里面的指纹和你的指纹匹配,那就 ...

  • 密码安全与会话安全

    对于登录大家并不陌生,访问系统几乎都需要登录.因为系统也不知道是谁在访问,所以需要你告诉系统你是谁,还需要证明你真的是你,如何证明?给系统展示你的密码,因为密码只有你才拥有,你有这个密码,你就能证明你 ...

  • OAuth2、CAS单点登录

    一.Oauth 是一个关于授权(authorization)的开网络标准(规范) OAuth2: 解决的是不同的企业之间的登录,本质是授权,如论坛与QQ 要能访问各种资源重点是要获取令牌(token) ...

  • 认证授权基础

    认证授权基础

  • Web开发应该学习的Token登录认证知识

    chrisghb Web开发 3天前 来自:简书,作者:chrisghb 链接:https://www.jianshu.com/p/a32634a5170c 基于 Cookie/Session 的认证 ...

  • session与token有什么区别?网络安全协议知识

    session与token有什么区别?要成为优秀的网络安全工程师,需要掌握扎实的网络安全技能.session和token均是网络协议相关知识点,是网络安全工程师需要了解的基本内容.随着互联网技术的发展 ...

  • 彻底理解cookie,session,token

    发展史# 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应,  尤其是我不 ...

  • 诚之和:什么是Cookie、Session、Token

    本篇内容主要讲解"什么是Cookie.Session.Token",感兴趣的朋友不妨来看看.本文介绍的方法操作简单快捷,实用性强.下面就让小编来带大家学习"什么是Cook ...

  • Web 开发必须掌握的三个技术:Token、Cookie、Session

    WEB前端开发社区 1周前 在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. ...

  • 前后端接口鉴权全解 Cookie/Session/Token 的区别

    今天 作者:ssshooter 不知不觉也写得比较长了,一次看不完建议收藏夹!本文主要解释与请求状态相关的术语(cookie.session.token)和几种常见登录的实现方式,希望大家看完本文后可 ...

  • Token是什么?和session、cookie相比,使用场景有什么区别?

    在Web开发领域,相信大家对于Cookie和Session都很熟悉,Cookie和Session都是会话保持技术的解决方案.随着技术的发展,Token机制出现在我们面前,不过很多开发者对于Token和 ...

  • 什么是 JWT -- JSON WEB TOKEN

    Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(S ...