cookie和session

一、Cookie 和 Session 的知识点

1. Cookie

  • 定义:Cookie 是存储在用户本地终端上的数据,它是由服务器发送到用户浏览器并保存在本地的一小块数据。当用户再次访问同一网站时,浏览器会将 Cookie 发送回服务器,以便服务器识别用户身份或记录用户相关信息。
  • 工作原理
    • 服务器在 HTTP 响应中通过Set-Cookie头将 Cookie 信息发送给浏览器。
    • 浏览器将 Cookie 保存到本地。
    • 后续当用户再次向该服务器发送请求时,浏览器会自动在 HTTP 请求头中携带该服务器的 Cookie 信息发送给服务器。
  • 存储内容:通常存储一些简单的用户信息,如用户登录状态、用户偏好设置等。例如,一个购物网站可能会将用户的购物车信息存储在 Cookie 中,以便用户下次访问时能恢复购物车状态。
  • 有效期:可以设置不同的有效期。如果不设置,Cookie 会在浏览器关闭时自动删除,这种称为会话 Cookie;也可以设置一个特定的时间,到期后 Cookie 会自动失效。

2. Session

  • 定义:Session 是在服务器端保存的一种数据结构,用于跟踪用户的状态和相关信息。它通常与 Cookie 或 URL 重写等技术结合使用,以在不同的请求之间识别用户。
  • 工作原理
    • 当用户第一次访问服务器时,服务器会创建一个唯一的 Session ID,并通过某种方式(如 Cookie 或在 URL 中)将 Session ID 传递给客户端。
    • 客户端在后续的请求中会携带 Session ID,服务器根据 Session ID 找到对应的 Session 数据,从而识别用户并获取用户的相关状态信息。
    • Session 数据存储在服务器端,相对更安全,可以存储更复杂和敏感的信息。
  • 存储位置和内容:Session 数据存储在服务器的内存或数据库中(具体取决于服务器的配置和实现)。它可以存储用户的登录状态、用户在应用中的操作记录等更复杂的数据。例如,在一个在线银行应用中,服务器会在 Session 中存储用户的账户余额、交易记录等信息,在用户的整个会话过程中使用。

二、作用和举例

1. Cookie 的作用和举例

  • 作用
    • 实现用户登录状态的保持。例如,用户登录一个网站后,网站可以将登录状态信息存储在 Cookie 中,下次用户访问该网站的其他页面时,服务器通过读取 Cookie 就可以知道用户已经登录,不需要再次输入用户名和密码。
    • 记录用户的个性化设置。比如,用户在一个新闻网站上选择了自己感兴趣的新闻类别(如体育、科技等),网站可以将这些偏好设置存储在 Cookie 中,下次用户访问时就可以根据 Cookie 中的信息为用户展示个性化的内容。
  • 举例:电商网站利用 Cookie 记录用户最近浏览的商品,当用户再次访问时,可以在“最近浏览”栏目中展示这些商品,方便用户快速找到之前感兴趣的商品。

2. Session 的作用和举例

  • 作用
    • 在多页面应用中保持用户的整体会话状态。例如,在一个在线购物流程中,用户从浏览商品、添加到购物车到结算等一系列操作都在一个会话中进行,Session 可以存储用户在这个过程中的所有相关信息,如购物车中的商品列表、订单状态等。
    • 保证用户数据的安全性。由于 Session 数据存储在服务器端,相比 Cookie 更不容易被篡改。例如,在一个网上银行系统中,用户的账户信息和交易数据都存储在 Session 中,而不是通过 Cookie 暴露给客户端,提高了数据的安全性。
  • 举例:在线教育平台使用 Session 记录用户在学习一门课程时的进度,当用户下次继续学习时,平台可以根据 Session 中的进度信息,直接让用户从上次中断的地方继续学习。

cookie和session面试题

一、基础概念类

面试题 1:Cookie 是如何在浏览器和服务器之间传递的?
答案:服务器通过在 HTTP 响应头中设置Set-Cookie字段来将 Cookie 信息发送给浏览器。浏览器在后续对该服务器的请求中,会自动在 HTTP 请求头的Cookie字段中携带服务器设置的 Cookie 信息发送回服务器。

面试题 2:Session 的创建时机是什么?
答案:当用户第一次访问服务器时,服务器会创建一个 Session。具体来说,服务器会生成一个唯一的 Session ID,并通过某种方式(如 Cookie 或 URL 重写)将 Session ID 传递给客户端,同时在服务器端创建相应的 Session 数据结构来存储与该用户会话相关的信息。

面试题 3:Cookie 和 Session 在 HTTP 无状态协议中的作用是什么?
答案:HTTP 是无状态协议,即服务器无法识别两次请求是否来自同一客户端。Cookie 和 Session 就是为了解决这个问题而存在的。Cookie 通过在客户端存储一些信息并在每次请求时发送给服务器,让服务器能够识别客户端。Session 则在服务器端存储用户的会话状态信息,通过 Session ID 来关联不同请求属于同一用户的会话,从而实现对用户状态的跟踪和管理。

二、技术细节类

面试题 4:如何设置 Cookie 的路径和域?
答案:在服务器端(以 Java 为例),可以使用Cookie类的setPathsetDomain方法来设置。例如:

Cookie cookie = new Cookie("myCookie", "value");
cookie.setPath("/myapp");  // 设置 Cookie 的路径为 /myapp
cookie.setDomain("example.com");  // 设置 Cookie 的域为 example.com
response.addCookie(cookie);

面试题 5:Session 在服务器端的存储方式有哪些?
答案:Session 在服务器端的存储方式主要有内存存储和持久化存储(如存储到数据库或文件系统)。内存存储速度快,但服务器重启会导致 Session 数据丢失;持久化存储可以保证 Session 数据在服务器重启等情况下不丢失,但相对性能可能会受一定影响。例如,在 Tomcat 中,默认是内存存储,但可以通过配置将 Session 数据持久化到文件或数据库。

面试题 6:如何在代码中销毁一个 Session?
答案:在 Java Web 应用中,可以通过HttpSession对象的invalidate方法来销毁 Session。例如:

HttpSession session = request.getSession();
session.invalidate();

这将使当前用户的 Session 立即失效,清除与该 Session 相关的所有数据。

三、安全与性能类

面试题 7:Cookie 可能带来的安全风险有哪些?如何防范?
答案

  • 安全风险:
    • Cookie 可能被窃取或篡改,导致用户信息泄露或被伪造身份。例如,通过网络嗅探等方式获取 Cookie 内容,或者通过恶意脚本修改 Cookie 中的用户身份信息等。
    • 如果 Cookie 中存储了敏感信息且未加密,一旦被获取,可能会造成严重后果。
  • 防范措施:
    • 对 Cookie 中的敏感信息进行加密处理,在服务器端设置和读取时进行加解密操作。
    • 设置HttpOnly属性防止 JavaScript 访问 Cookie,减少通过脚本篡改的风险。
    • 设置Secure属性确保 Cookie 只在 HTTPS 协议下传输,提高数据传输的安全性。

面试题 8:在高并发场景下,如何优化 Session 的使用以提高性能?
答案

  • 可以考虑将 Session 数据进行缓存,减少对数据库等存储介质的频繁访问。例如,使用内存缓存技术如 Redis 来存储 Session 数据,提高读取和写入速度。
  • 对于不经常改变的 Session 数据,可以设置合适的缓存过期时间,避免不必要的重复读取和写入操作。
  • 合理设置 Session 的过期时间,及时清理过期的 Session 数据,释放服务器资源。
  • 如果使用数据库存储 Session 数据,要优化数据库连接和查询等操作,例如使用连接池等技术。

四、应用场景类

面试题 9:在一个多步骤的在线表单填写场景(如注册流程)中,如何使用 Cookie 和 Session 来优化用户体验?
答案

  • 使用 Session:
    • 在 Session 中存储用户在每个步骤填写的表单数据。如果用户在填写过程中出现错误或网络问题等情况,当用户返回页面时,可以从 Session 中恢复已经填写的数据,避免用户重新输入。
    • 利用 Session 记录用户在整个注册流程中的状态,例如已经完成了哪些步骤,哪些步骤还未完成等,以便正确引导用户完成注册。
  • 使用 Cookie:
    • 可以设置一个 Cookie 来记录用户是否已经开始了注册流程。如果用户下次访问网站时,根据这个 Cookie 判断用户是否有未完成的注册流程,可以提示用户继续完成注册,提高注册转化率。

