V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxc1234
V2EX  ›  程序员

关于浏览器登录状态的保存

  •  
  •   zxc1234 · 2020-05-05 21:07:16 +08:00 · 3051 次点击
    这是一个创建于 1654 天前的主题,其中的信息可能已经有所发展或是发生改变。

    面试被问到相关-没答好,挂了

    问:浏览器是怎么保持登录状态的,就是你登录一次后过段时间不用再登录

    答:登录的时候,用户输入用户名密码,会走到公司的统一验证中心 portal,验证成功,会返回一个 token,

    用户每次请求或者刷新网页的时候会携带这个 token,然后走到 portal 验证中心,只要 token 没过期,用户就不用重

    新登录。

    大佬们能帮我看看我哪里答错了,或者怎么答比较好,多谢!

    10 条回复    2020-05-05 22:31:56 +08:00
    yuzo555
        1
    yuzo555  
       2020-05-05 21:15:24 +08:00
    他是问浏览器,不是问你服务端实现机制。
    浏览器就是对 Cookie 的处理呗
    zxc1234
        2
    zxc1234  
    OP
       2020-05-05 21:17:50 +08:00
    @yuzo555 cookie ?不是 token 吗? token,cookie,session 我搞晕了
    superrichman
        3
    superrichman  
       2020-05-05 21:34:14 +08:00 via iPhone
    token 存在 cookie 里,随请求一起传输
    vzyw
        4
    vzyw  
       2020-05-05 22:03:19 +08:00
    session 是后端的概念,session 本质目的就是后端需要区分出每次请求是哪个用户产生的。用 token 的情况下,就是找到这个 token 对应的用户,用 cookie 就是找到这个 cookie 对应的用户,token 、cookie 本质都是一串字符串,一般做法是后端在 redis 里存每个 token\session 对应的 user_id

    前后端分离的情况下,token 一般是前端存在 localstorage 中 ,在进行 xhr 请求时放在 herder 的一个字段里面,一般是 authorization 字段

    非分离的情况下一般用 cookie,这时也基本上没有 xhr 类型的请求,也没有跨域请求,所以 cookie 会随着 get 或者 post 一同提交到后端

    跨域请求 /xhr 类型请求也可以设置 cookie 并且可以自动带上 cookie,具体内容要查一下文档,忘记了
    also24
        5
    also24  
       2020-05-05 22:04:53 +08:00
    又到了搬出这篇文章的时候了

    https://www.v2ex.com/t/656457
    darknoll
        6
    darknoll  
       2020-05-05 22:15:23 +08:00 via Android
    应该是回答 cookie 或者 localstorage 这些
    also24
        7
    also24  
       2020-05-05 22:22:03 +08:00
    不管是纯粹的 token 机制,亦或者各类 Session 机制,其本身的目的都是为了对用户进行识别或鉴权。
    那么核心关注点就三个部分:
    - 用什么东西、什么方式来进行识别鉴权
    - 用来识别鉴权的这个东西,存储在客户端什么位置
    - 客户端如何将这个东西发送给服务端

    以下,是各种不同机制中,用来识别鉴权所用的 [凭据] :
    Token (也包括 JWT 等特定协议)
    Session-ID ( Server Side Session )
    Session-Data ( Client Side Session )


    以下,是可以用来存储上述凭据的介质:
    Cookie
    localStorage / sessionStorage
    URL / HTML


    以下,是用来发送上述凭据的机制:
    Cookie 自动携带(这是 Cookie 特殊的一点,既是存储容器,也是发送机制)
    自己在 Ajax 请求中加 Header 或加其它字段
    直接加在 Request URL 或 Form 上
    johnsona
        8
    johnsona  
       2020-05-05 22:24:11 +08:00
    1.cookie 呢,就是返回头有个 set-cookie,让浏览器保存 cookie,cookie 是保存在浏览器
    2.session 呢是浏览器和服务端都保存,服务端给一个 sessionid 存 cookie,下次请求带上这个 cookie,服务端拿着 sessionid 去数据库或者缓存区查,这种 session 方案是依赖于 cookie
    3.token 就是存在浏览器的 localstorage,下次请求带上这个 token,服务端再去存储中找 token 确定用户
    4.还有一种 token,叫 jwt,和 cookie 很像,也是存浏览器,比如 localstorage,但是存浏览器的话,服务端就没办法把他 revoke 掉,也就取消,没办法退出登录
    此外还有 sessionstorage,VUE 还有个 vuex 状态存储
    然依赖 cookie 的 session 方案不好解决跨域的问题,比如你的 cookie 是设置在这个域下面的,那请求另外一个域,不会带上这个 cookie,或者你要用 js 去操作这个域(开始胡说八道),那你的 cookie 就不能是 http only
    然后 sessionstorage 我还不会,你去百度一下,然后告诉我,阿里嘎多
    xuanbg
        9
    xuanbg  
       2020-05-05 22:24:53 +08:00
    4 楼正解,比较合理的做法是存 localstorage,毕竟 cookie 是每次请求都会带着走的,一来浪费流量,二来会暴露在网络上,没有存本地安全。
    also24
        10
    also24  
       2020-05-05 22:31:56 +08:00
    另外需要注意的是,非常非常多的关于 Session 的文章都会出现以下误解:
    1 、将 Server Side Session 当成了 Session 机制的全部,误以为 Session Data 一定存储在服务端。
    2 、将 Cookie 当成了 Session-ID 的唯一存储位置,误以为 Session 机制和 Cookie 是绑定关系。
    3 、将 JWT 当成了 Client Side Session 的唯一实现,误以为 JWT 和 Session 机制互为对手关系。

    // 当然,很多面试官自己其实也存在这样的误解。只是为了面试的话,倒也是没太大所谓。
    // and 其实这楼里已经好几个朋友出现相应的误解了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2831 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 11:33 · PVG 19:33 · LAX 03:33 · JFK 06:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.