V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
esolve
V2EX  ›  问与答

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

  •  1
     
  •   esolve · 2017-06-06 01:58:27 +08:00 · 3112 次点击
    这是一个创建于 2732 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在普通的 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 等会话资源吗?

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

    {
    id_token: '用户名等客户端需要的信息',
    expires_in: 3600,
    token_type: "Bearer"
    }
    kslr
        7
    kslr  
       2017-06-06 05:04:57 +08:00 via Android
    看下 oauth 2 有助於你理解
    markx
        8
    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
        9
    markx  
       2017-06-06 09:13:12 +08:00
    @esolve 我上面的回复标点符号用错了,请见谅。第二个句号本该是逗号。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1109 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:48 · PVG 06:48 · LAX 14:48 · JFK 17:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.