面试复盘之Cookie和Session

引言

  • 在Web开发中,Cookie和Session是两个用来存储用户信息、跟踪用户状态的技术。它们的核心作用是让服务器能够记住用户的状态(如登录信息、购物车等)跨多个请求和页面访问,避免每次用户请求时都需要重新输入信息。
定义
  • Cookie是存储在客户端(用户的浏览器)上的小数据文件。它允许在用户与服务器交互时,保存和传递用户的一些信息。
工作原理:
  • 当用户访问某个网站时,服务器可以向浏览器发送一个Cookie,浏览器保存这个Cookie并在后续的请求中携带回给服务器。这样,服务器就能根据Cookie中的信息知道这是同一个用户。
特点:
  • 存储位置:存储在客户端浏览器中。
  • 生命周期:可以设置过期时间,过期后Cookie会被自动删除。如果是会话Cookie,浏览器关闭时会自动删除。
  • 大小限制:通常每个Cookie的大小为4KB,浏览器对每个域名的Cookie数量有一定的限制。
  • 作用范围:Cookie通常是作用于特定的域名和路径,且可以在该域名下的多个页面之间共享。
  • 传输方式:每次浏览器向服务器发送请求时,都会自动带上与请求相关的Cookie,这可能增加请求的负担。
缺点与对应措施:
  • 隐患:由于存储在客户端,Cookie容易被篡改、盗用。特别是在没有加密的情况下,敏感信息容易泄露(例如,用户的登录凭证、购物车内容等)。
  • 防护措施:可以通过设置Secure标志来确保Cookie仅在HTTPS连接下发送,或者使用HttpOnly来防止JavaScript访问Cookie,降低XSS(跨站脚本攻击)风险。
使用场景:
  • 存储用户的偏好设置,语言选择,登陆状态等小数据
  • 用于保持用户登陆状态

Session

定义:
  • Session是在服务器端存储的一个数据结构,它用来保存与用户会话相关的信息。与Cookie不同,Session的数据存储在服务器端,客户端只需要保存一个Session ID。
工作原理:
  • 当用户访问网站时,服务器会为该用户创建一个Session,并生成一个唯一的Session ID,返回给浏览器。浏览器将这个Session ID保存在Cookie中,并在每次请求时发送回服务器。服务器通过Session ID来查询与之关联的Session数据。
特点:
  • 存储位置:存储在服务器端,通常保存在内存中,或者存储在数据库、文件系统等地方。
  • 生命周期:Session通常会在用户关闭浏览器或超时后失效,默认情况下,浏览器关闭后Session会被销毁(这取决于服务器的配置)。
  • 大小限制:Session存储在服务器端,存储容量通常仅受限于服务器的存储资源。
  • 作用范围:Session是针对单一会话的,不同浏览器或设备间不能共享Session数据。Session ID通过Cookie或URL传递给客户端。
缺点:
  • 隐患:虽然数据存储在服务器端,相对更安全,但如果Session ID被窃取(如通过盗用Cookie),可能会导致会话劫持。因此需要加密和对Session ID进行保护(例如,通过Secure和HttpOnly标志,或者使用Session过期机制)。
使用场景:
  • 存储用户的登录状态、购物车内容等临时和敏感数据。
  • 会话数据存储在服务器端,更适合存储需要保护的敏感信息。

cookie和session的区别

特性 Cookie Session
存储位置 客户端(浏览器) 服务器端
生命周期 可以设置过期时间,长期存储 通常在会话结束时失效,浏览器关闭后失效
存储容量 每个Cookie大小限制为4KB 存储容量通常仅受限于服务器资源
传输方式 每次请求都会发送给服务器 只传递Session ID
安全性 容易被窃取、篡改,存在XSS风险 存储在服务器端,相对更安全,但Session ID可能被窃取
使用场景 存储长期信息,如用户偏好、自动登录等 存储会话信息,如登录状态、购物车内容等

总结:

  • Cookie适用于存储少量的、长期有效的信息,存储在客户端,可能面临安全隐患。
  • Session适用于存储敏感信息和临时会话数据,存储在服务器端,安全性较高。

cookie和session的联系

Session依赖Cookie来维持会话
  • Session本身存储在服务器端,服务器通过一个唯一的Session ID来标识和管理每个用户的会话。而客户端(浏览器)并不存储具体的Session数据,只需要保存Session ID,并在每次请求时将其发送给服务器。
  • Cookie则用于存储这个Session ID,并在每次用户访问网站时自动带上它。浏览器会将存储在Cookie中的Session ID传递给服务器,服务器根据这个ID查询存储的会话数据,进而维护用户的状态。
Cookie用于保持Session ID
  • Cookie在Web开发中最常见的用途之一就是存储Session ID。每当服务器创建一个Session,它会生成一个唯一的Session ID,并将这个ID存储在一个Cookie中,通常名为JSESSIONID(在Java Web应用中)或其他类似名称。
  • 在后续的请求中,浏览器会自动把这个Cookie中的Session ID发送到服务器,服务器通过这个Session ID来获取并维护相应的用户会话。
Cookie与Session的生命周期配合
  • Session的生命周期通常取决于服务器端的设置(如用户的会话超时等)。而Cookie可以设置过期时间,如果设置了过期时间,Cookie在用户的浏览器中存储一定时间,直到超时。
  • 通过Cookie存储Session ID,服务器能够在每次请求中识别用户,直到Session过期或被服务器删除。

一句话总结:Session 是服务器端的用户数据,Cookie 是携带 SessionID 的载体,二者配合共同维持 HTTP 的会话状态。