关于 restful 无状态和 session id 登陆的理解

2017-06-06 01:58:27 +08:00
 esolve

在普通的 JAVA WEB 开发中 一般是在客户端存储 session id 服务端存留这个 session id 对应的登陆 session 这显然不是 restful 无状态

网上有种说法是将 session id 这个资源放在 redis 缓存上 这样服务器端应用程序没有保留状态 意思就是将资源保留在缓存或者数据库上 而非应用程序本身,这样就是 restful 无状态

但是我看了这篇文章

http://www.cnblogs.com/rainy-shurun/p/5412162.html

感觉里面的思路认为上述都是 unrestful 的,有状态的 文章提出的思路是:RESTful 架构中需要分离出 OAuth 服务,将所有的应用认证统一管理,后续的每次请求都需要通过授权服务,再转向到服务器,进行权限管理,这样,就可以将应用的验证状态分离出来,使得后端分布式变为无状态方式,之后的负载或者其他的处理,更加简单,但是,分离出来,架构复杂度提升,维护和开发、测试的成本增加。

但是这个 OAuth 服务本身难道不需要保存 session id 等会话资源吗?

3032 次点击
所在节点    问与答
9 条回复
oh
2017-06-06 02:15:01 +08:00
不需要,RESTful 普遍的做法是把一个 token 放在 header 中,和传统的 session 依赖 cookie 是不一样的。
另外校验 token 也不是非要经常另一台服务器什么的,第二段提到的 redis 更是瞎扯,redis 只是适合做这事,本身和 RESTful 没什么关系。
oh
2017-06-06 02:16:42 +08:00
所有应用统一验证是单点登录 SSO 的思路,和 RESTful 提倡的无状态也不是一个层级的东西。
esolve
2017-06-06 02:26:01 +08:00
@oh 你意思 restful 架构下,登陆的话不用在客户端 cookie 保留 session id 了?而是用 token 替代?这个 token 一直在变化?这个 token 也是资源啊。。。。服务器端也需要有保存这个 token 资源吧
oh
2017-06-06 02:31:51 +08:00
@esolve 是的,其实简单的说就是换了种方式传递类似 session id 的 token,当然标准的 token 设计更复杂,建议搜索关键词 jwt
esolve
2017-06-06 03:30:53 +08:00
@oh 但是我意思,服务端同样还是需要保留一份 token 拷贝啊
wangxiaodong
2017-06-06 04:40:06 +08:00
@esolve JWT 方式不需要服务端保留 token,因为 JWT 是自包含的,token 里边会包括你需要用到的所有信息:

{
id_token: '用户名等客户端需要的信息',
expires_in: 3600,
token_type: "Bearer"
}
kslr
2017-06-06 05:04:57 +08:00
看下 oauth 2 有助於你理解
markx
2017-06-06 09:11:06 +08:00
@esolve 上面说的 token 大概是指的 JWT。 服务器在收到包含 JWT 的请求时,不是简单地对 token 进行字符串比较; JWT 包含 session 信息和一个签名。服务器通过 JWT 签名的解析,来验证 token 的来源,然后可以获得 token 中包含的用户信息。 由于不是对 token 做字符串比较,所以服务端不需要保存每个 session id 的 token,只需要保存用于签发 token 的 secret。

具体建议还是看看 JWT。
markx
2017-06-06 09:13:12 +08:00
@esolve 我上面的回复标点符号用错了,请见谅。第二个句号本该是逗号。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/366209

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX