Cookie 相关面试题
HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录。
Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。
Session 是什么?
客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象便是 Session 对象,存储结构为 ConcurrentHashMap。
Session 弥补了 HTTP 无状态特性,服务器可以利用 Session 存储客户端在同一个会话期间的一些操作记录。
Session 缺点
Session 机制有个缺点,比如 A 服务器存储了 Session,就是做了负载均衡后,假如一段时间内 A 的访问量激增,会转发到 B 进行访问,但是 B 服务器并没有存储 A 的 Session,会导致 Session 的失效。
Cookies 是什么?
HTTP 协议中的 Cookie 包括 Web Cookie 和浏览器 Cookie,它是服务器发送到 Web 浏览器的一小块数据。
服务器发送到浏览器的 Cookie,浏览器会进行存储,并与下一个请求一起发送到服务器。通常,它用于判断两个请求是否来自于同一个浏览器,例如用户保持登录状态。
Cookies 的使用场景
主要分为三点:
会话管理:登陆、购物车、游戏得分或者服务器应该记住的其他内容
个性化:用户偏好、主题或者其他设置
追踪:记录和分析用户行为
sessionStorage 、localStorage 和 cookie 之间的区别
共同点:
都保存在浏览器端,且是同源的
区别:
- cookie 数据始终在同源的 http 请求中携带,而 webStorage 不会在请求中携带,仅仅在本地存储。
- 存储大小:cookie 是 4k,webStorage 可以达到 5M 甚至更大。
- 数据有效时间: sessionStorage 仅仅是会话级别的存储,它只在当前浏览器关闭前有效,不能持久保持;localStorage 始终有效,即使窗口或浏览器关闭也一直有效,除非用户手动删除,其才会失效;cookie 只在设置的 cookie 过期时间之前一直有效。
- 作用域区别:sessionStorage 不在不同的浏览器窗口中共享,即使是同一个页面; localStorage 和 cookie 在所有同源窗口是共享的。
- Web Storage 支持事件通知机制,可以将数据更新的通知发送给监听者。Web Storage 的 api 接口使用更方便。
如何创建 Cookie
当接收到客户端发出的 HTTP 请求时,服务器可以发送带有响应的 Set-Cookie 标头,Cookie 通常由浏览器存储,然后将 Cookie 与 HTTP 标头一同向服务器发出请求。
Token / JWT 是什么?
Json Web Token 的简称就是 JWT,通常可以称为 Json 令牌。
它是 RFC 7519 中定义的用于安全的将信息作为 Json 对象进行传输的一种形式。
JWT 中存储的信息是经过数字签名的,因此可以被信任和理解。可以使用 HMAC 算法或使用 RSA/ECDSA 的公用/专用密钥对 JWT 进行签名。
为什么要使用 JWT
1.认证(Authorization):一旦用户登录,后面每个请求都会包含 JWT,从而允许用户访问该令牌所允许的路由、服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小。
2.信息交换(Information Exchange):通过使用公钥/私钥对 JWT 进行签名认证。此外,由于签名是使用 head 和 payload 计算的,因此你还可以验证内容是否遭到篡改。
JWT 与 Session/Cookies 的不同
JWT 和 Session、Cookies 都提供安全的用户身份验证,但是它们有以下几点不同:
密码签名
JWT 具有加密签名,而 Session、Cookies 则没有。
JSON 是无状态的
JWT 是无状态的,因为声明被存储在客户端,而不是服务端内存中。
身份验证可以在本地进行,而不是在请求必须通过服务器数据库或类似位置中进行。 这意味着可以对用户进行多次身份验证,而无需与站点或应用程序的数据库进行通信,也无需在此过程中消耗大量资源。
可扩展性
Session、Cookies 是存储在服务器内存中,这就意味着如果网站或者应用很大的情况下会耗费大量的资源。
由于 JWT 是无状态的,在许多情况下,它们可以节省服务器资源。因此 JWT 要比 Session Cookies 具有更强的可扩展性。
JWT 支持跨域认证
Session、Cookies 只能用在单个节点的域或者它的子域中有效。如果它们尝试通过第三个节点访问,就会被禁止。
如果你希望自己的网站和其他站点建立安全连接时,这是一个问题。使用 JWT 可以解决这个问题,使用 JWT 能够通过多个节点进行用户认证,也就是我们常说的跨域认证。
cookie 和 token 都存放在 header 中,为什么不会劫持 token?
token 是防止 CSRF 攻击的一种方式,但 cookie 不会。其实 CSRF 攻击的原因是浏览器会自动带上 cookie 而被劫持,而浏览器不会自动带上 token。
且 token 是放在 jwt 里面下发给客户端的不能通过 document.cookie 直接拿到,通过 jwt+ip 的方式 可以防止被劫持即使被劫持也是无效的 jwt。
举个例子:
cookie:用户点击了链接,cookie 未失效,导致发起请求后后端以为是用户正常操作,于是进行扣款操作。
token:用户点击链接,由于浏览器不会自动带上 token,所以即使发了请求,后端的 token 验证不会通过,所以不会进行扣款操作。
什么时候用 Cookies 什么时候用 JWT?
场景上对于只需要登录用户并访问存储在站点数据库中的一些信息的中小型网站来说,Session Cookies 通常就能满足。
如果你有企业级站点,应用程序或附近的站点,并且需要处理大量的请求,尤其是第三方或很多第三方(包括位于不同域的 API),则 JWT 显然更适合。