在普通的 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 等会话资源吗?
1
oh 2017-06-06 02:15:01 +08:00 via iPhone
不需要,RESTful 普遍的做法是把一个 token 放在 header 中,和传统的 session 依赖 cookie 是不一样的。
另外校验 token 也不是非要经常另一台服务器什么的,第二段提到的 redis 更是瞎扯,redis 只是适合做这事,本身和 RESTful 没什么关系。 |
2
oh 2017-06-06 02:16:42 +08:00 via iPhone
所有应用统一验证是单点登录 SSO 的思路,和 RESTful 提倡的无状态也不是一个层级的东西。
|
3
esolve OP @oh 你意思 restful 架构下,登陆的话不用在客户端 cookie 保留 session id 了?而是用 token 替代?这个 token 一直在变化?这个 token 也是资源啊。。。。服务器端也需要有保存这个 token 资源吧
|
4
oh 2017-06-06 02:31:51 +08:00 via iPhone
@esolve 是的,其实简单的说就是换了种方式传递类似 session id 的 token,当然标准的 token 设计更复杂,建议搜索关键词 jwt
|
6
wangxiaodong 2017-06-06 04:40:06 +08:00
@esolve JWT 方式不需要服务端保留 token,因为 JWT 是自包含的,token 里边会包括你需要用到的所有信息:
{ id_token: '用户名等客户端需要的信息', expires_in: 3600, token_type: "Bearer" } |
7
kslr 2017-06-06 05:04:57 +08:00 via Android
看下 oauth 2 有助於你理解
|