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

2020-05-05 21:07:16 +08:00
 zxc1234

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

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

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

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

新登录。

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

2960 次点击
所在节点    程序员
10 条回复
yuzo555
2020-05-05 21:15:24 +08:00
他是问浏览器,不是问你服务端实现机制。
浏览器就是对 Cookie 的处理呗
zxc1234
2020-05-05 21:17:50 +08:00
@yuzo555 cookie ?不是 token 吗? token,cookie,session 我搞晕了
superrichman
2020-05-05 21:34:14 +08:00
token 存在 cookie 里,随请求一起传输
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
2020-05-05 22:04:53 +08:00
又到了搬出这篇文章的时候了

https://www.v2ex.com/t/656457
darknoll
2020-05-05 22:15:23 +08:00
应该是回答 cookie 或者 localstorage 这些
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
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
2020-05-05 22:24:53 +08:00
4 楼正解,比较合理的做法是存 localstorage,毕竟 cookie 是每次请求都会带着走的,一来浪费流量,二来会暴露在网络上,没有存本地安全。
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 其实这楼里已经好几个朋友出现相应的误解了。

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

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

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

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

© 2021 V2EX