大宇宇宇
发布于 2025-08-31 / 3 阅读
0
0

cookie跟session的区别

在 Vue.js 面试中回答 Cookie 和 Session 的区别时,需要结合HTTP 协议基础Vue 实际应用场景以及安全性与设计考量


一、核心区别(技术本质层面)

维度

Cookie

Session

存储位置

客户端(浏览器)

服务端(内存/数据库/缓存)

数据类型

仅支持字符串(键值对)

可存储任意类型(对象、数组等)

数据大小

有限制(通常 4KB)

无限制(受服务端存储空间影响)

生命周期

可设置过期时间(持久化或会话级)

依赖会话超时(如 30 分钟无操作)

安全性

明文传输(需加密/HttpOnly)

数据不暴露给客户端(仅传 Session ID)


二、Vue 中的实际应用场景

  • 身份认证:存储 Token(如 JWT)

// 登录后设置 Cookie(通常由后端返回 Set-Cookie 头)

document.cookie = token=abc123; expires=${new Date(Date.now() + 86400000).toUTCString()}; path=/;

  • 跨域请求携带凭证

// Axios 配置

axios.defaults.withCredentials = true; // 允许跨域携带 Cookie

  • 用户偏好设置(如主题、语言)

// Vue 组件中读取 Cookie

const theme = document.cookie.split('; ').find(row => row.startsWith('theme='))?.split('=')[1];

2. Session 在 Vue 中的典型用法

  • 服务端会话管理

    • 用户登录后,服务端创建 Session,返回 Session ID(通过 Cookie 或 URL 传递)。

    • Vue 每次请求自动携带 Session ID,服务端根据 ID 查找会话数据。

结合 Vuex/Pinia 管理状态

// 登录成功后,将 Session 数据存入 Vuex

this.$store.commit('setUser', { id: session.userId, role: session.role });

无感刷新 Token(Session 过期时静默续期)

// Axios 拦截器检测 401 错误,触发刷新逻辑
axios.interceptors.response.use(response => response, async error => {
  if (error.response.status === 401) {
    await refreshToken(); // 调用刷新 Session 的接口
    return axios.request(error.config); // 重试原请求
  }
});

三、面试官关注的深度问题

  • Session 数据不暴露:客户端仅持有 Session ID,敏感数据(如用户权限)存在服务端。

  • Cookie 易被窃取:XSS 攻击可读取 document.cookie,而 Session ID 即使泄露也需配合服务端破解。

  • 防御 CSRF:Session 通常配合 CSRF Token 使用,Cookie 需额外配置 SameSite 属性。

2. Vue 单页应用(SPA)中如何管理会话?

  • Token 方案(替代 Session)

    • 登录后返回 JWT(存储在 Cookie 或 localStorage),每次请求通过 Authorization: Bearer <token> 传递。

    • 优势:无状态、适合分布式系统;劣势:需手动处理 Token 过期。

  • Session + Cookie 方案

    • 服务端维护 Session,前端通过 withCredentials: true 携带 Cookie。

    • 注意:需解决跨域问题(后端配置 Access-Control-Allow-Credentials: true)。

场景

推荐方案

原因

简单登录(如博客)

Cookie + Session

开发成本低,服务端控制会话生命周期。

移动端/跨平台应用

JWT(存储在 localStorage)

无 Cookie 依赖,适配非浏览器环境。

高并发分布式系统

JWT + Redis 黑名单

避免服务端 Session 同步问题,支持水平扩展。

需要强安全性的金融系统

Session + HttpOnly Cookie

防止 XSS 窃取 Token,服务端可强制注销。


四、Vue 中的常见陷阱

  1. Cookie 未正确配置跨域

    • 前端:axios.defaults.withCredentials = true

    • 后端:需设置 Access-Control-Allow-Origin具体域名(不能是 *)。

  2. Session 在 SPA 中的过期问题

    • 单页应用不会自动刷新页面,需用 Axios 拦截器检测 401 错误并跳转登录页。

  3. 敏感信息存储错误

    • ❌ 禁止在 Cookie 中存储明文密码/Token(需用 HttpOnly + Secure)。

    • ✅ Session 数据在服务端加密存储。


五、总结回答(面试话术)

“在 Vue 中,Cookie 和 Session 的核心区别在于存储位置与安全性

  • Cookie 存储在客户端,适合保存少量非敏感数据(如用户偏好),但需警惕 XSS 攻击;

  • Session 数据存在服务端,仅通过 ID 关联,更安全但依赖服务端资源。

实际开发中

  • 简单项目用 Cookie + Session(如传统表单登录);

  • 现代化 SPA 优先用 JWT(存 Cookie 或 localStorage),结合 Vuex/Pinia 管理状态;

  • 高安全场景用 Session + HttpOnly Cookie,并通过 Axios 拦截器处理会话过期。

关键点:无论哪种方案,都要注意跨域配置Token 刷新机制防御 CSRF/XSS



评论