云计算百科
云计算领域专业知识百科平台

vivo 产品前端一面 中

  • 在一个用户登录系统中,cookie是如何发挥作用和管理的?以及比如httponly介绍
  • ### 一、Cookie 在用户登录系统中的核心作用

    HTTP 协议本身是**无状态**的(服务器无法记住两次请求是否来自同一个用户),而登录系统需要识别用户身份,Cookie 正是解决这个问题的核心手段,主要作用有:

    1. **身份标识**:用户登录成功后,服务器生成唯一的 `session_id`(关联用户信息,存储在服务器端如 Redis),并通过 `Set-Cookie` 响应头将 `session_id` 发送给浏览器,浏览器将其存储为 Cookie。

    2. **状态保持**:后续用户访问系统的任意页面时,浏览器会自动将该 Cookie 附加在请求头中发送给服务器,服务器通过 `session_id` 就能识别出用户身份,无需重复登录。

    3. **登录持久化**:通过设置 Cookie 的过期时间(如“记住我”功能),让 Cookie 长期存储在浏览器中,用户下次打开网站无需重新登录。

    ### 二、登录系统中 Cookie 的典型管理流程

    以常见的 Web 登录系统为例,Cookie 的完整生命周期如下:

    ```mermaid

    flowchart LR

        A[用户输入账号密码提交登录请求] –> B[服务器验证账号密码]

        B –>|验证失败| C[返回登录失败提示]

        B –>|验证成功| D[生成session_id,关联用户信息存储在服务器]

        D –> E[服务器通过Set-Cookie响应头,将session_id写入浏览器Cookie]

        E –> F[用户后续请求任意接口]

        F –> G[浏览器自动携带Cookie到服务器]

        G –> H[服务器解析Cookie中的session_id,验证用户身份]

        H –> I[返回对应用户的个性化内容]

        J[用户登出] –> K[服务器设置Cookie过期,浏览器删除该Cookie]

    ```

    ### 三、Cookie 的关键管理方式(含安全配置)

    在登录系统中,Cookie 管理的核心是**安全存储**和**有效验证**,关键配置如下:

    #### 1. 服务端设置 Cookie(以 Node.js/Express 为例)

    ```javascript

    const express = require('express');

    const app = express();

    const session = require('express-session');

    const redisStore = require('connect-redis')(session);

    const redis = require('redis');

    const client = redis.createClient({ host: 'localhost', port: 6379 });

    // 配置session(底层依赖Cookie)

    app.use(session({

      store: new redisStore({ client }), // session_id 关联的用户信息存在Redis

      secret: 'your-secret-key', // 加密Cookie的密钥(必填,防止Cookie被篡改)

      resave: false,

      saveUninitialized: false,

      cookie: {

        httpOnly: true, // 核心安全属性,下文重点讲

        secure: process.env.NODE_ENV === 'production', // 仅在HTTPS下传输(生产环境必须开启)

        sameSite: 'strict', // 防止CSRF攻击,仅同域名请求携带Cookie

        maxAge: 7 * 24 * 60 * 60 * 1000 // Cookie有效期7天(对应“记住我”功能)

      }

    }));

    // 登录接口

    app.post('/login', (req, res) => {

      const { username, password } = req.body;

      // 模拟验证账号密码(实际项目中需查数据库+密码加密验证)

      if (username === 'admin' && password === '123456') {

        req.session.user = { username, id: 1 }; // 将用户信息关联到session

        res.json({ code: 200, msg: '登录成功' });

      } else {

        res.json({ code: 401, msg: '账号或密码错误' });

      }

    });

    // 验证登录状态的接口

    app.get('/profile', (req, res) => {

      if (req.session.user) { // 通过session_id验证用户身份

        res.json({ code: 200, data: req.session.user });

      } else {

        res.json({ code: 401, msg: '未登录' });

      }

    });

    // 登出接口(清除Cookie)

    app.post('/logout', (req, res) => {

      req.session.destroy(); // 销毁服务器端的session

      res.clearCookie('connect.sid'); // 清除浏览器中的Cookie

      res.json({ code: 200, msg: '登出成功' });

    });

    app.listen(3000, () => console.log('服务器运行在3000端口'));

    ```

    #### 2. 关键配置解释

    – `secret`:用于加密 Cookie 内容,防止 Cookie 被篡改(如 `session_id` 被伪造)。

    – `maxAge`:Cookie 的有效期(毫秒),设置为 `0` 或负数表示关闭浏览器即失效(临时登录),设置为较大值则实现“记住我”。

    – `secure`:仅在 HTTPS 协议下传输 Cookie,防止明文传输时被窃取(生产环境必须开启)。

    – `sameSite`:限制 Cookie 仅在同域名请求中携带,防范 CSRF(跨站请求伪造)攻击。

    ### 四、HttpOnly 详细介绍

    #### 1. 定义

    HttpOnly 是 Cookie 的一个**安全属性**,当 Cookie 被设置为 `HttpOnly=true` 时,客户端的 JavaScript 无法通过 `document.cookie` 读取或修改该 Cookie,只能由浏览器在 HTTP/HTTPS 请求中自动携带。

    #### 2. 核心作用:抵御 XSS 攻击

    XSS(跨站脚本攻击)是黑客在页面中注入恶意 JavaScript 代码,若 Cookie 未设置 HttpOnly,黑客可通过 `document.cookie` 获取用户的 `session_id`,进而冒充用户登录系统。

    **对比示例**:

    – 未设置 HttpOnly:`document.cookie` 能读取到 `session_id=abc123`,黑客可窃取。

    – 设置 HttpOnly:`document.cookie` 无法读取该 Cookie,XSS 攻击无法获取 `session_id`。

    #### 3. 使用注意事项

    – HttpOnly 仅限制前端 JS 访问,不影响浏览器自动携带 Cookie 到服务器(不影响登录状态验证)。

    – 无法通过前端代码修改 HttpOnly Cookie,只能由服务器通过 `Set-Cookie` 或 `clearCookie` 管理。

    – 必须与 `secure` 配合使用(HTTPS),否则 Cookie 仍可能在传输过程中被窃取。

    ### 总结

    1. Cookie 是登录系统中解决 HTTP 无状态问题的核心,通过存储 `session_id` 实现用户身份识别和状态保持。

    2. HttpOnly 是 Cookie 的关键安全属性,禁止前端 JS 访问 Cookie,核心用于抵御 XSS 攻击,保护用户登录凭证。

    3. 登录系统中管理 Cookie 需配置 `HttpOnly`、`secure`、`sameSite` 等安全属性,并合理设置过期时间,登出时需同时销毁服务器端 session 和浏览器端 Cookie。

  • Http和https的区别?
  • HTTP(超文本传输协议)和 HTTPS(超文本传输安全协议)的核心区别在于**是否对传输数据进行加密**,以及由此衍生的安全性、传输机制等差异。以下是详细的对比和解析:

    ### 一、核心定义与本质区别

    | 特性 | **HTTP** | **HTTPS** |

    |——|———-|———–|

    | 本质 | 明文传输的应用层协议 | HTTP + **SSL/TLS 加密层**的安全协议 |

    | 传输安全性 | 所有数据**明文传输**,可被窃听、篡改、伪造 | 数据经加密后传输,防窃听、防篡改、防伪造 |

    | 端口号 | 默认 80 | 默认 443 |

    | 证书要求 | 无任何证书要求 | 必须配置由**权威 CA(证书颁发机构)** 颁发的数字证书 |

    | 核心加密机制 | 无加密 | 结合**非对称加密**(身份验证、密钥协商)和**对称加密**(数据传输) |

    | 资源消耗 | 无加密解密开销,性能更高 | 加密解密过程会产生轻微性能损耗(可通过优化 TLS 版本降低) |

    | SEO 影响 | 搜索引擎无特殊优待 | 谷歌、百度等搜索引擎优先收录,排名权重更高 |

    | Cookie 安全属性 | `secure` 属性无效(强制忽略) | `secure` 属性生效(仅在 HTTPS 下携带 Cookie) |

    ### 二、关键差异的深度解析

    #### 1. 传输安全性(最核心区别)

    – **HTTP**:数据在客户端与服务器之间以**明文形式**传输。

      攻击者若在传输链路中进行**中间人攻击(MITM)**,可以直接窃取、篡改请求和响应内容。比如用户登录时的账号密码、交易信息等敏感数据会直接暴露。

    – **HTTPS**:在 HTTP 与 TCP 之间增加了 **SSL/TLS 加密层**,传输流程如下:

      1.  **身份验证**:客户端发起请求时,服务器先发送自己的数字证书,客户端验证证书的合法性(是否由可信 CA 颁发、是否被篡改)。

      2.  **密钥协商**:验证通过后,客户端与服务器通过**非对称加密**协商生成一个**对称加密密钥**(非对称加密效率低,仅用于协商密钥)。

      3.  **数据传输**:后续所有请求和响应数据,都通过**对称加密密钥**加密后传输,攻击者即使截取数据,也无法解密。

    #### 2. 数字证书的作用

    HTTPS 依赖数字证书解决两个核心问题:

    – **身份可信**:确保客户端访问的服务器是真实目标服务器,而非伪造的钓鱼服务器。

    – **密钥安全**:通过证书中的公钥,实现客户端与服务器的安全密钥协商,避免密钥在传输中被窃取。

    如果证书不被客户端信任(比如自签名证书),浏览器会弹出安全警告,阻止用户继续访问。

    #### 3. 与 Cookie 安全配置的关联

    结合你之前关注的登录系统 Cookie 管理:

    – HTTPS 是 Cookie `secure` 属性生效的前提:当 Cookie 设置 `secure: true` 时,**仅在 HTTPS 连接下**浏览器才会携带该 Cookie 发送请求,HTTP 连接下会自动忽略,防止 Cookie 明文泄露。

    – 搭配 `HttpOnly` 和 `sameSite` 属性,HTTPS 可实现 Cookie 的全方位安全防护,抵御 XSS、CSRF 等攻击。

    ### 三、适用场景对比

    – **HTTP**:适用于**非敏感数据**的传输,比如静态资源(纯文本文章、公开图片)、非登录状态的公开页面。

      目前主流网站已基本淘汰 HTTP,仅部分小众站点或内部测试系统仍在使用。

    – **HTTPS**:适用于所有涉及**敏感数据**的场景,包括用户登录、电商支付、个人信息查询、金融交易等。

      现在是主流互联网服务的标配协议。

  • 介绍一下SSL,有没有使用过SSL签发证书或是其他应用?
  • # SSL 详解:定义、工作机制、证书签发与实际应用

    SSL 的全称是 **Secure Sockets Layer(安全套接层)**,是一种用于在客户端和服务器之间建立加密连接的安全协议。它的核心目标是解决 HTTP 明文传输的安全隐患,后来被 **TLS(Transport Layer Security,传输层安全)** 协议取代(SSL 3.0 之后的版本均被纳入 TLS 体系),但日常开发和运维中仍习惯将两者统称为 **SSL/TLS**。

    ## 一、SSL 的核心功能

    SSL 协议位于 **应用层(HTTP)** 和 **传输层(TCP)** 之间,通过三大核心能力保障数据传输安全:

    1. **数据加密**

       采用 **非对称加密 + 对称加密** 结合的方式:

       – 非对称加密(如 RSA):仅用于**密钥协商**,解决对称加密密钥的安全传输问题。

       – 对称加密(如 AES):用于**实际数据传输**,加密和解密速度快,适合大量数据的加密。

    2. **身份验证**

       通过 **SSL 数字证书** 验证服务器(或客户端)的真实身份,防止中间人攻击和钓鱼网站。

    3. **数据完整性校验**

       通过 **消息认证码(MAC)** 或 **哈希算法(如 SHA-256)** 校验数据,确保传输过程中数据未被篡改。

    ## 二、SSL 的工作流程(SSL 握手过程)

    SSL 连接的建立依赖**握手阶段**完成密钥协商和身份验证,以 HTTPS 为例,完整流程如下:

    1. **客户端问候**

       客户端向服务器发送请求,包含支持的 SSL/TLS 版本、加密套件列表、随机数 `Client Random`。

    2. **服务器响应**

       服务器选择合适的 SSL/TLS 版本和加密套件,返回随机数 `Server Random`,并发送**服务器 SSL 证书**(包含服务器公钥、证书颁发机构 CA、有效期等信息)。

    3. **客户端验证证书**

       客户端验证服务器证书的合法性:

       – 检查证书是否由可信 CA 签发;

       – 检查证书是否过期;

       – 检查证书中的域名是否与当前访问域名一致。

       若验证失败,浏览器会弹出安全警告,阻止继续访问。

    4. **密钥协商**

       客户端生成一个**预主密钥(Pre-Master Secret)**,用服务器证书中的公钥加密后发送给服务器;服务器用自己的私钥解密得到预主密钥。

    5. **生成会话密钥**

       客户端和服务器分别利用 `Client Random`、`Server Random` 和预主密钥,通过相同算法生成**会话密钥(对称密钥)**。

    6. **加密传输**

       后续所有 HTTP 请求和响应数据,都通过会话密钥加密后传输,握手阶段结束。

    ## 三、SSL 证书的签发:类型、流程与 CA 机构

    SSL 证书是 SSL 协议实现身份验证的核心,由**权威 CA(Certificate Authority,证书颁发机构)** 签发,本质是一份包含服务器公钥和身份信息的数字凭证。

    ### 1. SSL 证书的类型(按验证级别划分)

    | 证书类型 | 验证强度 | 适用场景 | 特点 |

    |———-|———-|———-|——|

    | **DV(域名验证型)** | 最低 | 个人博客、小型网站 | 仅验证域名所有权,签发速度快(几分钟到几小时),免费证书多为此类(如 Let's Encrypt) |

    | **OV(组织验证型)** | 中等 | 企业官网、电商平台 | 验证域名所有权 + 企业真实身份,证书中会显示企业名称,可信度较高 |

    | **EV(扩展验证型)** | 最高 | 金融机构、大型电商 | 最严格的验证流程(验证企业身份、法律资质等),浏览器地址栏会显示绿色企业名称,安全性最高 |

    ### 2. SSL 证书的签发流程(以 DV 证书为例)

    1. **证书申请**

       开发者在 CA 平台提交申请,提供需要绑定的域名(如 `www.example.com`)。

    2. **域名验证**

       CA 机构通过以下方式之一验证申请者对域名的所有权:

       – **DNS 验证**:要求申请者在域名的 DNS 解析中添加指定的 TXT 记录;

       – **HTTP 验证**:要求申请者在网站根目录下放置 CA 提供的验证文件,CA 会访问该文件确认。

    3. **证书生成与颁发**

       验证通过后,CA 机构用自己的私钥签发证书,生成 `.crt`(证书文件)和 `.key`(私钥文件),发送给申请者。

    4. **证书部署**

       申请者将证书部署到服务器(如 Nginx、Apache),配置 HTTPS 监听端口(默认 443)。

    ### 3. 常见的 CA 机构

    – **免费 CA**:Let's Encrypt(主流免费证书,支持自动续期)、ZeroSSL;

    – **商业 CA**:DigiCert(原 Symantec)、GeoTrust、GlobalSign、阿里云/腾讯云等云厂商提供的证书服务。

    ## 四、SSL 的实际应用场景

    SSL 不仅用于 HTTPS,还广泛应用于各类需要安全传输的场景:

    1. **HTTPS 网站(最核心应用)**

       这是最常见的场景,所有涉及用户登录、支付、个人信息的网站都应部署 SSL 证书,实现数据加密传输,同时让浏览器地址栏显示锁形图标,提升用户信任度。

    2. **邮件加密**

       邮件协议(SMTP、POP3、IMAP)可通过 SSL 加密,防止邮件内容和登录凭证被窃取,常见的加密端口如 SMTPs(465)、IMAPs(993)。

    3. **FTPS 安全文件传输**

       传统 FTP 是明文传输,FTPS 基于 SSL/TLS 加密 FTP 连接,保障文件传输的安全性,适用于企业内部文件分发。

    4. **SSL VPN**

       企业远程办公常用的 VPN 方案,通过 SSL 协议在公网中建立加密隧道,员工可安全访问企业内网资源。

    5. **数据库加密连接**

       如 MySQL、PostgreSQL 等数据库支持 SSL 加密连接,防止数据库账号密码和传输的数据被中间人窃取。

    6. **物联网(IoT)设备通信**

       智能设备(如摄像头、传感器)与云端的通信可通过 SSL 加密,防止设备被劫持或数据被篡改。

    ## 五、SSL 证书的实操案例:签发与部署(Let's Encrypt + Nginx)

    以免费的 Let's Encrypt 证书为例,演示在 Nginx 服务器上的签发和部署流程:

    ### 1. 安装 Certbot 工具(Let's Encrypt 官方客户端)

    ```bash

    # Ubuntu/Debian 系统

    sudo apt update && sudo apt install certbot python3-certbot-nginx

    ```

    ### 2. 申请并自动部署证书

    ```bash

    # 自动申请证书并配置 Nginx(会自动修改 Nginx 配置文件)

    sudo certbot –nginx -d www.example.com -d example.com

    ```

    ### 3. 验证部署结果

    访问 `https://www.example.com`,浏览器地址栏显示锁形图标,说明 SSL 证书生效。

    ### 4. 配置证书自动续期(Let's Encrypt 证书有效期 90 天)

    ```bash

    # 添加定时任务,自动续期证书

    sudo crontab -e

    # 在文件末尾添加:每天凌晨 3 点检查并续期

    0 3 * * * /usr/bin/certbot renew –quiet

    ```

    ## 总结

    SSL 是实现数据安全传输的核心协议,其本质是通过**加密、身份验证、完整性校验**解决网络传输的安全问题;而 SSL 证书是实现身份验证的关键载体,由权威 CA 签发,不同验证级别的证书适用于不同场景。目前 SSL 已被 TLS 取代,但两者的核心原理和应用方式完全一致,日常开发中只需关注 TLS 1.2/1.3 等主流版本的配置即可。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » vivo 产品前端一面 中
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!