关于接口的 不能使用 session 哪么怎么保存常规数据? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成内容
JasonTsang
V2EX    程序员

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

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

    一般我们开发网站是经常 要使用到 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
    &nbs;   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     Solana     2667 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 09:46 PVG 17:46 LAX 02:46 JFK 05:46
    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