HTTP 与 HTTPS¶
学习目标¶
学完本章后,学习者应该能够:
- 理解 HTTP 报文、Header、Cookie、Cache 和 CORS。
- 区分 HTTP/1.1、HTTP/2、HTTP/3 的核心差异。
- 理解 HTTPS、TLS 握手、证书、CA、SNI 和 mTLS。
- 能设计 Go HTTP 服务和客户端的基础超时策略。
HTTP 报文¶
HTTP 请求包含:
- 请求行:方法、路径、协议版本。
- Header:元信息。
- Body:请求体。
HTTP 响应包含:
- 状态行:协议版本、状态码。
- Header:元信息。
- Body:响应体。
后端工程师需要理解方法语义、状态码、Header 和 Body 的边界。
Header、Cookie、Cache、CORS¶
常见 Header:
Content-Type:请求或响应格式。Authorization:认证信息。User-Agent:客户端信息。X-Request-ID:请求追踪。Cache-Control:缓存策略。
Cookie 常用于浏览器会话,但服务端 API 不应该把认证、跨域、安全全部交给 Cookie 默认行为。
CORS 是浏览器安全策略,不是服务端之间调用的网络限制。
HTTP/1.1、HTTP/2、HTTP/3¶
| 版本 | 关键特点 |
|---|---|
| HTTP/1.1 | 长连接、管线化有限、文本协议 |
| HTTP/2 | 二进制分帧、多路复用、Header 压缩 |
| HTTP/3 | 基于 QUIC,改善部分队头阻塞问题 |
HTTP/2 常用于 gRPC。HTTP/3 基于 QUIC,依赖 UDP。
HTTPS 与 TLS¶
HTTPS = HTTP over TLS。
TLS 提供:
- 加密。
- 完整性保护。
- 服务端身份认证。
- 可选客户端身份认证。
证书由 CA 签发,客户端通过信任链验证服务端身份。SNI 让客户端在 TLS 握手时告诉服务端要访问哪个域名,方便同一 IP 承载多个证书。
mTLS 是双向 TLS,客户端也需要证书,常用于内部服务、零信任或高安全场景。
Go 后端实际应用例子¶
例子一:HTTP Server 设置超时¶
srv := &http.Server{
Addr: ":8080",
Handler: handler,
ReadHeaderTimeout: 2 * time.Second,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 60 * time.Second,
}
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
return err
}
不要直接使用没有超时配置的默认 Server 暴露公网服务。
例子二:给响应设置正确 Content-Type¶
func writeJSON(w http.ResponseWriter, status int, v any) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(status)
return json.NewEncoder(w).Encode(v)
}
Header 不是装饰,它会影响客户端如何解析响应、缓存响应和处理安全策略。
常见误区¶
- 误区一:HTTP 状态码随便返回 200 就行。
状态码是 API 契约的一部分。错误都返回 200 会破坏监控、重试和调用方判断。
- 误区二:CORS 是后端服务之间调用失败的原因。
CORS 是浏览器策略,后端服务直接调用不受浏览器 CORS 限制。
- 误区三:HTTPS 只要有证书就一定安全。
还要关注证书有效期、域名匹配、TLS 版本、私钥安全、mTLS 需求和中间代理配置。
线上问题案例¶
某服务证书过期后,浏览器和移动端全部访问失败。服务端业务日志没有明显错误,因为请求在 TLS 握手阶段就失败了。
修复方式是建立证书过期监控,自动续期,发布前检查证书链,并在网关层记录 TLS 握手失败指标。
实战任务¶
设计一个生产级 Go HTTP Server 的基础配置:
- 设置读取 Header 超时。
- 设置读写超时。
- 设置 Idle Timeout。
- 支持优雅退出。
- 说明为什么不直接用默认配置。
参考答案
可以使用 http.Server 显式配置 ReadHeaderTimeout、ReadTimeout、WriteTimeout 和 IdleTimeout。公网服务尤其要设置 ReadHeaderTimeout,避免慢速客户端长期占用连接。优雅退出可以监听 SIGTERM 后调用 Shutdown(ctx)。
不建议直接使用 http.ListenAndServe 的默认 Server 暴露公网服务,因为默认超时不完整,遇到慢连接、恶意请求或网络异常时,连接可能长期占用资源。
面试题¶
1. HTTP/1.1 和 HTTP/2 有什么区别?¶
参考答案
HTTP/1.1 是文本协议,支持长连接,但同一连接上的并发能力有限。HTTP/2 使用二进制分帧,支持多路复用和 Header 压缩,能在一个连接上并发多个请求。
gRPC 默认基于 HTTP/2,因此理解 HTTP/2 对理解 gRPC 很重要。
2. TLS 证书解决什么问题?¶
参考答案
TLS 证书用于证明服务端身份,并建立加密通信。客户端通过 CA 信任链验证证书是否由可信机构签发、域名是否匹配、证书是否过期。
证书不能保证业务没有漏洞,但能防止很多中间人攻击和明文泄露风险。
3. 什么是 mTLS?¶
参考答案
mTLS 是双向 TLS。普通 HTTPS 通常只验证服务端证书,mTLS 同时要求客户端也提供证书,服务端验证客户端身份。
它常用于内部服务调用、零信任网络、高安全 API 和服务网格场景。