HTTP 和 HTTPS
一、HTTP 基础
1. HTTP 是什么?
HTTP(HyperText Transfer Protocol) 是用于传输超媒体文档的应用层协议。
特点:
- ✅ 无状态 - 每个请求独立,不保存状态
- ✅ 请求-响应模式 - 客户端发送请求,服务端返回响应
- ✅ 基于 TCP - HTTP 运行在 TCP 之上(默认端口 80)
- ✅ 明文传输 - 默认不加密(HTTPS 加密)
2. HTTP 版本
HTTP/0.9(1991):
- 只支持 GET 方法
- 只返回 HTML
HTTP/1.0(1996):
- 支持多种方法(GET、POST、HEAD)
- 支持多种内容类型
- 支持请求头和响应头
HTTP/1.1(1997,当前主流):
- 持久连接(Keep-Alive)
- 管道化(Pipelining)
- 分块传输编码(Chunked Transfer Encoding)
- 缓存控制增强
HTTP/2(2015):
- 多路复用(Multiplexing)
- 服务器推送(Server Push)
- 头部压缩(HPACK)
- 二进制分帧
HTTP/3(2020):
- 基于 QUIC 协议(UDP)
- 更快连接建立
- 改进的拥塞控制
二、HTTP 请求和响应
1. HTTP 请求结构
GET /api/users HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: application/json
Content-Type: application/json
Authorization: Bearer token123
请求体(可选)请求行:
- 方法 - GET、POST、PUT、DELETE 等
- URL - 请求的资源路径
- 版本 - HTTP/1.1、HTTP/2
请求头:
Host- 服务器域名User-Agent- 客户端信息Accept- 接受的响应类型Content-Type- 请求体类型Authorization- 认证信息Cookie- 客户端 Cookie
2. HTTP 响应结构
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 123
Date: Wed, 21 Oct 2025 12:00:00 GMT
Set-Cookie: session=abc123
响应体状态行:
- 版本 - HTTP/1.1
- 状态码 - 200、404、500 等
- 状态文本 - OK、Not Found、Internal Server Error
响应头:
Content-Type- 响应体类型Content-Length- 响应体长度Set-Cookie- 设置 CookieCache-Control- 缓存控制Location- 重定向地址
3. HTTP 方法
| 方法 | 说明 | 幂等性 | 安全性 | 请求体 |
|---|---|---|---|---|
| GET | 获取资源 | ✅ | ✅ | ❌ |
| POST | 创建资源 | ❌ | ❌ | ✅ |
| PUT | 更新资源(全量) | ✅ | ❌ | ✅ |
| PATCH | 更新资源(部分) | ❌ | ❌ | ✅ |
| DELETE | 删除资源 | ✅ | ❌ | ❌ |
| HEAD | 获取响应头 | ✅ | ✅ | ❌ |
| OPTIONS | 获取支持的方法 | ✅ | ✅ | ❌ |
| TRACE | 回显请求 | ✅ | ✅ | ❌ |
| CONNECT | 建立隧道 | - | ❌ | - |
幂等性: 多次执行相同操作,结果相同
安全性: 不修改服务器状态
4. HTTP 状态码
1xx - 信息性:
100 Continue- 继续101 Switching Protocols- 切换协议
2xx - 成功:
200 OK- 成功201 Created- 已创建204 No Content- 无内容206 Partial Content- 部分内容
3xx - 重定向:
301 Moved Permanently- 永久重定向302 Found- 临时重定向304 Not Modified- 未修改(缓存)
4xx - 客户端错误:
400 Bad Request- 错误请求401 Unauthorized- 未授权403 Forbidden- 禁止访问404 Not Found- 未找到409 Conflict- 冲突429 Too Many Requests- 请求过多
5xx - 服务器错误:
500 Internal Server Error- 服务器内部错误502 Bad Gateway- 网关错误503 Service Unavailable- 服务不可用504 Gateway Timeout- 网关超时
三、HTTP 缓存
1. 强缓存
Cache-Control:
http
Cache-Control: max-age=3600 # 缓存 3600 秒
Cache-Control: no-cache # 需要验证
Cache-Control: no-store # 不缓存
Cache-Control: private # 仅客户端缓存
Cache-Control: public # 客户端和代理都可缓存Expires:
http
Expires: Wed, 21 Oct 2025 12:00:00 GMT优先级: Cache-Control > Expires
2. 协商缓存
ETag:
http
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"Last-Modified:
http
Last-Modified: Wed, 21 Oct 2025 12:00:00 GMT
If-Modified-Since: Wed, 21 Oct 2025 12:00:00 GMT优先级: ETag > Last-Modified
3. 缓存策略
最佳实践:
- 静态资源:强缓存(max-age 较长)
- 动态资源:协商缓存或 no-cache
- 敏感数据:no-store
四、HTTP/2
1. HTTP/2 特性
多路复用(Multiplexing):
- 一个连接可以同时处理多个请求
- 避免 HTTP/1.1 的队头阻塞问题
头部压缩(HPACK):
- 使用 HPACK 算法压缩头部
- 减少头部大小
服务器推送(Server Push):
- 服务器可以主动推送资源
- 减少客户端请求次数
二进制分帧:
- 使用二进制格式
- 更高效的解析
2. HTTP/2 vs HTTP/1.1
| 特性 | HTTP/1.1 | HTTP/2 |
|---|---|---|
| 多路复用 | ❌ | ✅ |
| 头部压缩 | ❌ | ✅ |
| 服务器推送 | ❌ | ✅ |
| 二进制分帧 | ❌ | ✅ |
| 请求管道化 | ✅(有限) | ✅(真正) |
| 连接数 | 多个连接 | 单个连接 |
3. HTTP/2 使用
浏览器自动支持:
- 现代浏览器自动支持 HTTP/2
- 需要 HTTPS(大多数浏览器要求)
服务器配置:
nginx
# Nginx
listen 443 ssl http2;
server {
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
http2 on;
}五、HTTPS(安全超文本传输协议)
1. HTTPS 是什么?
HTTPS = HTTP + SSL/TLS
特点:
- ✅ 加密传输 - 数据加密,防止窃听
- ✅ 身份认证 - 验证服务器身份
- ✅ 数据完整性 - 防止数据被篡改
2. SSL/TLS 握手过程
详细流程:
1. 客户端发送 Client Hello
- 支持的 TLS 版本
- 支持的加密套件
- 随机数(Client Random)
2. 服务器发送 Server Hello
- 选择的 TLS 版本
- 选择的加密套件
- 服务器证书
- 随机数(Server Random)
3. 客户端验证证书
- 验证证书有效性
- 验证证书链
- 验证域名匹配
4. 客户端生成预主密钥(Pre-Master Secret)
- 使用服务器公钥加密
- 发送给服务器
5. 双方计算会话密钥
- Client Random + Server Random + Pre-Master Secret
- 生成对称加密密钥
6. 客户端发送 Finished
- 使用会话密钥加密
- 包含所有握手消息的摘要
7. 服务器发送 Finished
- 使用会话密钥加密
- 包含所有握手消息的摘要
8. 开始加密通信3. 证书
证书内容:
- 域名
- 公钥
- 颁发机构(CA)
- 有效期
- 数字签名
证书类型:
- DV(Domain Validation) - 域名验证
- OV(Organization Validation) - 组织验证
- EV(Extended Validation) - 扩展验证
免费证书:
- Let's Encrypt
- Cloudflare
- 阿里云、腾讯云
4. 混合内容(Mixed Content)
问题: HTTPS 页面加载 HTTP 资源
浏览器行为:
- 阻止混合内容(默认)
- 显示警告
解决方案:
- 所有资源使用 HTTPS
- 使用相对协议(//example.com)
六、Cookie 和 Session
1. Cookie
设置 Cookie:
http
Set-Cookie: session=abc123; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=3600Cookie 属性:
Path- Cookie 路径Domain- Cookie 域名Expires/Max-Age- 过期时间HttpOnly- 禁止 JavaScript 访问Secure- 仅 HTTPS 传输SameSite- 防止 CSRF 攻击
SameSite 值:
Strict- 严格模式,完全禁止跨站Lax- 宽松模式,允许 GET 请求None- 允许跨站(需要 Secure)
2. Session
Session vs Cookie:
| 特性 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端 | 服务端 |
| 安全性 | 较低 | 较高 |
| 存储大小 | 有限(4KB) | 无限制 |
| 性能 | 每次请求携带 | 需要服务端存储 |
Session 实现:
- 服务端存储 Session 数据
- 客户端存储 Session ID(通常通过 Cookie)
- 根据 Session ID 查找 Session 数据
七、CORS(跨域资源共享)
1. 什么是跨域?
同源策略:
- 协议、域名、端口必须完全相同
- 不同源之间的请求被浏览器阻止
跨域场景:
http://example.com → https://example.com ❌ 协议不同
http://example.com → http://api.example.com ❌ 域名不同
http://example.com:80 → http://example.com:8080 ❌ 端口不同2. CORS 解决方案
简单请求:
http
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type预检请求(Preflight):
http
OPTIONS /api/users HTTP/1.1
Origin: https://example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400服务端配置:
csharp
// ASP.NET Core
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowAll", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
options.AddPolicy("AllowSpecific", builder =>
{
builder.WithOrigins("https://example.com")
.WithMethods("GET", "POST")
.WithHeaders("Content-Type", "Authorization");
});
});
app.UseCors("AllowAll");3. 其他跨域解决方案
JSONP:
javascript
function handleResponse(data) {
console.log(data);
}
var script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';
document.body.appendChild(script);代理:
- 通过同源服务器代理请求
- 前端 → 同源服务器 → 目标服务器
八、HTTP 安全
1. XSS(跨站脚本攻击)
类型:
- 存储型 XSS - 恶意脚本存储在服务器
- 反射型 XSS - 恶意脚本在 URL 中
- DOM 型 XSS - 客户端脚本修改 DOM
防护:
- 输入验证和过滤
- 输出转义
- 使用 Content-Security-Policy(CSP)
http
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'2. CSRF(跨站请求伪造)
防护:
- 使用 CSRF Token
- 验证 Referer
- 使用 SameSite Cookie
csharp
// ASP.NET Core
builder.Services.AddAntiforgery(options =>
{
options.HeaderName = "X-CSRF-TOKEN";
});3. 点击劫持(Clickjacking)
防护:
http
X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN4. 其他安全头
http
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin九、性能优化
1. HTTP/1.1 优化
减少请求数:
- 合并 CSS/JS 文件
- 使用 CSS Sprites
- 内联小图片(Base64)
减少请求大小:
- 压缩(Gzip/Brotli)
- 移除不必要的头部
- 使用 CDN
使用缓存:
- 浏览器缓存
- CDN 缓存
2. HTTP/2 优化
利用多路复用:
- 不需要合并文件
- 可以并行加载多个小文件
服务器推送:
- 推送关键资源(CSS、JS)
- 减少往返次数
3. 压缩
Gzip:
http
Content-Encoding: gzipBrotli:
http
Content-Encoding: br压缩比: Brotli > Gzip > 无压缩
十、常见面试题
Q1: HTTP 和 HTTPS 的区别?
| 特性 | HTTP | HTTPS |
|---|---|---|
| 协议 | HTTP | HTTP + SSL/TLS |
| 端口 | 80 | 443 |
| 加密 | ❌ | ✅ |
| 证书 | 不需要 | 需要 |
| 性能 | 较快 | 较慢(握手开销) |
| SEO | 一般 | 更好 |
Q2: GET 和 POST 的区别?
| 特性 | GET | POST |
|---|---|---|
| 参数位置 | URL 查询字符串 | 请求体 |
| 参数长度限制 | 有限(URL 长度限制) | 无限制 |
| 安全性 | 参数暴露在 URL | 相对安全 |
| 缓存 | 可缓存 | 通常不缓存 |
| 幂等性 | ✅ | ❌ |
| 使用场景 | 查询数据 | 创建/修改数据 |
Q3: HTTP/2 的优势?
- 多路复用 - 一个连接处理多个请求
- 头部压缩 - 减少头部大小
- 服务器推送 - 主动推送资源
- 二进制分帧 - 更高效的解析
Q4: HTTPS 的加密过程?
- 客户端请求 HTTPS 连接
- 服务器返回证书(包含公钥)
- 客户端验证证书
- 客户端生成对称加密密钥,用公钥加密后发送
- 服务器用私钥解密,获得对称密钥
- 后续通信使用对称加密
Q5: Cookie 和 Session 的区别?
| 特性 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端 | 服务端 |
| 安全性 | 较低 | 较高 |
| 存储大小 | 有限(4KB) | 无限制 |
| 性能 | 每次请求都携带 | 需要服务端存储 |
十一、最佳实践
- ✅ 使用 HTTPS - 生产环境必须
- ✅ 合理使用缓存 - 提升性能
- ✅ 压缩响应 - 减少传输大小
- ✅ 使用 HTTP/2 - 提升性能
- ✅ 设置安全头 - 增强安全性
- ✅ Cookie 安全 - 使用 HttpOnly、Secure、SameSite
- ✅ CORS 配置 - 合理配置跨域
- ✅ 监控性能 - 关注加载时间
- ❌ 不要使用 GET 修改数据 - 违反语义
- ❌ 不要忽略安全头 - 防止攻击