一、HTTP相关问题
1. HTTP状态码及其含义
✅ HTTP 状态码分类:
- 1xx(信息响应):101(协议切换)
- 2xx(成功):200(OK)、201(Created)
- 3xx(重定向):301(永久重定向)、302(临时重定向)、304(缓存)
- 4xx(客户端错误):400(请求错误)、401(未授权)、403(禁止访问)、404(找不到资源)
- 5xx(服务器错误):500(服务器异常)、502(网关错误)、503(服务器过载)
常见状态码包括:
- 200 OK:请求成功。
- 301 Moved Permanently:资源永久重定向。
- 302 Found:临时重定向。
- 304 Not Modified:协商缓存生效,资源未修改。
- 400 Bad Request:请求语法错误。
- 401 Unauthorized:未认证。
- 403 Forbidden:服务器拒绝请求。
- 404 Not Found:资源不存在。
- 500 Internal Server Error:服务器内部错误。
2. GET和POST的区别
- 参数位置:GET通过URL传递,POST通过请求体。
- 安全性:GET参数可见,不适合敏感数据;POST参数不可见。
- 数据大小:GET受URL长度限制(约4KB),POST无限制。
- 缓存:GET会被浏览器主动缓存,POST需手动设置。
- TCP数据包:GET发送一个包(Header+Data),POST发送两个(先Header,后Data)。
3. 📌 1. HTTP1.0、HTTP1.1 和 HTTP2.0、HTTP3.0 有什么区别?
✅ HTTP1.0(1996年)
- 每次请求都会建立新的 TCP 连接,请求/响应完就关闭,性能低。
- 无 Keep-Alive 机制,每个请求都需重新建立连接。
- 不支持并发请求,浏览器需等待请求完成才能发起下一个请求。
✅ HTTP1.1(1999年)
- 默认开启 Keep-Alive,减少连接创建开销,提高性能。
- 支持管线化(Pipelining),可以同时发送多个请求,但服务器仍需按顺序响应,容易阻塞。
- 新增 Host 头,支持虚拟主机(多个域名共用 IP)。
- 支持分块传输(Chunked Transfer),适合大文件传输。
✅ HTTP2.0(2015年)
- 多路复用(Multiplexing):多个请求共用一个 TCP 连接,避免队头阻塞。
- 二进制格式:比 HTTP1.x 的文本格式更高效。
- 头部压缩(HPACK):减少请求头占用的带宽。
- 服务器推送(Server Push):可主动向客户端发送资源,提高性能。
✅ HTTP3.0(基于 QUIC)
- 基于 UDP 协议,减少握手延迟,连接更快。
- 避免 TCP 队头阻塞问题,每个数据流独立传输。
- 内置 TLS 1.3 加密,提高安全性。
💡 总结:HTTP3.0 最快,但目前仍未完全普及,HTTP2.0 是大多数网站的最佳选择。
4. HTTPS的工作原理
- 加密流程:基于SSL/TLS协议,通过非对称加密交换密钥,后续通信使用对称加密。
- 证书验证:客户端验证服务器证书的合法性(颁发机构、域名匹配等)。
- 端口:默认443(HTTP为80)。
二、浏览器相关问题
5. 从输入URL到页面渲染的完整流程
- DNS解析:浏览器缓存 → 系统缓存 → 路由器 → ISP → 递归查询。
- TCP三次握手:建立连接。
- 发送HTTP请求:携带请求头和参数。
- 服务器处理请求:返回响应(HTML/CSS/JS等)。
- 浏览器解析渲染:
- 构建DOM树(HTML解析)。
- 构建CSSOM树(样式规则)。
- 合并生成渲染树(Render Tree)。
- 布局(Layout)和绘制(Painting)。
- TCP四次挥手:关闭连接。
6. 浏览器缓存机制
- 强制缓存:通过
Cache-Control
(优先级高)或Expires
头控制,直接使用本地缓存。 - 协商缓存:通过
ETag
(资源标识)或Last-Modified
(修改时间)验证资源是否更新,返回304时复用缓存。
7. 跨域解决方案
✅ 跨域(Same-Origin Policy):
同源策略(Same-Origin Policy)是浏览器的安全机制,要求协议、域名、端口都相同才能访问资源。
✅ 跨域解决方案:
- CORS(推荐):服务端配置
Access-Control-Allow-Origin
头,允许跨域请求。 - JSONP:利用
<script>
标签的跨域能力,但仅支持GET
请求。 - Nginx 反向代理:在服务器端代理请求,避免跨域。
- PostMessage:用于iframe 之间通信。
- WebSocket:不受同源策略限制,可跨域通信。
💡 推荐使用 CORS + Nginx 反向代理。
8 Cookie、LocalStorage、SessionStorage的区别
特性 | Cookie | LocalStorage | SessionStorage |
---|---|---|---|
生命周期 | 可设置过期时间 | 永久存储 | 页面关闭失效 |
存储大小 | 4KB | 5MB | 5MB |
自动携带请求 | 是(Header中) | 否 | 否 |
服务端操作 | 是(Set-Cookie头) | 仅客户端 | 仅客户端 。 |
9. TCP三次握手与四次挥手
📌 2. TCP 三次握手和四次挥手的过程?
✅ TCP 三次握手(建立连接):
- 客户端 发送 SYN(同步)请求,表示“我要建立连接”。
- 服务器 返回 SYN+ACK(确认),表示“可以建立连接”。
- 客户端 发送 ACK(确认),连接建立成功。
✅ TCP 四次挥手(断开连接):
- 客户端 发送 FIN(终止),表示“我要关闭连接”。
- 服务器 返回 ACK,表示“收到请求,但还没准备好断开”。
- 服务器 发送 FIN,表示“现在可以关闭了”。
- 客户端 发送 ACK,连接完全断开。
💡 为什么挥手要四次?
因为 TCP 是全双工通信,双方都需要单独关闭自己的数据通道,所以需要 4 次挥手。
三、高频扩展问题
10. HTTP无状态如何解决?
通过Cookie(客户端)或Session(服务端)记录状态。
11. TCP与UDP的区别?
- TCP:面向连接、可靠传输(如HTTP)、有拥塞控制。
- UDP:无连接、高效(如视频流)、不保证可靠性。
12. 页面渲染优化策略?
- 减少DOM层级,避免深层嵌套。
- CSS放在头部,JS使用
defer
/async
避免阻塞。 - 使用缓存减少重复请求。
13. ** GET 和 POST 的区别?**
✅ 主要区别:
对比项 | GET | POST |
---|---|---|
参数传输 | URL ?拼接 | Request Body |
安全性 | 低(参数暴露) | 高(数据在 Body 中) |
数据大小 | 有长度限制 | 无限制 |
缓存 | 可缓存 | 不可缓存 |
幂等性 | ✅ 幂等 | ❌ 可能重复提交 |
性能 | 较快 | 稍慢(需要服务器解析 Body) |
💡 总结:
- GET 适合查询数据,如搜索、页面跳转。
- POST 适合提交数据,如表单、上传文件。
14. 强缓存 vs 协商缓存?
✅ 浏览器缓存分为:
强缓存(不用请求服务器):
Expires
(HTTP1.0):指定缓存到期时间,受客户端时间影响。Cache-Control: max-age=3600
(HTTP1.1):相对时间,单位秒。
协商缓存(需要服务器确认):
Last-Modified
+If-Modified-Since
(基于修改时间)。ETag
+If-None-Match
(基于文件指纹)。
💡 缓存策略:
- 静态资源(CSS/JS/图片) -> 强缓存,减少请求数。
- API 接口数据 -> 协商缓存,确保数据最新。
15. 重排(Reflow)和重绘(Repaint)的区别?
对比项 | 重排(Reflow) | 重绘(Repaint) |
---|---|---|
影响 | 计算位置和大小,性能开销大 | 仅修改颜色等样式,性能影响小 |
触发方式 | 改变尺寸、布局(width 、height 、display ) |
修改颜色、背景 |
优化 | CSS3 变换 (transform ) |
避免频繁改动样式 |
16. 前端如何优化网页性能?
✅ 优化策略:
- 减少 HTTP 请求(合并 CSS/JS、使用雪碧图)。
- 开启 Gzip 压缩(减少文件体积)。
- 使用 CDN 加速(减少服务器压力)。
- 合理使用缓存(强缓存 + 协商缓存)。
- 懒加载 & 预加载(
lazyload
、prefetch
)。 - 优化 DOM 操作(减少回流、批量操作)。
- 使用 HTTP2.0 多路复用。
17. 什么是 XSS(跨站脚本攻击)?如何防范?
✅ XSS(Cross-Site Scripting):攻击者在网页中注入恶意 JavaScript 代码,从而窃取用户信息、劫持会话、篡改页面等。
✅ XSS 类型:
- 存储型 XSS(Persistent XSS):恶意代码存入数据库,当用户访问时执行。
示例:攻击者提交<script>alert('Hacked!')</script>
到评论区,其他人访问该页面时会执行脚本。 - 反射型 XSS(Reflected XSS):攻击代码作为 URL 参数传输,诱导用户点击触发。
示例:https://example.com?search=<script>alert('XSS')</script>
- DOM 型 XSS(DOM-based XSS):前端 JavaScript 操作不当导致 XSS。
示例:document.write(location.search); // 直接拼接 URL 参数,易受 XSS 攻击
✅ 如何防范 XSS?
- 输入校验(过滤恶意代码):
- 禁止
<script>
、onerror
等可执行代码。 - 仅允许安全 HTML 标签,如
<b>
、<i>
、<p>
。
- 禁止
- 输出编码:
- 使用
innerText
代替innerHTML
,防止 HTML 解析。 encodeURIComponent()
对 URL 进行编码。
- 使用
- CSP(内容安全策略):
- 只允许指定来源的脚本执行,禁止
inline
代码。
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com
- 只允许指定来源的脚本执行,禁止
- HttpOnly Cookie:禁止 JavaScript 读取 Cookie,防止 XSS 窃取 Session。
18. 什么是 CSRF(跨站请求伪造)?如何防范?
✅ CSRF(Cross-Site Request Forgery):攻击者伪造用户身份,在用户不知情的情况下执行恶意操作(如转账、改密码)。
✅ CSRF 攻击示例:
- 用户登录
bank.com
(已有 Cookie)。 - 访问攻击者网站
evil.com
,该网站自动请求:<img src="https://bank.com/transfer?to=attacker&amount=10000" />
- 浏览器带上
bank.com
的 Cookie,导致自动转账。
✅ 如何防范 CSRF?
- SameSite Cookie(最推荐):
SameSite=Strict
:禁止任何跨站请求携带 Cookie。SameSite=Lax
:仅允许GET
请求携带 Cookie,不允许表单提交。
Set-Cookie: sessionid=abc123; HttpOnly; Secure; SameSite=Strict
- CSRF Token(令牌校验):
- 后端生成
csrf_token
并存入表单。 - 提交时,校验
csrf_token
是否匹配。
- 后端生成
- Referer 校验:
- 服务器检查请求头
Referer
是否来自本站。
- 服务器检查请求头
- CORS 限制:
- 通过
Access-Control-Allow-Origin
仅允许可信域访问。
- 通过
19. Cookie 和 Token 的区别?
✅ Cookie:
- 存储位置:浏览器(自动随请求发送)。
- 安全性:容易被 XSS 窃取。
- 用途:主要用于会话管理(Session ID)。
✅ Token(如 JWT):
- 存储位置:LocalStorage / SessionStorage / Cookie。
- 安全性:不自动随请求发送,需手动放入
Authorization
头。 - 用途:适合前后端分离,可用于单点登录(SSO)。
💡 推荐使用 Token 进行身份认证,搭配 HttpOnly Cookie 保护安全。
20. OAuth2.0 认证流程?
✅ OAuth2.0 是常见的第三方授权登录协议,如**“使用 GitHub 登录”**。
✅ OAuth2.0 授权流程:
- 用户点击 “使用 GitHub 登录”。
- 跳转到 GitHub 授权页面,用户输入 GitHub 账号密码。
- GitHub 返回授权码(code)。
- 前端用
code
请求服务器,服务器向 GitHub 获取 access_token。 - 服务器用
access_token
请求 GitHub API,获取用户信息。
✅ OAuth2.0 常见授权方式:
- 授权码模式(最安全,推荐)。
- 隐式模式(Token 存储在 URL,容易泄露)。
- 密码模式(不推荐,用户需提供密码)。
21. HTTPS 如何保证数据安全?
✅ HTTPS = HTTP + SSL/TLS 加密,主要作用:
- 数据加密:防止流量被窃听(防止中间人攻击)。
- 身份认证:防止钓鱼网站(CA 证书验证)。
- 数据完整性:防止数据被篡改(MAC 机制)。
✅ TLS 握手过程:
- 客户端:发起 HTTPS 请求,提供支持的加密算法列表。
- 服务器:返回 SSL 证书,包含公钥和加密算法。
- 客户端:
- 验证服务器证书是否可信。
- 生成随机数,并用公钥加密,发送给服务器。
- 服务器:
- 用私钥解密随机数。
- 生成会话密钥,用于后续对称加密通信。
22. 前端如何进行数据加密?
✅ 常见加密方式:
加密方式 | 特点 | 应用场景 |
---|---|---|
MD5/SHA | 单向哈希,不可逆 | 存储密码(加盐) |
AES | 对称加密 | 传输敏感数据 |
RSA | 非对称加密 | 登录密码加密 |
Base64 | 仅编码,不安全 | 传输图片 |
✅ 示例:RSA 加密登录密码
import JSEncrypt from 'jsencrypt';
const encrypt = new JSEncrypt();
encrypt.setPublicKey(PUBLIC_KEY);
const encryptedPwd = encrypt.encrypt(password);
💡 服务器收到加密密码后,用私钥解密。