tiantingrui / daily-harvest

记录每日收获
MIT License
2 stars 0 forks source link

网络请求中,token和cookie有什么区别? #41

Open tiantingrui opened 2 years ago

tiantingrui commented 2 years ago

ookie

  1. http无状态,每次请求都要带 cookie,以帮助识别身份
  2. 服务端也可以向客户端 set-cookie,cookie大小限制 4kb
  3. 默认有跨域限制:不可跨域共享、传递cookie

如何跨域传递cookie?

设置withCredentials

cookie本地存储

  1. Html5 之前 cookie 常被用于本地存储
  2. Html5 之后推荐使用 localStorage 和 sessionStorage

现代浏览器开始禁止第三方cookie

  1. 和跨域限制不同。这里是:禁止网页引入的第三方JS设置 cookie
  2. 打击第三方广告,保护用户隐私
  3. 新增属性 SameSite:Strict/Lax/None 值可自己选择

cookie和session

  1. Cookie 用于登录验证,存储用户标识(如userId)
  2. session 在服务端,存储用户详细信息,和cookie信息一一对一
  3. cookie+session 是常见登录验证解决方案

token vs cookie

  1. Cookie 是http规范,而token是自定义传递
  2. cookie会默认被浏览器存储,而token需自己存储
  3. token默认没有跨域限制

JWT(JSON Web Token)

  1. 前端发起登录,后端验证成功之后,返回一个加密的token
  2. 前端自行存储这个token(其中包含了用户信息,加密了)
  3. 以后访问服务端接口,都带着这个token,作为用户信息

区别

  1. cookie : http 标准;有跨域限制;配合 session使用
  2. token:无标准,无跨域限制;用于JWT

思考

  1. cookie的知识点很多,对于http也很重要
  2. session 存在的价值
  3. token和cookie要对吧理解,否则容易混淆
tiantingrui commented 2 years ago

加问:Session和JWT那个更好?更合适?

session 优点

  1. 原理简单,易于学习
  2. 用户信息存储在服务端,可快速封禁某个用户

session 缺点

  1. 占用服务端内存,硬件成本高
  2. 多进程,多服务器时,不好同步 - 需使用第三方缓存,如 redis

JWT优点

  1. 不占用服务端内存
  2. 多进程,多服务器 不受影响
  3. 没有跨域限制

JWT缺点

  1. 用户信息存储在客户端,无法快速封禁某用户
  2. 万一服务端密钥被泄露,则用户信息全部丢失
  3. token体积一般大于 cookie,会增加请求的数据量

哪个更合适?

  1. 如有严格管理用户信息的需求(保密、快速封禁)推荐session
  2. 如没有特殊要求,则使用 JWT(如创业初期的网站)
tiantingrui commented 2 years ago

加问:如何实现SSO单点登录?

基于cookie

  1. cookie 默认不可跨域共享,但有些情况下可设置为共享
  2. 主域名相同,如 www.baidu.com image.baidu.com
    1. www 和image 是二级域名
  3. 设置 cookie domain为主域名,即可共享 cookie
    1. Set-Cookie: domain=.baidu.com

SSO

  1. 主域名完全不同,则cookie无法共享
  2. 可使用SSO技术方案
    1. 第三方提供服务

OAuth2.0

  1. github
  2. 微信扫码登录

注意

  1. 主域名相同,则可共享 cookie
  2. 主域名不同,则需使用 SSO