请问应该如何安全地将用户的登录信息保存在 cookie 里?

2016-03-30 12:35:56 +08:00
 gdtv
cookie 里该保存哪些参数呢?

方式一:
user_name: gdtv
读取到 user_name 即表示已登录,显然这种很不安全

方式二:
存到 session 里
这种方式似乎不能“记住密码”?关闭浏览器再打开就失效了。

方式三:
user_name: gdtv
exxpired_time: xxx
rand_string: kfjherogelw34535
token: md5(user_name+salt+exxpired_time+rand_string)
读取到 user_name ,并且校验 token 通过,表示已登录

方式四:
auth_id: HUIFELK6832579824
在服务器端建一个数据表(数据库或者内存表)存放已登录用户信息,根据读取到的 auth_id 去查询,查到了就表示已登录。类似于 php 的 session 。

方式五:
请提供


请问一般使用什么方式呢?谢谢。
3757 次点击
所在节点    问与答
13 条回复
jugelizi
2016-03-30 12:58:36 +08:00
第二种为什么失效?因为你没有设置 sessionid 的有效期呀
cszchen
2016-03-30 13:07:09 +08:00
第一次登录
1.用户输入用户密码登录
2.验证通过后,保存用户 id 到 session 和 cookie ( cookie 要加密并设置有效期)
3.每次请求都通过用户 id 在数据库查一次
关闭浏览器后再次打开
1.解密 cookie 后,发现有用户 id
2.通过 id 从数据库查找用户
3.确认无误后执行登录操作
4.保存 session 和 cookie (以后的步骤同上)
jones
2016-03-30 13:54:12 +08:00
看 Rails 的 ActionDispatch::Session::CookieStore ,直接山寨一份即可
f0rger
2016-03-30 14:16:27 +08:00
一般使用方式 3 吧,然后把某个或者全部校验用的设置为 http-only 。
3dwelcome
2016-03-30 14:47:14 +08:00
用会过期的 auth_id 飘过。
gamexg
2016-03-30 15:16:35 +08:00
如果想支持查询已登录的会话就用 4 ,一般只用 session 即可。
方法 3 需要将密码也加入 token ,达到修改密码后所有已登录的会话全部失效。
holyghost
2016-03-30 15:22:03 +08:00
hqfzone
2016-03-30 16:09:51 +08:00
@gamexg 密码加入?不至于吧……
gamexg
2016-03-30 17:58:40 +08:00
@hqfzone 密码加入是比较方便的解决更改密码后注销已登录会话的办法。当然不是直接将原始密码保存下来,而是将数据库保存的 hash 后的密码加入 token 参数里面。
skydiver
2016-03-30 18:02:49 +08:00
第二种怎么就不行了
session 实际上就是 cookie 存一个 sessionid , cookie 能做到的 session 也能做到
kirisetsz
2016-03-30 18:18:12 +08:00
一个 userId 然后用 HMAC 校验
clino
2016-03-30 18:40:30 +08:00
我觉得一般是第四种吧
hqfzone
2016-03-30 19:58:54 +08:00
@gamexg 加个标记即可,比如改密时间。有些网站在改密码时可以选择是否让原有登录失效,加密码当然简单,但显然不太好。
……我是外行,我猜的。

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

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

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

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

© 2021 V2EX