V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
gdtv
V2EX  ›  问与答

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

  •  
  •   gdtv · 2016-03-30 12:35:56 +08:00 · 3751 次点击
    这是一个创建于 2963 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 。

    方式五:
    请提供


    请问一般使用什么方式呢?谢谢。
    13 条回复    2016-03-30 19:58:54 +08:00
    jugelizi
        1
    jugelizi  
       2016-03-30 12:58:36 +08:00
    第二种为什么失效?因为你没有设置 sessionid 的有效期呀
    cszchen
        2
    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
        3
    jones  
       2016-03-30 13:54:12 +08:00
    看 Rails 的 ActionDispatch::Session::CookieStore ,直接山寨一份即可
    f0rger
        4
    f0rger  
       2016-03-30 14:16:27 +08:00 via iPhone
    一般使用方式 3 吧,然后把某个或者全部校验用的设置为 http-only 。
    3dwelcome
        5
    3dwelcome  
       2016-03-30 14:47:14 +08:00
    用会过期的 auth_id 飘过。
    gamexg
        6
    gamexg  
       2016-03-30 15:16:35 +08:00 via Android
    如果想支持查询已登录的会话就用 4 ,一般只用 session 即可。
    方法 3 需要将密码也加入 token ,达到修改密码后所有已登录的会话全部失效。
    holyghost
        7
    holyghost  
       2016-03-30 15:22:03 +08:00
    hqfzone
        8
    hqfzone  
       2016-03-30 16:09:51 +08:00
    @gamexg 密码加入?不至于吧……
    gamexg
        9
    gamexg  
       2016-03-30 17:58:40 +08:00 via Android
    @hqfzone 密码加入是比较方便的解决更改密码后注销已登录会话的办法。当然不是直接将原始密码保存下来,而是将数据库保存的 hash 后的密码加入 token 参数里面。
    skydiver
        10
    skydiver  
       2016-03-30 18:02:49 +08:00
    第二种怎么就不行了
    session 实际上就是 cookie 存一个 sessionid , cookie 能做到的 session 也能做到
    kirisetsz
        11
    kirisetsz  
       2016-03-30 18:18:12 +08:00
    一个 userId 然后用 HMAC 校验
    clino
        12
    clino  
       2016-03-30 18:40:30 +08:00 via Android
    我觉得一般是第四种吧
    hqfzone
        13
    hqfzone  
       2016-03-30 19:58:54 +08:00
    @gamexg 加个标记即可,比如改密时间。有些网站在改密码时可以选择是否让原有登录失效,加密码当然简单,但显然不太好。
    ……我是外行,我猜的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   981 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:39 · PVG 04:39 · LAX 13:39 · JFK 16:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.