有后端同学给我讲一下判断是否登录吗?

2020-02-03 14:23:16 +08:00
 firhome
我是前端,利用假期时间在家想学习 后端知识。

目前遇到的问题就是关于登录这块。

就我目前来说我知道的。

1.登录后,账号,密码(加密)放 cookie 里 [不安全不推荐]

2.登录后生成一个 sessionId 放到客户端 cookie 里。只放 session 的话 不保险(资源和重启服务),所以要 session + Redis

3.jwt ???

这个 jwt 我就有点云里雾里 不太懂,我自己理解下来 就是 把自定义的文本信息加密(类似图片转 base64 编码)后,把加密后的 key 给客户端,然后客户端每次访问 header 里带这个 key 过来就行。key 里加密的时候定义过期时间,服务端拿到后解密,所以服务端也不用存任何东西。

但是我的疑问来了。那么这个 key 是不是任何人拿到了都可以通过验证?服务端提前生成了 key,所以没办法在过期日期前让 key 失效? 所以失效的办法只有更改服务端的加密算法,让所有的 key 都失效而达到目的?


以上是我的疑问和理解,不知道是否正确。希望后端同学帮忙指导一下,谢谢~
6762 次点击
所在节点    程序员
29 条回复
nvkou
2020-02-04 02:09:19 +08:00
jwt 在 header 里的话,header 加个 ref 不就能知道请求页面 URL 了?不就能防御了?
676529483
2020-02-04 09:20:21 +08:00
@freakxx key 本来就没法解决中间人劫持的问题,毕竟 http 是无状态的。想要限制可以用时间戳来生成签名,避免重放攻击。当然,如果攻击者连你生成签名的源码都有,没法根本排除,比如爬虫,只是增加了攻击成本
wangyzj
2020-02-04 13:58:24 +08:00
@justfindu #2 这个问题我也困扰过
吊销凭证如果价格 blacklist 是不是就失去了 jwt 的优势了
能否有更好的办法尽量避免 io
justfindu
2020-02-04 14:29:15 +08:00
@wangyzj #23 设置更短的有效时间
wangyzj
2020-02-04 14:43:12 +08:00
@justfindu 那看来是没有及时生效的方案了
justfindu
2020-02-04 15:12:23 +08:00
@wangyzj #25 看你自己系统取舍, 任何都是有 IO 的,
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。反正各有优缺点吧。
lxk11153
2020-02-07 14:15:40 +08:00
fix #27 比如 Nginx 搭的静态文件服务器就没有 cookie 和 session 了,所以上面说的也要做调整。懂我意思就行
wanguorui123
2020-02-29 17:01:58 +08:00

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

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

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

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

© 2021 V2EX