lxk11153
2020-02-06 19:02:29 +08:00
为什么会有密码放 cookie 里?不会呀
0.1 登录不登录,都会有 sessionId 的,用来标识属于相同的会话(比如浏览器 A 访问是 sIdA,浏览器 B 访问是 sIdB,浏览器 A 里刷新一下的这次请求用什么来标识属于浏览器 A ?就是这个 sessionId,不然服务器区分不了)
0.2 cookie, session 属于 HTTP 相关,都会有的,至于下面 1,2 的标题只是按实现来区分,并不是说 2 就没有 cookie 和 session 了
0.3 cookie 里用什么 name 来存 sessionId 的值,由各类型服务器自定
1. cookie + session
客户端: cookie 里存 sessionId (一串可以说是无意义的字符,maybe 类 uuid 之类的格式)
服务端: session,可以看做 Map1<sessionId, Map2<String, ?>>结构,存在服务器程序内存中
服务端收到登录请求,从请求里取到 cookie 取到 sessionId,然后把需要的用户信息存入 Map2 中
服务端收到后续请求,从请求里取到 cookie 取到 sessionId,然后取到 Map2 的用户即为当前登录用户
So: 当存在多台服务器来负载就存在一个问题,当前页面里的请求 A 分配到服务器 A,请求 B 却分配到了服务器 B,就会导致请求 B 是无登录用户状态。解决方案比如同一个请求 IP 分配到同一个服务器这样的初级方案,但不排除 ip 变更了,所以把 session 集中化存储是可行方案(比如存到同一个库 /redis 里)
2. token / jwt
简单理解 maybe(猜的):
服务器根据登录请求把需要的用户信息加密后返回,客户端拿到后存在 cookie 里
服务器收到后续请求,获得这个加密信息解密后即为当前登录用户
这样:服务端 session 也减少了存储,负载情况下也不需要单独的资源来集中存储 session。反正各有优缺点吧。