HTTP 与 HTTPS
问题
HTTP 和 HTTPS 有什么区别?HTTPS 是如何保证安全的?
答案
HTTP vs HTTPS
| 维度 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 安全性 | 明文传输 | TLS/SSL 加密 |
| 证书 | 不需要 | 需要 CA 证书 |
| 性能 | 快 | 多一次 TLS 握手 |
HTTP 请求方法
| 方法 | 语义 | 幂等 | 安全 |
|---|---|---|---|
| GET | 获取资源 | ✅ | ✅ |
| POST | 创建资源 | ❌ | ❌ |
| PUT | 全量更新 | ✅ | ❌ |
| PATCH | 部分更新 | ❌ | ❌ |
| DELETE | 删除资源 | ✅ | ❌ |
| HEAD | 获取响应头 | ✅ | ✅ |
| OPTIONS | 查询支持的方法(CORS 预检) | ✅ | ✅ |
常见状态码
| 状态码 | 含义 | 常见场景 |
|---|---|---|
| 200 | OK | 请求成功 |
| 201 | Created | 资源创建成功 |
| 301 | Moved Permanently | 永久重定向 |
| 302 | Found | 临时重定向 |
| 304 | Not Modified | 缓存未过期 |
| 400 | Bad Request | 请求参数错误 |
| 401 | Unauthorized | 未认证 |
| 403 | Forbidden | 无权限 |
| 404 | Not Found | 资源不存在 |
| 500 | Internal Server Error | 服务端错误 |
| 502 | Bad Gateway | 网关收到无效响应 |
| 503 | Service Unavailable | 服务不可用 |
| 504 | Gateway Timeout | 网关超时 |
TLS 握手过程
HTTPS = 非对称加密 + 对称加密
- 非对称加密(RSA/ECDHE):仅用于 TLS 握手阶段,安全交换密钥
- 对称加密(AES):用于后续数据传输,性能高
HTTP/1.1 vs HTTP/2 vs HTTP/3
| 特性 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 传输层 | TCP | TCP | QUIC (UDP) |
| 多路复用 | ❌ 串行 | ✅ 一个连接多个流 | ✅ 无队头阻塞 |
| 头部压缩 | ❌ | ✅ HPACK | ✅ QPACK |
| 服务器推送 | ❌ | ✅ | ✅ |
| 队头阻塞 | HTTP + TCP 层都有 | TCP 层仍有 | 完全解决 |
| 连接建立 | TCP + TLS (2-3 RTT) | TCP + TLS | 0-1 RTT |
常见面试问题
Q1: GET 和 POST 的区别?
答案:
| 维度 | GET | POST |
|---|---|---|
| 语义 | 获取资源 | 提交数据 |
| 参数位置 | URL Query String | 请求体 |
| 长度限制 | 浏览器限制 URL 长度(~2KB) | 无限制 |
| 缓存 | 可以缓存 | 默认不缓存 |
| 幂等性 | 幂等 | 非幂等 |
| 书签/历史 | 可以收藏 | 不能 |
从 HTTP 协议层面来说,GET 也可以带请求体,POST 也可以用 URL 参数,但不推荐。
Q2: HTTPS 能防止中间人攻击吗?
答案:
能,前提是证书验证正确。HTTPS 通过 CA 证书链验证服务端身份:
- 客户端验证证书是否由受信任的 CA 签发
- 验证证书域名与请求域名是否匹配
- 验证证书是否过期
如果用户忽略了浏览器的证书警告,或安装了恶意 CA 根证书,中间人攻击仍然可能。
Q3: HTTP Keep-Alive 是什么?
答案:
HTTP/1.1 默认开启 Keep-Alive(长连接),一个 TCP 连接可以发送多个 HTTP 请求/响应,避免每次请求都重新建立 TCP 连接。
通过 Connection: keep-alive 头部控制,Connection: close 关闭。
Q4: Cookie 和 Session 的区别?
答案:
| 维度 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端 | 服务端 |
| 安全性 | 较低(可被截获) | 较高 |
| 大小限制 | 4KB | 无限制 |
| 生命周期 | 由 Expires/Max-Age 控制 | 服务端配置超时时间 |
通常 Session ID 存在 Cookie 中,服务端通过 Session ID 查找对应的 Session 数据。
详见 分布式会话。