V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JasonTsang
V2EX  ›  程序员

关于接口的 不能使用 session 哪么怎么保存常规数据?

  •  
  •   JasonTsang · 2019-07-28 14:00:09 +08:00 · 4461 次点击
    这是一个创建于 1948 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一般我们开发网站是经常 要使用到 session 去保存用户信息,哪么在接口时 因为是无状态,怎么保存一些用户信息?

    31 条回复    2019-07-29 10:41:19 +08:00
    icerhe
        1
    icerhe  
       2019-07-28 14:05:18 +08:00
    请求里带上 token/sessionId 之类的东西,通过 token/sessionId 来识别用户的身份
    JasonTsang
        2
    JasonTsang  
    OP
       2019-07-28 14:29:39 +08:00
    @icerhe 哪这些数据 正常是保存到哪?现在是无状态了
    JasonTsang
        3
    JasonTsang  
    OP
       2019-07-28 14:31:48 +08:00
    @icerhe 无状态 就是不能用 session 了,哪原来用 session 保存到数据,现在应该 用什么方式保存呢?最正规的做法又应该怎么做呢?
    jugelizi
        4
    jugelizi  
       2019-07-28 14:33:29 +08:00
    接口怎么就无状态了
    登录总有 token 之类验证身份啊
    至于你说用户数据 redis 就可以啊
    lhx2008
        5
    lhx2008  
       2019-07-28 14:36:34 +08:00 via Android
    状态保存和前后端分离无关。原来可能只是框架帮你做了。建议你先了解一下 seesion 的原理。seesion key 在客户端存在 cookie 和 localstorage 都可以
    JasonTsang
        6
    JasonTsang  
    OP
       2019-07-28 14:50:06 +08:00
    @jugelizi 大家都存数据库中么?这个是最常规的做法么? 我打算把数据放到数据库的 token 表中。就是不知这是不是常规 做法,我怕做了 发现 不规范到时 就难改。
    Caballarii
        7
    Caballarii  
       2019-07-28 14:50:33 +08:00
    信息是被加密到 token 里放在客户端保存的,客户端发送每个请求带上这个 token,服务端解密 token 就能拿到信息了
    JasonTsang
        8
    JasonTsang  
    OP
       2019-07-28 14:51:21 +08:00
    @lhx2008 我看好多人 接口中 好像不再使用 session 了。现在也不知哪个规范。session 还是原理我倒是很清楚,cookie 中每次都带着 sessionid 来访问 所以能找到 session
    JasonTsang
        9
    JasonTsang  
    OP
       2019-07-28 14:54:20 +08:00
    @Caballarii 感觉信息 还是放到服务器中好,加密保存到客户端,这个。。。
    JasonTsang
        10
    JasonTsang  
    OP
       2019-07-28 14:55:43 +08:00
    @Caballarii
    @lhx2008
    @jugelizi 你们的方法都不一样哈,一个依然用 session,有人用 redis 数据库方法,有人加密放到客户端,每次都带上。这样就迷了。。。。。。。
    EminemW
        11
    EminemW  
       2019-07-28 14:58:03 +08:00 via iPhone
    1,用框架的 session 2,自己实现一个 session 用 redis 做集群或者存表中
    frankcdf
        12
    frankcdf  
       2019-07-28 15:22:54 +08:00 via Android
    那就转移 session 到 token 中,比如 JWT
    lihongjie0209
        13
    lihongjie0209  
       2019-07-28 15:46:43 +08:00
    无状态只是相对的, 如果真的无状态, 你连登录都做不了.

    一般前后端分离的做法就是不依赖于浏览器(HTTP 协议)提供的 cookie/session 这一套东西, 方便其他类型的应用接入, 如第三方(HTTP Client), 小程序, 移动端.

    具体的实现就是把 cookie 中的 sessionID 放在每次请求的在 header 或者是请求参数中.
    mornlight
        14
    mornlight  
       2019-07-28 16:10:02 +08:00   ❤️ 2
    其实你并没有真正理解清楚。
    HTTP 协议里没有 session 这个东西,是业务层自己抽象出来的。
    「 cookie 中每次都带着 sessionid 来访问 所以能找到 session 」
    那接口里每次都带着 userId,或者能对应到 userId 的 token,和你的 sessionid 并没有区别。

    根本的逻辑是:这个请求里带了个可信任的 id,我能通过这个 id 知道访问的人是谁,以及他持有哪些数据。
    cs419
        15
    cs419  
       2019-07-28 16:45:30 +08:00
    通常 web 开发中使用的 session 是框架对会话的具体实现
    网络分层中 有会话层 一个数据库连接也是有 session 的东西
    建议先想想 会话与状态 的来龙去脉
    chinvo
        16
    chinvo  
       2019-07-28 16:49:03 +08:00
    发 token 到客户端,客户端保存起来,每次请求接口都带上 token

    和 发 cookie ( session id )到客户端本质上是一样的
    LLaMA2
        17
    LLaMA2  
       2019-07-28 17:46:55 +08:00
    理论上用户登录之后,你把用户表的 id 或者用户名密码什么的存到 client 端,然后 client 每次请求都带上这些数据,server 端肯定知道谁请求过来的。话又说回来,这样很不安全啊,用户的可以伪造或者说泄露一些数据,所以就搞成内存表( redis memchache 之类的),真实的数据是 value,发给用户的 token 就是 key 啦。然后道理还是前面的一套道理。这些数据可以丢失。毕竟不会影响到生产数据。但是稳定高效最好不过了。上面的各个大神说的都没毛病。
    xnotepad
        18
    xnotepad  
       2019-07-28 19:53:24 +08:00
    就是将原来的 sessionid 从通过 cookie 传递改成通过 header 传递,至于通过 cookie 传递的其它参数,也可以用 JWT 等方式传递。
    所以本质上是一样的,换个名字,听起来高大上而已!
    JasonTsang
        19
    JasonTsang  
    OP
       2019-07-28 20:20:26 +08:00
    @xnotepad
    @chinvo
    @lihongjie0209

    探讨个问题
    如果把 SESSION ID  放到 HEADER  上,单靠 SESSION   ID 来确认身份,如果客户端被人抓包,是不是黑客就可以带上这个 SESSION ID  登录到你的个人帐户???
    lihongjie0209
        20
    lihongjie0209  
       2019-07-28 20:24:20 +08:00
    @JasonTsang #19 你用 cookie 也会有这个问题. 所有这种类型的解决方案都会有这种问题.

    你可以给请求做签名防止请求被抓包篡改重放
    sinv
        21
    sinv  
       2019-07-28 20:49:58 +08:00 via iPhone
    好吧,楼上已经解答清楚问题了,我就来整点臭氧层子:楼主标题里用错字了,应该是“那么”。
    “那么”:nà,指示代词;
    “哪里”:nǎ,疑问代词。

    不杠,不是处女座,也不是强迫症。
    JasonTsang
        22
    JasonTsang  
    OP
       2019-07-28 21:31:58 +08:00
    @lihongjie0209 这个就有问题了,据我所知,只要 IP 变了,服务器会立刻为会话分配一个新的 session_id 的,而你只把 session_id 放到 header 中,在代码里获取这个 session_id 这样是无法感知用户的上网环境变化的。所以原来人家在 cookie 中携带 session_id 是有 HTTP 大框架的支持。
    xy90321
        23
    xy90321  
       2019-07-28 21:37:09 +08:00 via iPhone
    @JasonTsang
    概念要清楚,session id 只是用来给你识别的
    客户端防爆破应该靠密码和本地加密( which 现在又客户端设备自主提供)
    网络传输层则由你实现,依靠 https 或者 其他不对称加密手段
    lihongjie0209
        24
    lihongjie0209  
       2019-07-28 21:38:04 +08:00
    @JasonTsang #22

    首先服务器分配 session 这个是具体的实现, 有不同的策略可以定制.

    其次 sessionId 什么时候发送, 怎么发送, 现在都脱离的浏览器的 cookie/session 这种默认全自动的方式, 都需要前端(客户端)写代码决定. 不需要服务器根据用户的 IP 做什么处理.


    举个例子, 我们的应用服务器部署了 3 个节点, IP 分别为 A,B,C, 但是这三个节点都会去使用同一个微信的 accessToken 和微信服务器通信, 微信不会因为我们的 IP 变化就把请求拒绝.
    way2create
        25
    way2create  
       2019-07-28 21:46:27 +08:00
    归根究底都是要个 id 来区分 session 至于数据安全是其他层面的问题了
    xiaotuzi
        26
    xiaotuzi  
       2019-07-28 21:52:21 +08:00 via iPhone
    我觉得绝对安全是没法做到的,web 应用基本上只要获取发送头部数据及 cookie 基本就有可能被盗用。
    而我觉得数据交互过程中进行过加密,那么就算你获取到了数据,也不清楚里面的内容是什么(不看源码的情况下),所以一定程度保证了安全性。
    zjsxwc
        27
    zjsxwc  
       2019-07-28 21:59:22 +08:00 via Android
    接口无状态说白了,
    就是把数据保存到客户端自己里面,
    服务端不保存数据,
    于是相对于传统的 session 减少了服务端查询数据数据库、加载数据负担,
    每次客户端请求接口会带上用户的所有数据,
    换句话说就是通过带宽减轻服务器压力,

    简单来说,没有数据库等存储权限的服务器,只提供执行逻辑的服务就是无状态服务。
    zjsxwc
        28
    zjsxwc  
       2019-07-28 22:01:09 +08:00 via Android
    @zjsxwc #27 原文:“接口无状态说白了,就是把数据保存到客户端自己里面,服务端不保存数据,于是相对于传统的 session 减少了服务端查询数据数据库、加载数据负担,每次客户端请求接口会带上用户的所有数据,换句话说就是通过带宽减轻服务器压力,简单来说,没有数据库等存储权限的服务器,只提供执行逻辑的服务就是无状态服务。”


    回复:可以通过 rsa 不对称加密来防止客户端发过来的数据被篡改。
    icy37785
        29
    icy37785  
       2019-07-28 22:22:30 +08:00 via iPhone
    楼主自己把自己绕晕了,其实还是有些概念混淆了。无状态跟有状态区别不是那么大的,只是把原来 cookie 里的东西放 token 里了。
    xnotepad
        30
    xnotepad  
       2019-07-29 09:23:31 +08:00
    @JasonTsang cooke 也能被抓,一样的。

    不过如果开了 HTTPS,除了 URL,其它内容都是加密传输了,理论上是安全的。
    moonsola
        31
    moonsola  
       2019-07-29 10:41:19 +08:00
    传统的网站应用里,session_id 有两种传递方式:cookie 和 url 参数,一般都放 cookie 里
    开发接口时,使用 session_id 的话同样有两种传递方式:header 和 url 参数,基本都放 header 里。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3371 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:20 · PVG 20:20 · LAX 04:20 · JFK 07:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.