关于 restful 无状态和 session id 登陆的理解 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
esolve
V2EX    问与答

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

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

    在普通的 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     Solana     4586 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 03:57 PVG 11:57 LAX 19:57 JFK 22:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86