服务端的session(身份验证)和客户端的session(存储)你是不是听混了?
前端存储三种方式
名称 | 存储 大小 | 消失时间 | 新建窗口 |
---|---|---|---|
cookie | 不能超过4K | 可以设置过期时间(http请求会携带) | 同源共享(可以设置子域共享) |
sessionStorage | 最大5M | 页面会话在浏览器打开期间一直保持,并且重新加载或恢复页面仍会保持原来的页面会话,关闭对应浏览器标签或窗口,会清除对应的 sessionStorage | 打开多个相同的 URL 的 Tabs 页面,会创建各自的 sessionStorage(同源窗口不能共享) |
localStorage | 最大5M | 长期有效(以文件的形式存储在硬盘) | 同源共享 |
后端身份验证两种方式
前言:HTTP请求是无状态的,也就是不知道这一次的请求和上一次请求是否有关系,比如我们登录一个系统的时候,验证用户名密码之后,打开系统各个页面的时候就不需要再进行登录操作了,直到我们主动退出登录或超时退出登录;这里为了避免访问每个都登录一下,就要用到session和token。
所以总听到后端说的session到底是啥?
其实后端说的session就是上面所说的用与区分用户信息与登录态的一串值,由后台返回写入到客户端的cookie里,然后每次HTTP请求就带着这个所谓的session到服务端用于服务端进行相关验证。
所以:服务端所说的seesion并不是我们客户端的sessionStorage!
服务端身份验证的两种方式对比:
名称 | 工作原理 | 优点 | 缺点 |
---|---|---|---|
cookie + session | session由服务端生成,保存在服务器的缓存中(redis),服务端通过 set-cookie 把对应的sessionId写入到客户端的cookie里。在下次的请求带上cookie(自动)用于身份验证。 | 适用于子域免登录(例如:主域的应用登录了那么其他子域的应用可以直接共用这个域的cookie验证实现免登录) | 存放在redis中必须依赖服务器,暂用服务器资源、不支持跨端有些前端技术不支持Cookie(如微信小程序) |
token | 当客户端第一次访问服务端,服务端会根据传过来的账号,查询对应的用户信息(userid)再运用一些加密算法生成一个token。当客户端下次请求时,需要带上token(手动添加到请求头里)服务器收到请求后,会验证这个token。 | 支持跨域访问、适用接口跨平台、不存在CSRF攻击 | 每次都要解密token很浪费算力资源、Jwt是无状态的,如果别人获取到了,别人也能用 |