【问答格式】【精简版】Cookies, Session, LocalStorage, SessionStorage, JWT(Token)
Q1: 前端存储方式有哪些?
- cookies
- LocalStorage
- SessionStorage
- indexedDB(前端本地的数据库)
Q2: Cookies和Session区别?
- 存储位置不同:
- Cookies: 存放在客户端
- Sesssion: 存放在服务端
- 存放容量不同:
- Cookies: 只能存4KB
- Session: 能存更多数据
- 安全性不同:
- Cookies: 由于是存放在客户端,对客户端是可见的,数据可能会被偷窃,更容易遭受跨域脚本攻击(XSS)和跨站请求伪造(CSRF)
- Session: 存放在服务端,对客户端是不透明的,敏感数据更能得到很好的保护
- 有效期不同:
- Cookies: 我们可以给cookies里面存放的数据设置很大的maxAge,生命周期就会很长
- Session: 如果关闭你在浏览的网站的话,Session就结束了,过几分钟重新进入这个网站时,服务器会返回给你一个新的session_id
Q3: Cookies和LocalStorage和SessionStorage区别?
- 是否参与服务器通信
- Cookies: cookies会被附加在每个http请求中,所以会参与服务器通信
- LS/SS: 不参与服务器通信,只做本地存储
- 存放容量不同:
- Cookies: 只能存4KB
- LS/SS: LS>SS>Cookies
Q4: Cookie缺陷?
- cookie会被附加在每个http请求中,增加了流量。
- cookie在HTTP消息中是明文传输的,所以安全性不高,容易被窃取,但是https协议下是密文传送
- 存储容量比较小
Q5: Session和JWT身份认证区别?
- 存放位置不同:
- Session: session存放在服务端,session_id存放在客户端
- Token: 存放在客户端
- 方式不一样:
- Session: 客户端第二次请求时带着cookie里存着的session_id请求,服务端拿着session_id认证
- Token: 客户端第二次请求时是把token放在header的Authorization里面,而token是存放在cookie或者localStorage里面
- 安全性:
- Session: 由于每次http请求都会带着cookie,而cookie里面存着session_id,所以容易受到跨站请求伪造(CSRF)攻击
- Token: 由于没有Cookie被发送,还有助于防止CSRF攻击,更安全
- 移动端应用问题:
- Session: session需要保存一份信息在服务器端,而且这种方式会依赖到 Cookie, 需要 Cookie 保存 session_id,所以不适合移动端。
- Token: 使用JWT的话就没有这个问题,因为只要 JWT 可以被客户端存储就能够使用
- 跨域请求问题:
- Session: 有cookie跨域问题,浏览器发起跨域请求的时候,是不会主动带上cookie的
- Token: 存在客户端里并且是放在请求头的Authorization中发送,所以没有这个问题
Q6: JWT的优缺点?
- 优点:
- 由于没有Cookie被发送,有助于防止CSRF攻击
- token包含了身份验证所需要的所有信息,不需要把他们存放在服务端,减轻了服务端的压力,所以适合移动端应用
- 单点登录友好
- 缺点:
- token一旦派发出去,如果后端不增加其他逻辑的话,它在失效之前都是有效的