HTTPS与HTTP的区别

候选人小李在面试中回答HTTPS和HTTP的区别:

"HTTPS是HTTP的安全版本,多了加密和身份验证。"

面试官点点头:"那HTTPS具体多了哪些保护?"

小李说:"就是...那个TLS...加密传输?"

面试官追问:"HTTPS能防止什么攻击?不能防止什么攻击?"

小王开始支支吾吾...

HTTPS和HTTP的区别,看起来是个基础问题,但能把这个话题讲清楚的人其实不多。

今天我们就来把这个彻底讲清楚。

【直观类比】

明信片 vs 挂号信

HTTP就像寄明信片:

  • 邮递员可以看到内容
  • 任何中转站都能读取信息
  • 如果有人想偷看,轻而易举

HTTPS就像寄挂号信:

  • 信封密封,内容保密
  • 有收件人签名确认送达
  • 有密封戳证明未被拆开
  • 挂号信可以追溯寄件人

为什么是"挂号信"?

HTTPS提供的保护:

保密性:只有收件人能读(加密)
完整性:确保内容未被篡改(MAC)
认证:确认收件人身份(证书)
抗抵赖:发送方不能否认发送(数字签名)

核心原理

HTTP的四大缺陷

HTTP设计于1991年,当时的网络环境相对单纯,没有考虑安全问题:

graph LR
    A[浏览器] -->|HTTP明文| B[服务器]
    B -->|HTTP明文| A
    
    C[黑客] -.->|截获| B
    
    style C fill:#ff6b6b
缺陷问题后果
明文传输数据可以被中间人看到账号、密码、隐私泄露
无身份验证无法确认服务器身份钓鱼网站横行
无完整性保护数据可以被篡改植入广告、注入恶意代码
无抗抵赖发送方可以否认发送无法追责

HTTPS的五层保护

HTTPS在HTTP的基础上增加了五层保护:

┌─────────────────────────────────────┐
│  应用层:HTTP请求/响应               │
├─────────────────────────────────────┤
│  安全层:TLS记录协议                 │
│    ├─ 加密(Confidentiality)       │
│    ├─ MAC(Integrity)             │
│    └─ 序列号(Replay Protection)   │
├─────────────────────────────────────┤
│  握手层:TLS握手协议                 │
│    ├─ 密钥交换                     │
│    ├─ 服务器认证                   │
│    └─ 协商加密参数                 │
├─────────────────────────────────────┤
│  传输层:TCP                        │
├─────────────────────────────────────┤
│  网络层:IP                        │
└─────────────────────────────────────┘

HTTPS的具体保护

1. 保密性:数据加密

# HTTPS加密传输示例
# 假设用户登录
POST /login HTTP/1.1
Host: www.example.com

username=admin&password=Secret123

# 在HTTP下:任何人都能看到明文
# 在HTTPS下:只有服务器能解密

HTTPS使用混合加密

握手阶段:非对称加密传输对称密钥
传输阶段:对称加密传输实际数据

这样兼顾了安全(非对称)和性能(对称)。

2. 完整性:防篡改

# TLS的完整性保护
# 每个TLS记录包含MAC
record = {
    "content_type": 23,          # 应用层数据
    "sequence_number": 42,        # 序列号
    "content": encrypted_data,    # 加密内容
    "mac": HMAC(key, data)       # 消息认证码
}

# 接收方验证:
# 1. 解密内容
# 2. 用相同密钥计算MAC
# 3. 比对MAC,如果不同说明被篡改

3. 认证:服务器身份验证

证书链验证:
  用户浏览器 → 验服务器证书
  服务器证书 → 验中间证书
  中间证书 → 验根证书
  根证书 → 内置于浏览器/系统
  
域名验证:
  证书的SAN(Subject Alternative Name)必须包含访问的域名
  *.example.com 可以匹配 www.example.com

4. 抗抵赖:可追溯性

HTTPS的抗抵赖来自:
1. 服务器必须持有证书对应的私钥
2. 所有TLS握手的消息都有签名
3. 证书链可以追溯到可信CA

HTTPS的抗抵赖局限:
- 不能证明"用户确实发送了这条消息"
- 用户身份认证是应用层的责任(用户名密码、OAuth等)
- TLS只认证服务器,不认证客户端(除非用客户端证书)

HTTP的安全头

HTTPS还通过HTTP安全头来增强安全:

常见安全头

# 强制HTTPS
Strict-Transport-Security: max-age=31536000; includeSubDomains

