首页 > web前端 > js教程 > 了解React中的饼干和会话

了解React中的饼干和会话

William Shakespeare
发布: 2025-02-08 10:46:10
原创
243 人浏览过

Understanding Cookies and Sessions in React

关键要点

  • Cookie 和 Session 是 Web 开发中至关重要的组成部分,用于管理用户数据、身份验证和状态。Cookie 是 Web 浏览器存储在用户设备上的少量数据块,而 Session 指的是用户浏览网站的时间。
  • 在 React 中,可以使用 document.cookie API、创建自定义 Hook 或使用第三方库来实现 Cookie。React 中的 Session 可以通过服务器端 Session 或基于令牌的身份验证来实现。
  • 在 React 中管理 Session 和 Cookie 的最佳实践包括:使用 HttpOnlysecure 标志保护 Cookie,实现 Session 过期和令牌刷新,加密敏感数据,使用 SameSite 属性以及分离身份验证和应用程序状态。
  • 第三方库(例如 js-cookie)可以简化 React 应用程序中的 Cookie 管理。建议定期更新依赖项,以受益于安全补丁和改进。
  • 定期进行安全审计和测试对于确保应用程序安全至关重要。可以使用诸如内容安全策略 (CSP) 之类的工具和实践来降低安全风险。

本文将探讨在 React 中实现 Cookie 和 Session 的技术和最佳实践。

Cookie 和 Session 是 Web 开发不可或缺的组件。它们是管理用户数据、身份验证和状态的媒介。

Cookie 是 Web 服务器代表存储在用户设备上的 Web 浏览器中的少量数据(最大 4096 字节)。典型的 Cookie 看起来像这样(这是一个 Google Analytics — _ga — Cookie):

<code>名称:_ga
值:GA1.3.210706468.1583989741
域:.example.com
路径:/
过期/最大年龄:2022-03-12T05:12:53.000Z</code>
登录后复制
登录后复制
登录后复制
登录后复制

Cookie 只是具有键值对的字符串。

“Session” 指的是用户浏览网站的时间。它们代表用户在一段时间内的连续活动。

在 React 中,Cookie 和 Session 有助于我们创建健壮且安全的应用程序。

Cookie 和 Session 的深入基础知识

了解 Cookie 和 Session 的基础知识是开发动态和以用户为中心的 Web 应用程序的基础。

本节将更深入地探讨 Cookie 和 Session 的概念,探讨它们的类型、生命周期和典型用例。

Cookie

Cookie 主要在多个请求中维护客户端和服务器之间的状态数据。Cookie 使您可以存储和检索用户机器上的数据,从而提供更个性化/无缝的浏览体验。

Cookie 类型

有各种类型的 Cookie,每种 Cookie 都非常适合其预期的用例。

  1. 会话 Cookie 是临时的,仅存在于用户会话期间。它们存储短暂信息,例如购物车中的商品:
    <code>名称:_ga
    值:GA1.3.210706468.1583989741
    域:.example.com
    路径:/
    过期/最大年龄:2022-03-12T05:12:53.000Z</code>
    登录后复制
    登录后复制
    登录后复制
    登录后复制
  2. 持久性 Cookie 有一个过期日期,并且会在用户机器上保留更长时间。它们适用于诸如“记住我”功能之类的功能:
    // 示例:设置会话 Cookie
    document.cookie = "sessionID=abc123; path=/";
    登录后复制
    登录后复制
    登录后复制

React 中 Cookie 的用例

  • 用户身份验证。当用户成功登录时,会话令牌或 JWT(JSON Web 令牌)通常存储在 Cookie 中:
    // 示例:设置具有过期日期的持久性 Cookie
    document.cookie = "username=JohnDoe; expires=Fri, 31 Dec 2023 23:59:59 GMT; path=/";
    登录后复制
    登录后复制
    登录后复制
  • 用户偏好设置。Cookie 通常存储用户偏好设置,例如主题选择或语言设置,以获得更好的个性化体验。
    document.cookie = "token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...; path=/";
    登录后复制
    登录后复制
    登录后复制

Session

定义和用途