面试题 10:如果一个网站需要支持多个子域名共享用户的登录状态(例如,www.example.comblog.example.com),如何使用 Cookie 和 Session 来实现?
答案

  • 对于 Cookie:
    • 在设置 Cookie 的domain属性时,将其设置为顶级域名example.com,这样在www.example.comblog.example.com等子域名下都可以访问到这个 Cookie。例如:
  Cookie cookie = new Cookie("loginStatus", "true");
  cookie.setDomain(".example.com");
  response.addCookie(cookie);
  • 对于 Session:
    • 可以采用共享 Session 的策略。一种方法是将 Session 数据存储在一个集中式的存储系统(如 Redis)中,无论用户访问哪个子域名,服务器都可以从这个集中式存储中获取和更新 Session 数据。另一种方法是在负载均衡器上配置粘性会话,确保同一用户的请求始终被路由到同一台服务器,这样就可以利用服务器上的本地 Session 数据来保持用户登录状态,但这种方式可能会导致服务器负载不均衡。

以下是一些关于 Cookie 和 Session 的其他面试题:

一、Cookie 相关

面试题 1:Cookie 的最大存储限制是多少?它是由什么决定的?
答案:不同浏览器对 Cookie 的存储限制略有不同,但一般来说,Cookie 的总大小通常限制在 4KB 左右。这个限制是由浏览器厂商设定的,目的是为了防止过多的 Cookie 数据占用客户端资源以及保证网络传输的效率。

面试题 2:除了存储用户登录状态和偏好设置,Cookie 还可以用于哪些场景?
答案

  • 用于网站的分析和跟踪。例如,网站可以使用 Cookie 记录用户的访问路径、停留时间等信息,用于分析用户行为和改进网站设计。
  • 用于实现 A/B 测试。通过在 Cookie 中设置不同的标识,将用户分组并展示不同的页面版本,以测试哪种版本效果更好。
  • 用于广告投放。广告平台可以通过在用户浏览器中设置 Cookie 来跟踪用户的浏览行为,以便更精准地投放广告。

面试题 3:如果要在 Cookie 中存储一个日期类型的数据,应该如何处理?
答案:首先,需要将日期类型的数据转换为字符串格式,然后再存储到 Cookie 中。例如,可以使用SimpleDateFormat将日期格式化为特定的字符串格式,如“yyyy-MM-dd HH:mm:ss”,然后将这个字符串存储到 Cookie 中。在读取 Cookie 时,再将字符串解析回日期类型。

面试题 4:Cookie 的SameSite属性有什么作用?
答案SameSite属性用于控制 Cookie 在跨站请求时是否会被发送。它有三个值:

  • Strict:最为严格,在任何跨站请求中都不会发送 Cookie,只有当请求的源和目标的域名完全一致时才会发送 Cookie。
  • Lax:在一些安全的跨站请求中会发送 Cookie,例如通过链接从一个网站导航到另一个网站时,Cookie 会被发送,但在某些情况下(如通过表单 POST 跨站请求)不会发送。
  • None:在任何情况下都会发送 Cookie,但前提是必须同时设置Secure属性(即只在 HTTPS 协议下发送),否则浏览器会拒绝设置该属性。设置SameSite属性可以帮助防止跨站请求伪造(CSRF)攻击等安全问题。

二、Session 相关

面试题 5:Session ID 是如何生成的?它的安全性如何保证?
答案:Session ID 通常是由服务器随机生成的一个唯一标识符,它可以是数字、字母或两者的组合。为了保证安全性:

  • 服务器会使用安全的随机数生成算法来生成 Session ID,使其难以被猜测。
  • 服务器会通过加密的方式(如在 HTTPS 协议下传输)将 Session ID 传递给客户端,防止被窃取。
  • 服务器会定期检查 Session 的活动情况,如果发现异常(如长时间未活动或来自异常 IP 的访问等),可以采取措施如销毁 Session 以保证安全。