# 防止XSS攻击
Content-Security-Policy: script-src 'self'

# 防止点击劫持
X-Frame-Options: DENY

# 防止MIME类型嗅探
X-Content-Type-Options: nosniff

# 引用源策略
Referrer-Policy: no-referrer

# 跨域策略
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin

HSTS:强制HTTPS

HSTS(HTTP Strict Transport Security)告诉浏览器:未来只能通过HTTPS访问:

# 首次访问 http://example.com
Strict-Transport-Security: max-age=31536000

# 一年后,用户访问 http://example.com
# 浏览器自动升级为 https://example.com
# 甚至不在本地解析DNS,直接发送HTTPS请求
💡

HSTS的坑:如果你的证书过期或配置错误,用户无法降级到HTTP访问,只能等待max-age过期。

HTTPS的性能代价

握手延迟

HTTP:
  TCP握手:1-RTT
  总计:1-RTT

HTTPS(TLS 1.2):
  TCP握手:1-RTT
  TLS握手:2-RTT
  总计:3-RTT

HTTPS(TLS 1.3):
  TCP握手:1-RTT
  TLS握手:1-RTT
  总计:2-RTT

对于延迟100ms的服务器:

  • HTTP:100ms
  • HTTPS(1.2):300ms
  • HTTPS(1.3):200ms

性能优化:让HTTPS和HTTP一样快

1. TLS会话恢复

# 首次握手后,服务器返回Session ID
client.session_id = "abc123"
client.session_key = master_secret

# 第二次连接
client_hello = {
    "session_id": "abc123"
}
# 服务器识别Session ID,复用之前的密钥
# 跳过密钥交换,握手从2-RTT降到1-RTT

2. 0-RTT恢复

# TLS 1.3的0-RTT
client_hello = {
    "psk": session_ticket,  # 预共享密钥
    "early_data": encrypted_request  # 首次请求立即加密
}
# 第一次网络往返就发送加密数据
# 但有重放攻击风险,需要业务层做幂等

3. OCSP装订

# 服务器提前获取OCSP响应
ocsp_response = ca.get_ocsp_response()

# 握手时附带OCSP响应
# 浏览器不需要额外查询

4. HTTP/2多路复用

HTTP/1.1:
  连接1 → GET /index.html
  连接2 → GET /style.css
  连接3 → GET /app.js
  
  每个连接都需要完整握手

HTTP/2:
  连接1 → GET /index.html
       → GET /style.css
       → GET /app.js
  
  同一个TLS连接传输所有请求
  只需一次握手

HTTPS的计算开销

加密解密:
  CPU开销 vs HTTP:约增加2-3%的CPU
  现代CPU的AES指令(AES-NI)可以忽略不计

内存:
  TLS连接需要更多内存存储会话状态
  连接复用可以减少内存使用

网络:
  TLS记录有额外的头部开销(约5-10字节/记录)
  证书链传输(几KB)
  可以忽略不计

结论:在现代硬件上,HTTPS的性能开销可以忽略不计。Google、Facebook等公司已经全面HTTPS化。

HTTPS的实际应用场景

场景1:登录页面

POST /login HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded

username=admin&password=SecretPass123

# HTTPS下:密码被加密,攻击者无法窃取
# HTTP下:密码明文传输,任何中转站都能看到

场景2:API接口

# 金融API
GET /api/v1/accounts
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
X-Request-Id: req-12345

# HTTPS下:Token和请求都被加密
# HTTP下:即使Token是无意义的JWT,窃取后可以重放

场景3:单页应用(SPA)

// 现代SPA通常强制HTTPS
if (location.protocol !== 'https:' && location.hostname !== 'localhost') {
  location.replace('https://' + location.href.split('://')[1]);
}

HTTP与HTTPS的边界

HTTPS不能防止什么?

HTTPS的保护范围(边界):
✅ 传输过程中的窃听(中间人攻击)
✅ 传输过程中的篡改(内容修改)
✅ 钓鱼网站的证书伪造(浏览器验证)

❌ 不能防止:
- 服务器被入侵(数据在服务器上是明文的)
- 客户端被恶意软件感染(本地解密)
- 社会工程学攻击(用户主动泄露密码)
- 服务端的数据泄露(数据库泄漏)
- 搜索引擎收录(robots.txt的锅)

HTTPS vs HTTP的SEO影响

Google明确表示:
1. HTTPS是排名因素之一
2. 使用HTTPS会获得轻微的排名提升
3. Chrome标记HTTP网站为"不安全"