Session 代表一个逻辑的服务器端实体,用于在访问期间存储特定于用户的数据。Session 与 Cookie 密切相关,但存储方式不同;会话标识符通常在客户端存储 Cookie。(Cookie 数据存储在服务器上。)

服务器端与客户端 Session

  • 服务器端 Session 涉及在服务器上存储 Session 数据。像 Express.js 这样的框架使用服务器端 Session 来管理用户状态:

    // 示例:在 Cookie 中存储用户偏好设置
    document.cookie = "theme=dark; path=/";
    登录后复制
    登录后复制
    登录后复制
  • 客户端 Session。使用客户端 Session 时,无需在节点之间复制、验证 Session 或查询数据存储。虽然“客户端 Session” 可能指的是客户端上的 Session 存储信息,但它通常涉及使用 Cookie 来存储 Session 标识符:

    // 使用 express-session 中间件
    const express = require('express');
    const session = require('express-session');
    const app = express();
    
    app.use(session({
      secret: 'your-secret-key',
      resave: false,
      saveUninitialized: true,
    }));
    登录后复制
    登录后复制
    登录后复制

了解 Cookie 和 Session 的细微之处有助于构建动态和交互式 Web 应用程序。

下一节将探讨在 React 应用程序中 Cookie 和 Session 的实际实现。

实现 Cookie

如前所述,Cookie 是 Web 进程和 React 应用程序的基本组成部分。

在 React 中实现 Cookie 的方法包括:

  • 使用 document.cookie API
  • 创建自定义 Hook
  • 使用第三方库

使用 document.cookie API

在 React 中使用 Cookie 的最基本方法是通过 document.cookie API。它提供了一个简单的界面来设置、获取和删除 Cookie。

  1. 设置 Cookie:

    // 示例:在客户端的 Cookie 中存储 Session ID
    document.cookie = "sessionID=abc123; path=/";
    登录后复制
    登录后复制
    登录后复制
  2. 获取 Cookie:

    // 设置 Cookie 的函数
    const setCookie = (name, value, days) => {
      const expirationDate = new Date();
      expirationDate.setDate(expirationDate.getDate() + days);
    
      document.cookie = `${name}=${value}; expires=${expirationDate.toUTCString()}; path=/`;
    };
    
    // 示例:设置一个在 7 天后过期的用户名 Cookie
    setCookie("username", "john_doe", 7);
    登录后复制
    登录后复制
  3. 删除 Cookie:

    // 按名称获取 Cookie 值的函数
    const getCookie = (name) => {
      const cookies = document.cookie
        .split("; ")
        .find((row) => row.startsWith(`${name}=`));
    
      return cookies ? cookies.split("=")[1] : null;
    };
    
    // 示例:获取“username” Cookie 的值
    const username = getCookie("username");
    登录后复制

使用自定义 Hook 来处理 Cookie

创建自定义 React Hook 可以封装与 Cookie 相关的功能,使其可以在组件之间重复使用:

// 按名称删除 Cookie 的函数
const deleteCookie = (name) => {
  document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;
};

// 示例:删除“username” Cookie
deleteCookie("username");
登录后复制

此自定义 Hook useCookie 返回 Cookie 的当前值、设置新值的函数和删除 Cookie 的函数。

使用第三方库

诸如 js-cookie 之类的第三方库简化了 React 应用程序中的 Cookie 管理。

  1. 安装库:

    // useCookie.js
    import { useState, useEffect } from "react";
    
    const useCookie = (cookieName) => {
      const [cookieValue, setCookieValue] = useState("");
    
      useEffect(() => {
        const cookie = document.cookie
          .split("; ")
          .find((row) => row.startsWith(`${cookieName}=`));
    
        setCookieValue(cookie ? cookie.split("=")[1] : "");
      }, [cookieName]);
    
      const setCookie = (value, expirationDate) => {
        document.cookie = `${cookieName}=${value}; expires=${expirationDate.toUTCString()}; path=/`;
      };
    
      const deleteCookie = () => {
        document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;
      };
    
      return [cookieValue, setCookie, deleteCookie];
    };
    
    // 在 React 组件中的用法
    const [username, setUsername, deleteUsername] = useCookie("username");
    登录后复制
  2. 在 React 组件中的用法:

    <code>名称:_ga
    值:GA1.3.210706468.1583989741
    域:.example.com
    路径:/
    过期/最大年龄:2022-03-12T05:12:53.000Z</code>
    登录后复制
    登录后复制
    登录后复制
    登录后复制

使用 js-cookie 等第三方库为 React 组件中的 Cookie 管理提供了简洁方便的 API。

了解这些不同的方法有助于我们选择最适合我们 React 应用程序的需求和复杂性的方法。

实现 Session

在 React 应用程序中,Session 在服务器端工作,而 Session 标识符使用 Cookie 在客户端工作。

实现 Session 的方法包括:

  • 服务器端 Session
  • 基于令牌的身份验证

服务器端 Session

服务器端 Session 涉及在服务器上存储 Session 数据。在 React 中,这意味着使用像 Express.js 这样的服务器端框架以及 Session 管理中间件。

  1. 使用 express-session 设置 Express.js: 首先,安装所需的包:

    // 示例:设置会话 Cookie
    document.cookie = "sessionID=abc123; path=/";
    登录后复制
    登录后复制
    登录后复制

    现在,配置 Express:

    // 示例:设置具有过期日期的持久性 Cookie
    document.cookie = "username=JohnDoe; expires=Fri, 31 Dec 2023 23:59:59 GMT; path=/";
    登录后复制
    登录后复制
    登录后复制

    secret 用于签名 Session ID Cookie,增加了额外的安全层。

  2. 在路由中使用 Session: 配置 Session 后,我们可以在路由中使用它们:

    document.cookie = "token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...; path=/";
    登录后复制
    登录后复制
    登录后复制

    成功登录后,用户信息将存储在 Session 中。随后对 /profile 路由的请求可以访问此信息。

基于令牌的身份验证

基于令牌的身份验证是在现代 React 应用程序中管理 Session 的一种方法。它涉及在服务器上成功身份验证后生成令牌,将其发送到客户端,并将其包含在后续请求的标头中。

  1. 生成和发送令牌: 在服务器端:

    // 示例:在 Cookie 中存储用户偏好设置
    document.cookie = "theme=dark; path=/";
    登录后复制
    登录后复制
    登录后复制

    服务器生成 JWT(JSON Web 令牌)并将其发送到客户端。

  2. 在请求中包含令牌: 在客户端(React):

    // 使用 express-session 中间件
    const express = require('express');
    const session = require('express-session');
    const app = express();
    
    app.use(session({
      secret: 'your-secret-key',
      resave: false,
      saveUninitialized: true,
    }));
    登录后复制
    登录后复制
    登录后复制

    上面使用 React Context 来管理身份验证状态。login 函数使用接收到的令牌更新状态。

  3. 在请求中使用令牌: 有了令牌后,将其包含在请求的标头中:

    // 示例:在客户端的 Cookie 中存储 Session ID
    document.cookie = "sessionID=abc123; path=/";
    登录后复制
    登录后复制
    登录后复制

    使用 Axios 进行请求时,令牌会自动添加到标头中。

这两种方法都有助于我们有效地管理 Session,提供安全无缝的体验。

在 React 中管理 Session 和 Cookie 的最佳实践

在 React 应用程序中处理 Session 和 Cookie 对于构建安全、用户友好和高性能的 Web 应用程序至关重要。

为了确保我们的 React 应用程序正常工作,请执行以下操作。

使用 HttpOnlysecure 标志保护 Cookie

始终在适用的情况下包含 HttpOnlysecure 标志。

  • HttpOnly。此标志可防止通过 JavaScript 或任何其他恶意代码对 Cookie 进行攻击,从而降低跨站点脚本 (XSS) 攻击的风险。它确保 Cookie 只能由服务器访问:
    <code>名称:_ga
    值:GA1.3.210706468.1583989741
    域:.example.com
    路径:/
    过期/最大年龄:2022-03-12T05:12:53.000Z</code>
    登录后复制
    登录后复制
    登录后复制
    登录后复制
  • secure。此标志确保 Cookie 仅通过安全加密连接 (HTTPS) 发送。它可以减轻恶意用户拦截的风险:
    // 示例:设置会话 Cookie
    document.cookie = "sessionID=abc123; path=/";
    登录后复制
    登录后复制
    登录后复制

实现 Session 过期和令牌刷新

为了增强安全性,请实现 Session 过期和令牌刷新属性。定期刷新令牌或设置 Session 过期时间有助于减轻未经授权访问的风险。

  • 令牌刷新。刷新身份验证令牌以确保用户保持身份验证状态。这与具有较长用户会话的应用程序相关。
  • Session 过期。设置合理的 Session 过期时间以限制用户 Session 的持续时间。这有助于防止 Session 劫持。
// 示例:设置具有过期日期的持久性 Cookie
document.cookie = "username=JohnDoe; expires=Fri, 31 Dec 2023 23:59:59 GMT; path=/";
登录后复制
登录后复制
登录后复制

/login 端点在成功身份验证后返回初始 JWT 令牌。/refresh-token 端点使用刷新令牌生成新的访问令牌。

加密敏感数据

避免直接在 Cookie 或 Session 中存储敏感信息。为了在不可避免的情况下保留敏感数据,请在存储之前对其进行加密。加密增加了额外的安全层,即使恶意用户拦截了数据,也使其更难以访问敏感信息:

document.cookie = "token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...; path=/";
登录后复制
登录后复制
登录后复制

使用 SameSite 属性

SameSite 属性通过指定何时将 Cookie 与跨站点请求一起发送来帮助防止跨站点请求伪造 (CSRF) 攻击。

  • Strict。Cookie 仅在第一方上下文中发送,防止第三方网站代表用户发出请求。
    // 示例:在 Cookie 中存储用户偏好设置
    document.cookie = "theme=dark; path=/";
    登录后复制
    登录后复制
    登录后复制
  • Lax。允许我们使用顶级导航(例如单击链接时)发送 Cookie,但不允许使用第三方网站发起的跨站点 POST 请求:
    // 使用 express-session 中间件
    const express = require('express');
    const session = require('express-session');
    const app = express();
    
    app.use(session({
      secret: 'your-secret-key',
      resave: false,
      saveUninitialized: true,
    }));
    登录后复制
    登录后复制
    登录后复制

分离身份验证和应用程序状态

避免在 Cookie 或 Session 中存储整个应用程序状态。将身份验证数据与其他应用程序相关状态分开,以保持清晰度并最大限度地减少暴露敏感信息的风险:

// 示例:在客户端的 Cookie 中存储 Session ID
document.cookie = "sessionID=abc123; path=/";
登录后复制
登录后复制
登录后复制

利用第三方库进行 Cookie 管理

考虑使用成熟的第三方库进行 Cookie 管理。像 js-cookie 这样的库提供了简洁方便的 API,抽象了原生 document.cookie API 的复杂性:

// 设置 Cookie 的函数
const setCookie = (name, value, days) => {
  const expirationDate = new Date();
  expirationDate.setDate(expirationDate.getDate() + days);

  document.cookie = `${name}=${value}; expires=${expirationDate.toUTCString()}; path=/`;
};

// 示例:设置一个在 7 天后过期的用户名 Cookie
setCookie("username", "john_doe", 7);
登录后复制
登录后复制

定期更新依赖项

保持第三方库和框架的最新状态,以受益于安全补丁和改进。定期更新依赖项可确保我们的应用程序不易受到已知漏洞的影响。

测试安全措施

对您的应用程序定期进行安全审计和测试。这包括测试常见的漏洞,例如 XSS 和 CSRF。考虑使用安全工具和实践(如内容安全策略 (CSP))来降低安全风险。

总结

Cookie 和 Session 是构建安全高效的 React 应用程序的有用工具。它们用于管理用户身份验证、保留用户首选项或实现有状态交互。

通过遵循最佳实践并使用成熟的库,我们可以创建健壮且可靠的应用程序,这些应用程序提供无缝的用户体验,同时优先考虑安全性。

如果您喜欢这篇文章,请查看 SitePoint 提供的其他精彩资源:

  • React 性能优化
  • 2024 年最佳 React 图表库
  • React 中条件渲染的 6 种技术,附示例

以上是了解React中的饼干和会话的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板