cookie
- http 无状态,每次请求都要带cookie,以帮助识别身份
- 服务端也可以向客户端set-cookie,cookie大小限制4kb
- 默认有跨域限制:不可跨域共享、传递cookie
不跨域共享
不跨域传递
解决方案
withCredentials
cookie本地存储
- HTML5 之前cookie常被用于本地存储
- HTML5 之后推荐使用localStorage 和 sessionStorage
现代浏览器开始禁止第三方cookie
- 和跨域限制不同。这里是禁止网页引用第三方JS设置cookie
- 打击第三方广告,保护用户隐私
- 新增属性 SameSite:strict/ Lax /None;值可自己选择
cookie 和 session
- cookie用于登录验证,存储用户标识(如userId)
- session在服务端,存储用户详细信息,和cookie信息一一对应
- cookie + session 是常见的登录验证解决方案
过程
- cookie 一对一
- session 存储很多
token vs cookie
- cookie 是 HTTP 规范,而token是自定义传递
- cookie 会默认被浏览器存储,而token需自己存储
- token默认没有跨域限制
JWT (JSON Web Token)
- 前端发起登录,后端验证成功之后,返回一个加密的token
- 前端自行存储这个token(其中包含了用户信息,加密了)
- 以后访问服务端接口,都要带着这个token,作为用户信息
答案
- cookie:http标准;跨域限制;配合session使用
- token:无标准;无跨域限制;用于JWT
Session 和 JWT 哪个更好?
session优点
- 原理简单,易于学习
- 用户信息存储在服务端,可快速封禁某个用户
session 缺点
- 占用服务端内存,硬件成本高
- 多进程,多服务器时,不好同步 - 需要使用第三方缓存,如redis
- 默认有跨域限制
JWT 优点
- 不占服务端内存
- 多进程、多服务器不受影响
- 没有跨域限制
JWT缺点
- 用户信息存储在客户端,无法快速封禁某用户(可建立黑名单)
- 万一服务端密钥被泄漏,则用户信息全部丢失
- token体积一般大于cookie,会增加请求的数据量
答案
- 如果有严格管理用户信息的需求(保密、快速封禁)推荐session
- 如没有特殊要求,则使用JWT(如创业初期的网站)
如何实现SSO单点登录
什么是单点登录,登录百度之后,点击百度地图也自动登录
基于cookie
- cookie默认不可跨域共享,但有些情况下可以设置为共享
- 主域名相同,如www.baidu.com image.baidu.com
- 设置cooki domain为主域名,则可共享cookie
SSO(第三方独立)
- 主域名完全不同,则cookie无法共享
- 可使用SSO技术方案
OAuth 2.0(第三方验证登录)
答案
- 主域名相同,则可共享cookie
- 主域名不同,则需使用SSO