实际影响:
- 排名提升幅度很小(<5%)
- 但用户信任度影响转化率
- 未来可能加强权重

常见误区

误区1:HTTPS是绝对安全的

错误。HTTPS只保护传输过程:

  • 服务器被黑 → 数据泄露
  • 浏览器被植入病毒 → 密码泄露
  • 用户被钓鱼 → 自己输入密码给骗子

HTTPS是安全方案的一部分,不是全部。

误区2:HTTPS比HTTP慢很多

错误。现代HTTPS的性能开销:

  • TLS 1.3握手只有1-RTT
  • AES硬件加速
  • HTTP/2多路复用

实测:性能差距在3%以内,可以忽略不计。

误区3:内网不需要HTTPS

错误。内网同样需要HTTPS:

  • 内网有更多的安全威胁
  • DNS污染、ARP欺骗在内网更常见
  • 未来微服务间通信也建议mTLS

误区4:有了CSP就不需要HTTPS

错误。CSP(内容安全策略)和HTTPS解决不同问题:

  • HTTPS:保护传输安全
  • CSP:防止XSS攻击、内容注入

两者需要配合使用。

误区5:HTTP/3不需要HTTPS

错误。HTTP/3基于QUIC协议,QUIC本身就是加密的,但浏览器默认要求验证证书。

HTTP/3与QUIC:下一代传输协议

QUIC协议简介

QUIC(Quick UDP Internet Connections)是Google在2012年提出的实验性协议:

HTTP/1.1 → HTTP/2:只升级了协议,头部没有加密
HTTP/2 → HTTP/3:换成了QUIC,强制加密

QUIC = HTTP/3的基础协议
- UDP传输(绕过TCP的握手延迟)
- 内置加密(每个QUIC包都加密)
- 0-RTT连接恢复

HTTP/3 vs HTTP/2

特性HTTP/2HTTP/3
传输层TCPUDP (QUIC)
握手TCP握手 + TLS握手QUIC握手(合并)
连接建立2-RTT+0-RTT~1-RTT
队头阻塞有(TCP层)无(QUIC层)
加密可选强制(每个包都加密)
移动网络需要新TCP连接切换时保持连接

为什么用UDP?

TCP的问题:
1. 握手延迟:TCP 1-RTT + TLS 1-RTT
2. 队头阻塞:一个包丢失,所有流都等
3. 拥塞控制:不同操作系统的实现不同

QUIC的解决方案:
1. 合并握手:TCP握手 + TLS握手 + HTTP握手 → 1-RTT
2. 流隔离:一个流丢包不影响其他流
3. 统一拥塞控制:用户空间实现,不依赖内核

记忆技巧

口诀

HTTP裸奔四十年,窃听篡改钓鱼全不管 HTTPS五层保护全:加密认证完整抗抵赖 TLS 1.3快如闪电,一RTT就握完 HTTP/3基于QUIC,UDP之上跑得欢

安全头速查表

安全头作用推荐值
HSTS强制HTTPSmax-age=31536000
CSPXSS防护配置内容源
X-Frame-Options防点击劫持DENY
X-Content-Type防MIME嗅探nosniff

实战检验

检验1:排查HTTPS问题

场景:用户报告"部分网站打不开"

排查思路

1. 检查TLS版本是否匹配(服务器是否支持TLS 1.3)
2. 检查证书是否过期
3. 检查证书链是否完整
4. 检查域名是否匹配
5. 用浏览器开发者工具查看握手详情

检验2:迁移到HTTPS

场景:公司决定全站HTTPS

迁移步骤

1. 申请证书(Let's Encrypt免费)
2. 配置HTTPS(nginx/apache)
3. 配置HSTS(强制跳转)
4. 更新内部链接(相对路径)
5. 更新CDN和第三方服务
6. 监控和回滚计划

检验3:HTTP/3部署

场景:想尝鲜HTTP/3

前提条件

1. 服务器支持QUIC(nginx-quic、caddy)
2. 客户端支持HTTP/3(Chrome、Firefox最新版)
3. 使用有效的HTTPS证书
4. 开放UDP端口443

注意:HTTP/3目前是可选功能,fallback到HTTP/2

【面试官心理】

面试官问HTTPS和HTTP的区别,其实是在测试你对"安全边界"的理解。知道HTTPS多了加密是60分,知道它具体防止哪些攻击是80分,知道HTTPS的局限性和不能防止什么攻击是90分,如果还能讲到HTTP/3和QUIC,那就是P7的水平了。


延伸阅读