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

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

  •  
  •   JasonTsang · 87 天前 · 2369 次点击
    这是一个创建于 87 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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


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

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


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

    不过如果开了 HTTPS,除了 URL,其它内容都是加密传输了,理论上是安全的。
        31
    moonsola   86 天前
    传统的网站应用里,session_id 有两种传递方式:cookie 和 url 参数,一般都放 cookie 里
    开发接口时,使用 session_id 的话同样有两种传递方式:header 和 url 参数,基本都放 header 里。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4335 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 31ms · UTC 01:35 · PVG 09:35 · LAX 18:35 · JFK 21:35
    ♥ Do have faith in what you're doing.