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

2019-07-28 14:00:09 +08:00
 JasonTsang

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

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

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

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

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

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

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

你可以给请求做签名防止请求被抓包篡改重放

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/586885

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX