第 9 卷
• 场景描述:PWA(渐进式Web应用)等支持离线访问的应用,对离线存储的业务数据(如离线订
- 实现方式:使用Service Worker配合IndexedDB,对离线数据进行AES加密存储。
二、前端加密的核心限制(不可替代后端加密)
前端加密的安全性依赖于浏览器环境和客户端代码,存在诸多不可控因素,因此无法替代后端加密,仅能作为补充手段,核心限制如下:
- 密钥易泄露
• 前端加密的密钥必须存储在前端代码中(如JS文件)或通过网络传输到前端,攻击者可通过查看源
代码、拦截网络请求等方式获取密钥。一旦密钥泄露,加密数据可被轻易解密。
• 示例:前端使用RSA加密密码,公钥存储在JS文件中,攻击者可直接获取公钥,无法保证加密的安
全性(仅能防止明文传输,无法防止密钥被获取后的解密尝试)。
- 加密逻辑易被篡改
• 前端代码完全暴露在客户端,攻击者可通过修改JS代码篡改加密逻辑(如禁用加密、替换为明文传
输),后端无法识别。
• 示例:攻击者通过浏览器开发者工具修改登录页面的JS代码,绕过密码加密逻辑,直接提交明文密
码。
- 浏览器环境不可控
• 前端加密依赖浏览器的加密API(如Web Crypto API),若浏览器存在安全漏洞,或用户使用被篡
改的浏览器(如植入恶意插件的浏览器),加密过程可能被监控或篡改,导致数据泄露。
- 无法保证后端接收数据的安全性
• 前端加密仅能保证数据传输过程的安全性,无法保证后端接收数据后的数据存储、处理过程的安全
性(如后端数据库被攻击)。后端必须对接收的加密数据再次验证、解密,并进行后端加密存储。
- 性能开销与兼容性问题
• 前端加密(尤其是非对称加密)需要消耗浏览器的CPU资源,可能影响页面性能(如复杂加密逻辑
导致页面卡顿)。
• 部分旧浏览器不支持现代加密API(如Web Crypto API),存在兼容性问题,需额外处理降级方
案。
三、前端加密的使用原则
• 前端加密仅作为「补充防护」,核心安全保障必须依赖后端加密(如HTTPS、后端参数验证、数据
- 敏感数据必须在后端再次加密存储,前端加密仅用于传输过程的临时保护。
- 避免在前端存储核心密钥,尽量通过HTTPS等安全渠道动态获取密钥,且密钥有效期不宜过长。
- 前端加密需配合后端签名验证,防止加密逻辑被篡改。
- 如何在前端实现安全的认证和授权机制?
前端认证和授权是Web应用安全的核心环节,认证(Authentication)用于验证用户身份(如“你是谁”),授权(Authorization)用于控制用户可访问的资源(如“你能做什么”)。前端实现安全的
认证和授权,需结合后端接口、安全的令牌机制、权限控制逻辑,同时防范会话劫持、令牌泄露等安全风险。
一、核心认证机制:基于Token的认证(推荐,替代Session认证)
目前前端主流的认证方式是「基于Token的无状态认证」(如JWT、OAuth 2.0),替代传统的 Session认证,其核心优势是无状态、可扩展、支持跨域,具体实现流程如下:
- 基于JWT(JSON Web Token)的认证流程
• JWT结构:由Header(头部,指定加密算法)、Payload(载荷,存储用户ID、角色等非敏感信
息)、Signature(签名,后端用密钥生成,防止篡改)三部分组成,通过Base64编码拼接而成。
• 实现步骤:
- 用户登录:前端将用户名/密码通过HTTPS提交到后端登录接口(密码建议前端先简单加密,如
RSA,避免明文传输)。
- 后端验证:后端验证用户名/密码正确后,生成JWT令牌(设置有效期,如2小时),返回给前
端。
- 前端存储:前端将JWT令牌存储在localStorage/sessionStorage中(不建议存储在Cookie中,
避免CSRF攻击)。
- 后续请求:前端在所有需要认证的AJAX请求头中携带JWT令牌(如Authorization: Bearer
<token>)。
- 后端验证:后端接收请求后,验证JWT令牌的有效性(是否过期、签名是否正确),验证通过则
放行,返回数据;验证失败则返回401 Unauthorized(未授权)。
- 令牌刷新:当JWT令牌快过期时,前端调用刷新令牌接口(携带旧令牌),后端生成新令牌返
回,前端更新存储的令牌。
- 基于OAuth 2.0的第三方认证(适用于第三方登录)
- 场景:用户通过微信、QQ、GitHub等第三方平台登录当前应用,无需注册新账号。
• 实现步骤:
- 换取令牌:前端将授权码提交到后端,后端通过授权码向第三方平台换取访问令牌(Access
Token)和刷新令牌(Refresh Token)。
- 认证授权:后端通过访问令牌获取用户信息(如微信用户的openid、昵称),生成当前应用的
JWT令牌返回给前端,后续流程与JWT认证一致。
二、核心授权机制:前端权限控制
授权机制用于控制用户可访问的资源和可执行的操作,前端需根据用户的角色/权限信息,实现页面级、按钮级的权限控制,核心实现方式如下:
- 权限信息存储与初始化
• 后端在用户登录成功后,返回用户的角色(如admin、user、guest)和权限列表(如view:user、
edit:user、delete:user)。
• 前端将权限信息存储在localStorage/sessionStorage中,同时存入Vuex/Redux等状态管理工具,
供全局使用。
- 页面级权限控制(路由守卫)
• 实现方式:使用前端路由守卫(如Vue Router的router.beforeEach、React Router的
Navigate),在路由跳转前验证用户是否拥有该页面的访问权限,无权限则跳转到登录页或无权限提示页。
• 示例代码逻辑:
- 定义路由权限配置: const routes = [{ path: '/admin', component: Admin,
meta: { requiresAuth: true, role: 'admin' } }]。
- 路由守卫验证:跳转前检查用户是否登录(是否存在JWT令牌)、用户角色是否匹配路由要求的
角色,不满足则拦截跳转。
- 按钮级权限控制(指令/组件封装)
• 实现方式:封装权限控制指令或组件,根据用户的权限列表,动态显示/隐藏按钮,或禁用按钮点击
事件。
• 示例:
- Vue中封装v-permission指令: <button v-permission="['edit:user']">编辑用户
</button>,指令内部判断用户权限列表是否包含edit:user,不包含则隐藏按钮。
- React中封装PermissionButton组件: <PermissionButton
permission="delete:user">删除用户</PermissionButton>,组件内部根据权限控制渲染。
全站分卷索引 · 10 卷
- 1第 1 卷
- 浏览器缓存核心面试题全解析
- 浏览器缓存核心面试题(全解析)
- 1. 浏览器缓存的工作原理
- 完整工作流程
- ◦ ✅ 缓存有效:直接读取本地缓存(强缓存),不发起网络请求,状态码 200 OK (from
- ◦ ❌ 缓存失效:发起条件请求到服务器,服务器根据资源标识判断资源是否更新:
- ▪ 资源未更新:返回 304 Not Modified,无资源体,浏览器复用本地缓存(协商缓
- 缓存存储位置(优先级从高到低)
- • Memory Cache(内存缓存):速度最快,生命周期随浏览器标签页关闭而消失,存储小体积、高
- • Disk Cache(磁盘缓存):速度稍慢,持久化存储,关闭浏览器后仍存在,存储大体积、低频使用
- • Service Worker Cache:独立于浏览器的缓存,可自定义缓存规则,支持离线访问(PWA核
- 2. HTTP头中与缓存策略相关的字段
- 2第 2 卷
- 4. 强缓存和协商缓存(核心区别+定义)
- ✅ 强缓存(本地缓存直接生效,无网络请求)
- • Cache-Control: max-age=xxx 未过期
- • Expires 时间戳未到(客户端时间未超过该值)
- • 无网络请求,加载速度最快
- • 状态码: 200 OK (from disk cache/memory cache)
- • 核心控制字段: Cache-Control(主)、 Expires(辅)
- ✅ 协商缓存(需与服务器验证,轻量网络请求)
- • 强缓存过期( max-age 到期/ Expires 超时)
- • 手动刷新页面(F5),强制跳过强缓存
- • 资源设置 Cache-Control: no-cache
- • 有网络请求,但仅传输少量头部信息,带宽消耗低
- 3第 3 卷
- ✅ 四、CDN缓存协同优化(生产必备)
- ✅ 五、避坑要点(缓存策略常见问题)
- ✅ 六、最终缓存策略总结(生产环境标配)
- 追加交付物提议
- 6. 浏览器缓存如何影响HTTP请求?不同的缓存策略会如何改变请求响
- 一、浏览器缓存对HTTP请求的核心影响
- • 拦截请求:强缓存生效时,浏览器直接复用本地缓存,不向服务器发起任何HTTP请求,彻底跳过
- • 优化请求:协商缓存时,浏览器发起“条件请求”(仅携带资源标识等少量头部信息),服务器仅
- • 改变响应逻辑:缓存存在时,服务器可能返回304(资源未更新)而非200(新资源),浏览器需复
- • 延长资源复用周期:合理的缓存策略可让资源在本地重复使用,减少同一资源的重复下载请求,提
- 二、不同缓存策略对请求响应的具体改变
- • 强制刷新(Ctrl+F5):完全禁用缓存,请求头携带Cache-Control: no-cache、Pragma: no-
- 4第 4 卷
- • Local Storage/Session Storage:虽非HTTP缓存,但可查看页面存储的本地数据,辅助判断是
- • Clear storage:一键清除所有缓存(包括磁盘/内存缓存、Service Worker缓存),方便重新测试
- 三、调试缓存的核心流程(实战步骤)
- 8. 描述浏览器如何处理强缓存和协商缓存的决策过程
- 完整决策流程(步骤拆解)
- 特殊决策场景(影响流程的关键因素)
- • 资源无缓存规则:服务器未返回任何缓存相关HTTP头,浏览器默认不缓存该资源,每次请求都从
- • 设置Cache-Control: no-cache:强制跳过强缓存流程,直接进入协商缓存,每次请求都需向服务
- • 设置Cache-Control: no-store:完全禁用缓存,浏览器不存储任何资源副本,每次请求都从服务
- • 手动/强制刷新:手动刷新(F5)强制跳过强缓存,进入协商缓存;强制刷新(Ctrl+F5)禁用所有
- 9. 其他缓存相关的问题
- 一、缓存穿透(缓存未命中,请求直达服务器)
- 5第 5 卷
- • 核心解决方案:
- 四、CDN缓存与浏览器缓存的协同
- • 核心原则:CDN缓存作为“中间代理缓存”,应与浏览器缓存规则保持一致,同时承担“就近分
- • 协同策略:
- 五、HTTP1.0与HTTP1.1缓存机制的差异
- • HTTP1.0:仅支持Expires(绝对时间戳)和Pragma: no-cache,依赖客户端本地时间,易出现缓
- • HTTP1.1:新增Cache-Control(支持max-age、public/private等多指令)、ETag,优先级高于
- 一、XSS攻击的三种主要类型
- • 攻击流程:攻击者将恶意脚本注入到目标网站的数据库中(如评论区、用户资料、留言板等可提交
- • 攻击流程:攻击者构造包含恶意脚本的URL → 诱导用户点击该URL → 目标网站将URL中的恶意脚
- • 特点:恶意脚本不存储在服务器,仅存在于攻击URL中,需用户主动点击才能触发,危害相对存储
- • 攻击流程:攻击者构造包含恶意脚本的URL → 用户点击后,目标网站的前端JavaScript代码从URL
- 6第 6 卷
- 11. 解释跨站请求伪造(CSRF)攻击及其防御机制
- 一、CSRF攻击的核心原理与流程
- • 核心前提:用户已登录目标网站,浏览器保存了该网站的身份凭证(如Session Cookie),且
- • 攻击流程:
- 二、CSRF攻击的典型场景
- 三、CSRF的核心防御机制(前端+后端协同)
- • 原理:服务器为每个登录用户生成一个唯一的、随机的CSRF Token(令牌),并将Token存储在
- • 实现流程:
- • 前端注意事项:AJAX请求需主动在请求头中携带Token,避免遗漏;禁止将Token存储在Cookie
- • 原理:HTTP请求头中的Referer字段记录了请求的来源页面URL,Origin字段记录了请求的来源域
- • 实现方式:
- • 局限性:Referer可能被浏览器插件、代理服务器篡改或隐藏(如用户设置隐私模式),无法作为唯
- 7第 7 卷
- • 输入合法性校验:根据业务场景,对用户输入的数据类型、格式、长度进行严格校验,拒绝不符合
- • 特殊字符过滤/转义:对用户输入中的SQL特殊字符(如单引号'、双引号"、分号;、逗号,、星号*、-
- • 对所有用户输入字段设置合理的长度限制(如用户名3-20位、密码6-20位、评论内容0-500字),
- • 目的:缩短攻击者可注入的恶意SQL代码长度,降低攻击成功率(复杂的恶意SQL语句通常需要较
- • 禁止在前端将用户输入拼接到任何类似SQL的字符串中(即使是前端模拟数据展示),避免被攻击
- • 示例:前端搜索功能,禁止将用户输入的关键词直接拼接到类似 SELECT * FROM goods
- • 敏感操作使用POST请求:GET请求的参数会暴露在URL中,易被攻击者篡改和利用;敏感接口
- • 避免在URL中暴露敏感参数:如用户ID、订单ID、数据库表名等敏感信息,不要作为URL参数传递
- • 对用户输入的非法内容,给出明确的错误提示(如“用户名仅允许字⺟、数字、下划线”),引导
- • 避免给出详细的错误信息:如用户登录失败时,提示“用户名或密码错误”,而非“用户名不存
- • 前端向后端传递用户输入时,采用“键值对”的形式传递原始数据(而非拼接后的字符串),让后
- • 示例:登录请求传递 {username: "admin", password: "123456"},而非传递拼接后的
- 8第 8 卷
- 14. 解释同源策略(SOP)及其对Web安全的意义
- 一、同源的定义(三个条件必须同时满足)
- • 协议(Protocol)相同:如都是HTTP或都是HTTPS(http://example.com与
- • 域名(Domain)相同:如example.com与www.example.com不同源(子域名不同),
- • 端口(Port)相同:如http://example.com:80与http://example.com:8080不同源(默认端口可
- 二、同源策略的核心限制范围
- • 不同源的脚本无法访问当前源页面的DOM元素,如通过iframe嵌入的不同源页面,父页面无法获取
- • 示例:攻击者在恶意网站中嵌入银行网站的iframe,由于同源策略限制,恶意脚本无法获取iframe
- • 不同源的脚本无法访问当前源的本地存储数据,包括Cookie、localStorage、sessionStorage、
- • 示例:恶意网站的脚本无法读取用户访问银行网站时存储在localStorage中的用户信息,也无法获
- • 不同源的脚本无法向当前源发起AJAX/Fetch请求(跨域请求),浏览器会拦截该请求,返回CORS
- • 示例:前端项目部署在http://frontend.com,无法直接通过AJAX请求http://backend.com的接口
- 9第 9 卷
- • 场景描述:PWA(渐进式Web应用)等支持离线访问的应用,对离线存储的业务数据(如离线订
- 二、前端加密的核心限制(不可替代后端加密)
- • 前端加密的密钥必须存储在前端代码中(如JS文件)或通过网络传输到前端,攻击者可通过查看源
- • 示例:前端使用RSA加密密码,公钥存储在JS文件中,攻击者可直接获取公钥,无法保证加密的安
- • 前端代码完全暴露在客户端,攻击者可通过修改JS代码篡改加密逻辑(如禁用加密、替换为明文传
- • 示例:攻击者通过浏览器开发者工具修改登录页面的JS代码,绕过密码加密逻辑,直接提交明文密
- • 前端加密依赖浏览器的加密API(如Web Crypto API),若浏览器存在安全漏洞,或用户使用被篡
- • 前端加密仅能保证数据传输过程的安全性,无法保证后端接收数据后的数据存储、处理过程的安全
- • 前端加密(尤其是非对称加密)需要消耗浏览器的CPU资源,可能影响页面性能(如复杂加密逻辑
- • 部分旧浏览器不支持现代加密API(如Web Crypto API),存在兼容性问题,需额外处理降级方
- 三、前端加密的使用原则
- • 前端加密仅作为「补充防护」,核心安全保障必须依赖后端加密(如HTTPS、后端参数验证、数据
- 10第 10 卷
- • 实现方式:使用AJAX请求拦截器,对需要特定权限的接口,前端先验证用户是否拥有该权限,无权
- • 注意:前端接口级权限控制仅为辅助,后端必须对每个敏感接口再次验证用户权限,防止攻击者绕
- 三、前端认证和授权的安全加固措施
- • 使用HTTPS协议:所有认证相关的请求(登录、令牌刷新、敏感接口)必须通过HTTPS传输,防
- • 安全存储令牌:
- • 设置合理的令牌有效期:JWT令牌有效期不宜过长(如2小时),同时实现令牌刷新机制(Refresh
- • 防范XSS攻击窃取令牌:开启CSP(内容安全策略)、对用户输入进行过滤编码、避免使用
- • 防范CSRF攻击:若使用Cookie存储令牌,必须设置SameSite属性;同时对敏感操作(如修改密
- • 用户退出登录时清理数据:用户点击退出登录后,前端需清除存储的令牌、权限信息等,同时调用
- • 敏感操作二次验证:对核心敏感操作(如修改密码、绑定手机号、大额转账),添加验证码、短信
- 四、常见问题与避坑要点
- • ❌ 仅依赖前端权限控制:后端必须对所有敏感接口进行权限验证,前端权限控制仅为用户体验优