【问答格式】【精简版】Cookies, Session, LocalStorage, SessionStorage, JWT(Token)

137 阅读3分钟

Q1: 前端存储方式有哪些?

  1. cookies
  2. LocalStorage
  3. SessionStorage
  4. indexedDB(前端本地的数据库)

Q2: Cookies和Session区别?

  1. 存储位置不同:
    • Cookies: 存放在客户端
    • Sesssion: 存放在服务端
  2. 存放容量不同:
    • Cookies: 只能存4KB
    • Session: 能存更多数据
  3. 安全性不同:
    • Cookies: 由于是存放在客户端,对客户端是可见的,数据可能会被偷窃,更容易遭受跨域脚本攻击(XSS)和跨站请求伪造(CSRF)
    • Session: 存放在服务端,对客户端是不透明的,敏感数据更能得到很好的保护
  4. 有效期不同:
    • Cookies: 我们可以给cookies里面存放的数据设置很大的maxAge,生命周期就会很长
    • Session: 如果关闭你在浏览的网站的话,Session就结束了,过几分钟重新进入这个网站时,服务器会返回给你一个新的session_id

Q3: Cookies和LocalStorage和SessionStorage区别?

  1. 是否参与服务器通信
    • Cookies: cookies会被附加在每个http请求中,所以会参与服务器通信
    • LS/SS: 不参与服务器通信,只做本地存储
  2. 存放容量不同:
    • Cookies: 只能存4KB
    • LS/SS: LS>SS>Cookies

Q4: Cookie缺陷?

  1. cookie会被附加在每个http请求中,增加了流量。
  2. cookie在HTTP消息中是明文传输的,所以安全性不高,容易被窃取,但是https协议下是密文传送
  3. 存储容量比较小

Q5: Session和JWT身份认证区别?

  1. 存放位置不同:
    • Session: session存放在服务端,session_id存放在客户端
    • Token: 存放在客户端
  2. 方式不一样:
    • Session: 客户端第二次请求时带着cookie里存着的session_id请求,服务端拿着session_id认证
    • Token: 客户端第二次请求时是把token放在header的Authorization里面,而token是存放在cookie或者localStorage里面
  3. 安全性:
    • Session: 由于每次http请求都会带着cookie,而cookie里面存着session_id,所以容易受到跨站请求伪造(CSRF)攻击
    • Token: 由于没有Cookie被发送,还有助于防止CSRF攻击,更安全
  4. 移动端应用问题:
    • Session: session需要保存一份信息在服务器端,而且这种方式会依赖到 Cookie, 需要 Cookie 保存 session_id,所以不适合移动端。
    • Token: 使用JWT的话就没有这个问题,因为只要 JWT 可以被客户端存储就能够使用
  5. 跨域请求问题:
    • Session: 有cookie跨域问题,浏览器发起跨域请求的时候,是不会主动带上cookie的
    • Token: 存在客户端里并且是放在请求头的Authorization中发送,所以没有这个问题

Q6: JWT的优缺点?

  • 优点:
    • 由于没有Cookie被发送,有助于防止CSRF攻击
    • token包含了身份验证所需要的所有信息,不需要把他们存放在服务端,减轻了服务端的压力,所以适合移动端应用
    • 单点登录友好
  • 缺点:
    • token一旦派发出去,如果后端不增加其他逻辑的话,它在失效之前都是有效的