单Web应用系统登录设计

基于session会话的登录认证机制

该机制的核心在于服务器session和客户端sessionId的交互。用户登录完成后,服务器会构建用户会话session,会话内包含了用户标志及登录状态,并向浏览器返回sessoinId。之后用户在做其他接口请求时,将sessionId携带上。服务器检索到会话session并进行登录鉴权判断。

整个机制是十分简单明了的,但在设计细节上,还是由很多发挥的空间。我们先看一看session会话登录认证机制的基本流程

3种web会话管理的方式——服务器session的交互模式.png

认证过程大致如下:

  1. 用户输入用户名、密码或者用短信验证码方式登录系统;
  2. 服务端验证后,创建一个 Session 信息,并且将 SessionID 存到 cookie,发送回浏览器;
  3. 下次客户端再发起请求,自动带上 cookie 信息,服务端通过 cookie 获取 Session 信息进行校验;

问题点:

  1. 会话信息直接存储在什么地方? 对于用户量少的非分布式web系统,可以直接使用代码框架的session能力。反之,则需要一套缓存服务(redis)在多台web服务器之间共享session会话。

  2. cookie 存在 CSRF(跨站请求伪造)的风险。sessionId的cookie属性设置为httpOnly和secure,保证cookie值不能被前端js代码读取到;通过校验reffer header是否合法,防止非自有web系统发起的请求;通过使用https协议,防止黑客冒充合法的web系统。

  3. 用户会话保持和失效——用户登出则服务器session清除。用户长时间不操作用户状态失效(设定缓存时间),用户持续发起请求则用户状态保持登录(会话快过期时刷新失效时间),浏览器关闭重开是否保持会话可通过cookie属性设置。

  4. sessionId理论上还能放置在什么地方?除了放置在cookie里,理论上还可以放置在header中,body中,url路径中。放header中是可行的,但一般是在app应用里。对于web应用,还需把sessionId先存储在localstorage,那样才能在新开浏览器tab时读取重新放置到header中。放在body里理论上可以,但对于服务端的鉴权会更麻烦。放在url里则是不安全的,可通过csrf被黑客截取到。

基于token鉴权的登录认证机制

token鉴权是一种直接把用户的登录凭证直接存到客户端的方案。在用户登录验证成功之后,将登录凭证做数字签名和加密之为token返回给客户端。用户在做其他接口请求时,将token携带上。服务器将该token解密验签判断其有效性。

整个机制的关键在于token的生成和验证


3种web会话管理的方式——cookie-based的交互逻辑.png

问题:

  1. 经过签名加密后,token字符串会很长,但里面有效信息占比较小,同时也影响性能。 尽量减少token里的信息量,最简单的形式可以只包含用户id,凭证创建时间和过期时间三个值。

  2. token如何保证每次登录的安全随机? 如上,添加上时间戳可以保证每次登录的token值都不一样。

  3. 用户会话保持和失效——用户登出则清理客户端token,用户长时间不操作用户状态失效(token中含缓存时间),用户持续发起请求则用户状态保持登录(每次请求刷新token返回),浏览器关闭重开是否保持会话token保存位置决定。

  4. token放置的位置。可以放在cookie中,CSRF风险同会话管理。每次请求都可以无感刷新token。对于app客户端。放在header上,则可能存储在localstorage或sessionStorage里,其生命周期影响了会话保持。

两类登录认证机制的对比

这两种登录认证机制差异还是蛮大的。

从原理层面上看,session会话机制中,服务器为你保管了登录凭证,然后给了客户端一个信物。客户端带着信物访问,服务器能根据这个信息找到登录凭证就是有效的;token认证机制中,服务器将登录凭证打上记号锁在盒子里再给到客户端。客户端带着这个上锁的盒子访问,服务器拿出他的锁打开并检查记号,都对上了则说明登录凭证可以使用。当然,登录凭证里也有失效

从效果层面上看,session会话机制中,服务器需要自己腾出空间保存凭证和记录,而token认证机制中,服务器则只需保管好钥匙,信息本身是保存在客户端。因此,session会话需要更多存储空间;token认证机制需要额外的token解析时间,本身不存储任何用户的登录状态

但有时候,又不是那么绝对。例如token鉴权中,对于强业务的web系统,后端web服务必然也还会再关联个session会话做业务逻辑的处理;对于要求用户单端登录的情况,如果同时异地登录,旧的token要求被踢下,此时后端web服务就得存储用户token及ip或设备等信息。具体的设计原则,还是得看系统的业务属性。毕竟,一个系统,可不会仅包含用户登录鉴权。

附:初始登录鉴权

自有账号体系登录

三方账号 Oauth2.0 登录流程

流程示意图:

[图片上传失败...(image-a55a38-1609677363093)]

  1. 用户选择华为帐号登录,开发者应用发起授权码Code请求。
  2. 华为帐号服务器呈现授权页面给用户,用户确认授权。
  3. 华为帐号服务器通过开发者应用配置的回调地址,返回授权码Code。(
  4. 开发者应用发起Code换Token请求。
  5. 华为帐号服务器返回凭证(Access Token)、用户信息(ID Token)。
  6. 之后用上一步获取的 access_token 去请求华为账号服务器获取用户的基本信息,例如头像、昵称等;
  7. 保存到用户凭证中,完成登录。

自有系统 SSO单点登录

流程示意图:

单web应用系统登录设计——子系统SSO登录流程.png
  1. 用户向后台业务系统发起请求时,先验证局部登录会话是否创建。如果未创建,则先跳转到SSO单点登录系统进行登录操作.
  2. SSO认证中心引导用户登录,完成登录验证
  3. 验证OK,则生成ticket.并将User对象转化为JSON数据,创建全局会话。(这里基于cookie-session的机制)
  4. 携带ticket跳转回业务系统的前台页面 (当业务系统与SSO认证中心同域的情况下,ticket可直接放在域名cookie下)
  5. 用户重新在浏览器页面发起了操作
  6. 业务系统后台向SSO认证中心验证ticket合法性,以获取用户登录凭证。并在自己的服务域名下创建局部会话。

以上两个流程实际上大同小异,都遵循外部鉴权系统的两个核心步骤————鉴权认证中心(外部账号系统、自有SSO认证中心)在登录完成后颁发令牌,业务系统拿着该令牌向鉴权认证中心请求验证。 前一步可以通过cookie或url参数的性质通过前端传到业务系统,该令牌被泄露了也无关紧要;第二步则由后台服务向鉴权中心发起认证,这里则需要服务之间的互信。oauth机制中,可以通过appid和secret来保证互信。SSO认证中心则可以通过秘钥管理的方式来保证互信。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,639评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,093评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,079评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,329评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,343评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,047评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,645评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,565评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,095评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,201评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,338评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,014评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,701评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,194评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,320评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,685评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,345评论 2 358

推荐阅读更多精彩内容

  • 本文主要基于web类应用展开讨论,提供的是一种通用机制和方法,所以不论何种技术栈都可进行相应的具体实现。 实现目标...
    JohnBeanLee阅读 8,086评论 0 15
  • http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的。当然它知道...
    Blues2013阅读 280评论 0 0
  • 1. 基于server端session的管理 2. cookie-based的管理方式 3. token-base...
    匆匆岁月阅读 340评论 0 0
  • http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的。当然它知道...
    Www刘阅读 475评论 4 15
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,524评论 16 22