面试题 6:在分布式环境下,如果一个服务器宕机了,如何保证用户的 Session 不丢失并能继续在其他服务器上使用?
答案:可以采用以下方法:

  • 使用共享存储。将 Session 数据存储在一个所有服务器都能访问的共享存储介质中,如 Redis 或数据库。当一个服务器宕机时,其他服务器可以从共享存储中获取用户的 Session 数据。
  • 采用 Session 复制技术。在服务器之间实时复制 Session 数据,这样当一个服务器宕机时,用户的请求可以被路由到其他有相同 Session 副本的服务器上。但这种方式会带来一定的网络和资源开销。
  • 使用粘性会话(如前面提到过),但要注意负载均衡策略,避免因服务器宕机导致大量用户会话受影响。同时,可以结合一些备份和恢复机制,当服务器恢复时重新同步 Session 数据。

面试题 7:Session 数据的存储结构在服务器端是怎样的?
答案:Session 数据在服务器端的存储结构可以是多种形式。在内存中,它可以是一个类似于哈希表的数据结构,以 Session ID 为键,存储用户的相关会话数据。如果存储在数据库中,可能会有专门的 Session 表,包含 Session ID、数据字段等,数据以记录的形式存储。具体的存储结构会根据服务器的实现和配置而有所不同。

面试题 8:如何防止 Session 劫持攻击?
答案

  • 使用 HTTPS 协议,对网络通信进行加密,防止 Session ID 在传输过程中被窃取。
  • 定期更换 Session ID。例如,在用户进行一些关键操作(如修改密码等)时,服务器可以生成一个新的 Session ID,使旧的可能被劫持的 Session ID 失效。
  • 对 Session 进行严格的访问控制,例如限制 Session 的有效 IP 范围。如果检测到 Session 来自异常 IP 地址的访问,可以要求用户重新登录或采取其他安全措施。

三、综合比较与应用

面试题 9:在一个需要支持大规模用户并发访问的应用中,应该如何选择使用 Cookie 和 Session?
答案

  • 如果要存储一些不太敏感且相对较小的数据,如用户的界面主题选择等,可以使用 Cookie。但要注意 Cookie 的大小限制和性能影响,避免存储过多数据。
  • 对于存储用户的登录状态、重要的业务数据等,应该优先考虑使用 Session。在大规模并发访问场景下,可以采用一些优化措施,如将 Session 数据存储在分布式缓存(如 Redis)中,以提高性能和可用性,避免服务器内存压力过大。同时,要合理设置 Session 的过期时间,及时清理过期的 Session 数据。
  • 如果应用需要跨多个子域或多个不同的应用共享一些用户信息,可以结合使用 Cookie 和 Session。例如,在顶级域名下设置一个共享的 Cookie 来标识用户,同时在各个子应用中使用 Session 来存储更详细的用户会话数据。

面试题 10:如果一个应用既要支持 Web 访问,又要支持移动应用访问,如何设计 Cookie 和 Session 的使用策略?
答案

  • 对于 Web 访问:可以继续使用传统的 Cookie 和 Session 机制来管理用户会话。但要注意优化 Session 的存储和管理,以应对高并发情况。
  • 对于移动应用访问:
    • 由于移动应用不像浏览器那样自动管理 Cookie,所以可以采用基于 Token 的认证方式代替传统的 Cookie 机制。服务器在用户登录成功后生成一个 Token 并返回给移动应用,移动应用在后续的请求中携带 Token 来标识用户身份和会话状态。
    • 对于一些需要在移动应用中存储的用户偏好等信息,可以使用移动应用自身的本地存储机制(如 SharedPreferences 在 Android 中)来替代 Cookie 的部分功能。
    • 在服务器端,仍然可以使用 Session 的概念来管理移动应用用户的会话,但需要与 Token 机制相结合,通过 Token 来关联服务器端的 Session 数据。例如,当移动应用发送请求时,服务器通过解析 Token 来获取用户信息并找到对应的 Session 数据进行处理。
  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值