Skip to content

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 - 设置 Cookie
  • Cache-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.1HTTP/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 资源

浏览器行为:

  • 阻止混合内容(默认)
  • 显示警告

解决方案:

六、Cookie 和 Session

设置 Cookie:

http
Set-Cookie: session=abc123; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=3600

Cookie 属性:

  • Path - Cookie 路径
  • Domain - Cookie 域名
  • Expires / Max-Age - 过期时间
  • HttpOnly - 禁止 JavaScript 访问
  • Secure - 仅 HTTPS 传输
  • SameSite - 防止 CSRF 攻击

SameSite 值:

  • Strict - 严格模式,完全禁止跨站
  • Lax - 宽松模式,允许 GET 请求
  • None - 允许跨站(需要 Secure)

2. Session

Session vs Cookie:

特性CookieSession
存储位置客户端服务端
安全性较低较高
存储大小有限(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: SAMEORIGIN

4. 其他安全头

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: gzip

Brotli:

http
Content-Encoding: br

压缩比: Brotli > Gzip > 无压缩

十、常见面试题

Q1: HTTP 和 HTTPS 的区别?

特性HTTPHTTPS
协议HTTPHTTP + SSL/TLS
端口80443
加密
证书不需要需要
性能较快较慢(握手开销)
SEO一般更好

Q2: GET 和 POST 的区别?

特性GETPOST
参数位置URL 查询字符串请求体
参数长度限制有限(URL 长度限制)无限制
安全性参数暴露在 URL相对安全
缓存可缓存通常不缓存
幂等性
使用场景查询数据创建/修改数据

Q3: HTTP/2 的优势?

  1. 多路复用 - 一个连接处理多个请求
  2. 头部压缩 - 减少头部大小
  3. 服务器推送 - 主动推送资源
  4. 二进制分帧 - 更高效的解析

Q4: HTTPS 的加密过程?

  1. 客户端请求 HTTPS 连接
  2. 服务器返回证书(包含公钥)
  3. 客户端验证证书
  4. 客户端生成对称加密密钥,用公钥加密后发送
  5. 服务器用私钥解密,获得对称密钥
  6. 后续通信使用对称加密
特性CookieSession
存储位置客户端服务端
安全性较低较高
存储大小有限(4KB)无限制
性能每次请求都携带需要服务端存储

十一、最佳实践

  1. 使用 HTTPS - 生产环境必须
  2. 合理使用缓存 - 提升性能
  3. 压缩响应 - 减少传输大小
  4. 使用 HTTP/2 - 提升性能
  5. 设置安全头 - 增强安全性
  6. Cookie 安全 - 使用 HttpOnly、Secure、SameSite
  7. CORS 配置 - 合理配置跨域
  8. 监控性能 - 关注加载时间
  9. 不要使用 GET 修改数据 - 违反语义
  10. 不要忽略安全头 - 防止攻击

基于 VitePress 构建 | Copyright © 2026-present