#社区新闻#SegmentFault 第一个付费问题在 2017.06.13 北京时间 17:53 诞生啦 ↖(^ω^)↗

清蒸不是水煮 · 6月13日

提问者:@卡西

回答者:@边城

提问:微博微信知乎等这些APP一般登录后只要用户不主动登出,登录状态都是始终保持的,他们是怎样的机制呢

现在为手机端提供API基本都是restful方格,属于无状态协议。我想知道怎么设计安全的登录机制。比如,简单的流程是用户输入账号和密码调用登录接口服务端返回token,然后用户之后的请求都带上这个token服务端则通过验证token合法性决定是否返回数据,一般为了安全性这个token都是有个过期时间。另外,也了解到JWT这样的去中心化(服务端不保存token)这样的机制。

我想知道像微博微信知乎等这些APP一般登录后只要用户不主动登出,登录状态都是始终保持的,他们是怎样的机制呢,token是否会按过期处理

据我了解持有用户登录状态大概有下面几种方法

一:服务端默认的session

这种方式最大的优点是服务端不用增加任何代码,但APP与网站不同,通常情况下,我们会希望APP的登陆状态能维持数天,甚至数月之久,大部分的服务端程序,都会在进程重启时或客户端多久不活动时,将session全部清空,致使状态丢失

二、在客户端记录登陆用户的用户名和密码

客户端在登陆时,判断如果服务端返回验证成功,则将用户名和密码(为了客户端安全起见,可以将password多次md5)保存到本地的localStorage中,然后每次HTTP请求时,将用户名和密码带到参数中,服务端每次都需要读取数据库判断合法性,会浪费一定的服务器资源,同时,因为密码保存到本地,带来了一定的安全风险。

三:借助于数据库或文件系统等维持持久状态

这种方式,是为了解决方法一中session不持久的问题(如:将session保存的位置修改到文件或数据库),以及方案二中的安全性问题,不过这会降低服务端性能,或浪费服务端资源,代码逻辑流程如下:

数据库中,除了常见的user,password之外,额外增加一个字段,如:sessionID

在登陆接口中,如果判断用户输入的用户名密码正确时,生成一个随机字符串,保存到sessionID中,同时,客户端也将该值保存,在每次请求时,传递该值,服务端通过该值查询数据库,取得用户的身份信息。

上面的方法基于安全的考虑都会用过期时间的限制,但是像微博、微信、知乎等APP似乎他们都是只要用户不主动退出就一直持有用户的登录状态,他们是怎样在确保安全性的前提下实现的呢?是不是大概和上面第三种情况类似

回答部分摘要

感谢你的提问!

传统的身份证是基于 Session 的,需要 Cookie 来保存 Session ID,这种方式用了那么多年也并不是一无是处,不过在长期保存状态这个问题上确实不行。

除了 Session 方式之外,还有基于 Token 的方式。在若干年前出现了“单点登录”这样一个概念,其实上就是用的 Token。Token 保存的位置(服务器端)相对自由,可以是内存,可以缓存,也可以是数据、文件,甚至是另一台专门的 Token 服务器。你也提到了 JWT,就是一种标准化的实现。

付费问答专家页面传送门:https://segmentfault.com/experts

13 条评论
Dont · 6月14日

撒花~•¨•♫♪..¸¸.•¨•♫♪.¸¸.•¨•♫♪

+1 回复

0

同乐 ̀⌄ ́

清蒸不是水煮 作者 · 6月14日
一代键客 · 6月14日

知识付费在各个平台开始流行了,不错,是将来的趋势~

回复

0

为知识付费 lol

清蒸不是水煮 作者 · 6月14日
crisitina · 6月14日

66666

回复

1

2333 ?

清蒸不是水煮 作者 · 6月14日
Kotexy · 6月14日

撒花 (≧∇≦)

回复

1

开心开心 (≧∇≦)

清蒸不是水煮 作者 · 6月14日
YancyYe · 6月19日

赞赞赞

回复

0

移动一哥,你好;移动一哥,再见

清蒸不是水煮 作者 · 6月19日
载入中...