一般我们开发网站是经常 要使用到 session 去保存用户信息,哪么在接口时 因为是无状态,怎么保存一些用户信息?
1
icerhe 2019-07-28 14:05:18 +08:00
请求里带上 token/sessionId 之类的东西,通过 token/sessionId 来识别用户的身份
|
2
JasonTsang OP @icerhe 哪这些数据 正常是保存到哪?现在是无状态了
|
3
JasonTsang OP @icerhe 无状态 就是不能用 session 了,哪原来用 session 保存到数据,现在应该 用什么方式保存呢?最正规的做法又应该怎么做呢?
|
4
jugelizi 2019-07-28 14:33:29 +08:00
接口怎么就无状态了
登录总有 token 之类验证身份啊 至于你说用户数据 redis 就可以啊 |
5
lhx2008 2019-07-28 14:36:34 +08:00 via Android
状态保存和前后端分离无关。原来可能只是框架帮你做了。建议你先了解一下 seesion 的原理。seesion key 在客户端存在 cookie 和 localstorage 都可以
|
6
JasonTsang OP @jugelizi 大家都存数据库中么?这个是最常规的做法么? 我打算把数据放到数据库的 token 表中。就是不知这是不是常规 做法,我怕做了 发现 不规范到时 就难改。
|
7
Caballarii 2019-07-28 14:50:33 +08:00
信息是被加密到 token 里放在客户端保存的,客户端发送每个请求带上这个 token,服务端解密 token 就能拿到信息了
|
8
JasonTsang OP @lhx2008 我看好多人 接口中 好像不再使用 session 了。现在也不知哪个规范。session 还是原理我倒是很清楚,cookie 中每次都带着 sessionid 来访问 所以能找到 session
|
9
JasonTsang OP @Caballarii 感觉信息 还是放到服务器中好,加密保存到客户端,这个。。。
|
10
JasonTsang OP @Caballarii
@lhx2008 @jugelizi 你们的方法都不一样哈,一个依然用 session,有人用 redis 数据库方法,有人加密放到客户端,每次都带上。这样就迷了。。。。。。。 |
11
EminemW 2019-07-28 14:58:03 +08:00 via iPhone
1,用框架的 session 2,自己实现一个 session 用 redis 做集群或者存表中
|
12
frankcdf 2019-07-28 15:22:54 +08:00 via Android
那就转移 session 到 token 中,比如 JWT
|
13
lihongjie0209 2019-07-28 15:46:43 +08:00
无状态只是相对的, 如果真的无状态, 你连登录都做不了.
一般前后端分离的做法就是不依赖于浏览器(HTTP 协议)提供的 cookie/session 这一套东西, 方便其他类型的应用接入, 如第三方(HTTP Client), 小程序, 移动端. 具体的实现就是把 cookie 中的 sessionID 放在每次请求的在 header 或者是请求参数中. |
14
mornlight 2019-07-28 16:10:02 +08:00 2
其实你并没有真正理解清楚。
HTTP 协议里没有 session 这个东西,是业务层自己抽象出来的。 「 cookie 中每次都带着 sessionid 来访问 所以能找到 session 」 那接口里每次都带着 userId,或者能对应到 userId 的 token,和你的 sessionid 并没有区别。 根本的逻辑是:这个请求里带了个可信任的 id,我能通过这个 id 知道访问的人是谁,以及他持有哪些数据。 |
15
cs419 2019-07-28 16:45:30 +08:00
通常 web 开发中使用的 session 是框架对会话的具体实现
网络分层中 有会话层 一个数据库连接也是有 session 的东西 建议先想想 会话与状态 的来龙去脉 |
16
chinvo 2019-07-28 16:49:03 +08:00
发 token 到客户端,客户端保存起来,每次请求接口都带上 token
和 发 cookie ( session id )到客户端本质上是一样的 |
17
LLaMA2 2019-07-28 17:46:55 +08:00
理论上用户登录之后,你把用户表的 id 或者用户名密码什么的存到 client 端,然后 client 每次请求都带上这些数据,server 端肯定知道谁请求过来的。话又说回来,这样很不安全啊,用户的可以伪造或者说泄露一些数据,所以就搞成内存表( redis memchache 之类的),真实的数据是 value,发给用户的 token 就是 key 啦。然后道理还是前面的一套道理。这些数据可以丢失。毕竟不会影响到生产数据。但是稳定高效最好不过了。上面的各个大神说的都没毛病。
|
18
xnotepad 2019-07-28 19:53:24 +08:00
就是将原来的 sessionid 从通过 cookie 传递改成通过 header 传递,至于通过 cookie 传递的其它参数,也可以用 JWT 等方式传递。
所以本质上是一样的,换个名字,听起来高大上而已! |
19
JasonTsang OP @xnotepad
@chinvo @lihongjie0209 探讨个问题 如果把 SESSION ID 放到 HEADER 上,单靠 SESSION ID 来确认身份,如果客户端被人抓包,是不是黑客就可以带上这个 SESSION ID 登录到你的个人帐户??? |
20
lihongjie0209 2019-07-28 20:24:20 +08:00
|
21
sinv 2019-07-28 20:49:58 +08:00 via iPhone
好吧,楼上已经解答清楚问题了,我就来整点臭氧层子:楼主标题里用错字了,应该是“那么”。
“那么”:nà,指示代词; “哪里”:nǎ,疑问代词。 不杠,不是处女座,也不是强迫症。 |
22
JasonTsang OP @lihongjie0209 这个就有问题了,据我所知,只要 IP 变了,服务器会立刻为会话分配一个新的 session_id 的,而你只把 session_id 放到 header 中,在代码里获取这个 session_id 这样是无法感知用户的上网环境变化的。所以原来人家在 cookie 中携带 session_id 是有 HTTP 大框架的支持。
|
23
xy90321 2019-07-28 21:37:09 +08:00 via iPhone
@JasonTsang
概念要清楚,session id 只是用来给你识别的 客户端防爆破应该靠密码和本地加密( which 现在又客户端设备自主提供) 网络传输层则由你实现,依靠 https 或者 其他不对称加密手段 |
24
lihongjie0209 2019-07-28 21:38:04 +08:00
@JasonTsang #22
首先服务器分配 session 这个是具体的实现, 有不同的策略可以定制. 其次 sessionId 什么时候发送, 怎么发送, 现在都脱离的浏览器的 cookie/session 这种默认全自动的方式, 都需要前端(客户端)写代码决定. 不需要服务器根据用户的 IP 做什么处理. 举个例子, 我们的应用服务器部署了 3 个节点, IP 分别为 A,B,C, 但是这三个节点都会去使用同一个微信的 accessToken 和微信服务器通信, 微信不会因为我们的 IP 变化就把请求拒绝. |
25
way2create 2019-07-28 21:46:27 +08:00
归根究底都是要个 id 来区分 session 至于数据安全是其他层面的问题了
|
26
xiaotuzi 2019-07-28 21:52:21 +08:00 via iPhone
我觉得绝对安全是没法做到的,web 应用基本上只要获取发送头部数据及 cookie 基本就有可能被盗用。
而我觉得数据交互过程中进行过加密,那么就算你获取到了数据,也不清楚里面的内容是什么(不看源码的情况下),所以一定程度保证了安全性。 |
27
zjsxwc 2019-07-28 21:59:22 +08:00 via Android
接口无状态说白了,
就是把数据保存到客户端自己里面, 服务端不保存数据, 于是相对于传统的 session 减少了服务端查询数据数据库、加载数据负担, 每次客户端请求接口会带上用户的所有数据, 换句话说就是通过带宽减轻服务器压力, 简单来说,没有数据库等存储权限的服务器,只提供执行逻辑的服务就是无状态服务。 |
28
zjsxwc 2019-07-28 22:01:09 +08:00 via Android
@zjsxwc #27 原文:“接口无状态说白了,就是把数据保存到客户端自己里面,服务端不保存数据,于是相对于传统的 session 减少了服务端查询数据数据库、加载数据负担,每次客户端请求接口会带上用户的所有数据,换句话说就是通过带宽减轻服务器压力,简单来说,没有数据库等存储权限的服务器,只提供执行逻辑的服务就是无状态服务。”
回复:可以通过 rsa 不对称加密来防止客户端发过来的数据被篡改。 |
29
icy37785 2019-07-28 22:22:30 +08:00 via iPhone
楼主自己把自己绕晕了,其实还是有些概念混淆了。无状态跟有状态区别不是那么大的,只是把原来 cookie 里的东西放 token 里了。
|
30
xnotepad 2019-07-29 09:23:31 +08:00
|
31
moonsola 2019-07-29 10:41:19 +08:00
传统的网站应用里,session_id 有两种传递方式:cookie 和 url 参数,一般都放 cookie 里
开发接口时,使用 session_id 的话同样有两种传递方式:header 和 url 参数,基本都放 header 里。 |